Архивировано

Эта тема находится в архиве и закрыта для публикации сообщений.

Akira

Хелп с JS

Рекомендованные сообщения

<script>
function start() {

var frm = document.createElement("IFRAME");
frm.setAttribute("onLoad", "alert('what a fuck')");
document.body.appendChild(frm);

}
</script>

<a href="java script:void(0)" onClick="start()">WHAT A F... ?</a>

 

<script>
function start() {

var frm = document.createElement("IFRAME");
frm.setAttribute("id", "FRM");
document.body.appendChild(frm);
document.getElementById("FRM").setAttribute("onLoad", "alert('what a fuck')");
}
</script>

<a href="java script:void(0)" onClick="start()">WHAT A F... ?</a>

 

<script>
function start() {
var div = document.getElementById('DIV');
div.innerHTML = '<iframe onLoad="alert(\'shirt\')"></iframe>';
}
</script>

<div id="DIV"></div>
<a href="java script:void(0)" onClick="start()">WHAT A F... ?</a>

 

В любом из случаев во всех броузерах кроме IE onLoad срабатывает в тот момент, когда я его навешиваю а причем любым способом и неважно навешиваю я после того как добавлю в ДОМ или после. Пробовал через:

 

addEventListener\attachEvent не работает в Safari но имеет тот же баг

frm.onload = function () { ... } который не работает в IE но имеет тот же баг

setAttribute("onLoad", "...") работает везде но тот же баг

 

Вобщем я хз че делать, бесит

 

Нашел только такое решение

 

<script>
isMSIE = /MSIE/.test(navigator.userAgent);

function start() {

var frm = document.createElement("IFRAME");
frm.setAttribute("id", "myframe");
frm.setAttribute("onLoad", "check()");

document.body.appendChild(frm);
}

function check() {
var iframe = document.getElementById('myframe');
var iDoc = (isMSIE) ? iframe.document : iframe.contentDocument;
if (iDoc.body.innerHTML) alert("real load");
}

function setSrc() {
var iframe = document.getElementById('myframe');
iframe.src = "test2.html";
}
</script>

<a href="java script:void(0)" onClick="start()">WHAT A F... ?</a>
<a href="java script:void(0)" onClick="setSrc()">AAAnd ?</a>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так, давай разбираться :)

 

Сначала уясним, что твой код _ужасно_корявый_, и удивительно, что он вообще где-нить работает

 

Начнём с самой вызывающей и ламерской

 

<a href="java script:void(0)" onClick="start()">WHAT A F... ?</a>

Эта строка реальнэ whatafuck

А точнее, протокол java script: написан не правильно, через пробел

Как нигде Java Script не писали писать так не надо, не заработает...

Этот протокол считается устаревшим, морально неправильным и признаком плохого тона

Но в некоторых ситуациях он уместен, и даже очень оптимален, но тем не менее, делать так, как написано у тебя -- неверно

Более лучший способ - написать в хрефе шарп, но и это тоже не очень правильно. Намного лучше вызов ф-ции start перенести как раз в href ссылюшечки, то есть довести до этого:

java script:start();

 

А вообще, очень хороший тон - разделять html, css и js... Ну ладно, мечты, мечты

 

Посмотрим на объявление о скрипте, а точнее, скажем, что там две ошибки

 

<script>

Во-первых, всегда надо писать type="text/javascript", не потому, что браузеры такие тупые, что не смогут понять, что это за скрипт (хотя они жабу только и интерпретируют, кроме IE), а потому, что это строго оговорено стандартами

Во-вторых, тело скрипта, которое написано не в html, а в совершенно другом ему языке надо писать

<!--
//-->

Иначе, не смотря на понимание браузеров, как бы то ни было, содержимое тэга script будет никаким не JS, а вовсе -- HTML

 

Далее

 

В качестве отступов надо ставить не кучку пробелов, а табуляции -- хороший тон

Пробелы неверны в жабе как отступы, они имеют строго ограниченную ширину, а значит будут просто заполнять собою код, а не делать то, что ты хочешь -- отступать, а то бишь -- табулировать

 

 

Переходим к оптимизации, то есть к не очень грубым ошибкам

 

function start() {

var frm = document.createElement("IFRAME");
frm.setAttribute("onLoad", "alert('what a fuck')");
document.body.appendChild(frm);

}

Я уже не говорю про то, что функция -- такой же объект, как и все константы/переменные, и их объявлять следует ни как иначе, как

window.foo=function(){
//
}

Тэги большими буквами -- это девяностые, в XML, а о нём мы как раз и говорим, тэги scRipt и script -- __абсолютно__разные__

И в стандартах прописаны тэги, и они не большими буквами, регистр строго оговорён

Тэг div существует, а тэга DIV нет

 

Хоть и iframe не является стандартным тэгом, то есть его как бы и нет, но это ещё один раз, когда я настойчиво иду против стандартов и буду их нарушать, когда мне нужен будет iframe, что бы там Господа не понаписюкали

 

var когда идёт присвоение, а не определение переменной, вещь очень лишняя, ежу понятно, что это переменная

 

Это нисколько не критично, но ты извини, я буду писать в коде знаки равенства без пробелов между левой и правой частью... Тебе тоже советую. Ещё раз, это не ошибка. Так можно, если хочешь

 

frm.setAttribute("onLoad", "alert('what a fuck')"); -- а вот это уже очень серьёзно

onLoad -- НЕ АТРИБУТ, это даже НЕ СОБЫТИЕ, это html`овский атрибут тэга, но это никак не аттрибут нода DOM, когда ты их пишешь с помощью createElement();

Эту строку - фтопку

 

document.body.appendChild(frm); -- интерпретатор делает то, что ты хочешь, и на самом деле событие load срабатывает, но ты его не ловишь

Ты попытался установить html`овский атрибут тэга, а html __описывает__DOM__, и никак иначе

JS ___не___может____ описывать html. Он работает только с DOM, даже если пишет в innerHTML, он пишет в свойство нода, хоть и HTML пишет, но он с тем, что ты туда хочешь запихнуть не связан ни коем образом

 

function start() {
var frm = document.createElement("IFRAME");
frm.setAttribute("id", "FRM");
document.body.appendChild(frm);
document.getElementById("FRM").setAttribute("onLoad", "alert('what a fuck')");
}

Это не поддаётся осмыслению, во второй строчке функции ты присваешь ноду id, это можно было бы понять, если бы была бы цель обратиться к экземпляру элемента когда-нибудь потом в CSS, например

Но если ты делаешь это только из-за того, что хочешь обратиться к нему буквально через строчку... Отъебон выходит...

Функция appendChild возвращает ссылку на экземпляр элемента, то бишь, что бы обратиться к готовому фрейму тебе достаточно было всего лишь написать

rdyfrm=document.body.appendChild(frm);
rdyfrm.и делай ты с ним, что хочешь

 

	var div = document.getElementById('DIV');
div.innerHTML = '<iframe onLoad="alert(\'shirt\')"></iframe>';

Подход работающий, но, к сожалению, не-псевдоООПшный, следовательно, не подходящий

 

Дело в том, что IE addEventListener, абсолютно верный, не понимает, что бы ты с ним ни делал

Он понимает только attachEvent, с немного другим синтаксисом, но уже абсолютно нестандартный, и понимает его только Он

И да, синтаксис addEventListener(event,foo,хуйнякакаято) подразумевает передачу во втором аргументе НЕ СТРОКУ, А ФУНКЦИЮ

Ты же передаёшь check() как строку, и нифига не функцию

Правильно -- addEventListener(event,check(),хуйнякакаято);

И не надо никаких кавычек, передаёшь ФУНКЦИЮ

ФУНКЦИЯ -- ОБЪЕКТ

 

А

[code]isMSIE = /MSIE/.test(navigator.userAgent);

[/code]

немного бажнутый и не самый оптимальный и короткий

 

То, что ты используя всё это _наворотил_ я даже разбирать не буду

 

Встречай, новый, работающий везде, правильный код

 

<script type="text/javascript">
/**
* @author dbanet.inc
* @preserve GNU GPLv3
*/
window.onload=function(){   
frm=document.createElement("iframe");
temp="load\",function(){alert('what a fuck')},false);";
eval("\v"=="v" ? 'frm.attachEvent("on' + temp : 'frm.addEventListener("' + temp);
frm=document.body.appendChild(frm);
}
</script>

 

Надеюсь, подстроишь под себя, я не знаю, как у тебя была цель изначально, по-моему, разобраться с DOM`ом

 

И да, коронный вопрос: почему ты пишешь об этом в ФОРУМ ПРОВАЙДЕРА, а не на специализированные проекты?? xD

 

UPD:

 

Извиняюсь, про "java script:" я нагнал, это ДВИЖОК ФОРУМА ПРОБЕЛ СТАВИТ!!

 

КАК И ТАБЫ ЗАМЕНЯЕТ НА КУЧКУ ПРОБЕЛОВ

ДАЖЕ В "КОДЕ"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это жесть xD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

dbanet, функции с матом запрещены правилами форума, а так неплохо:D.

 

Правильно -- addEventListener(event,check(),[цензура]);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Давайте не будем п[цензура] педантами, и не будем следовать этим ё[цензура] правилам в таком, м[цензура], огромном количестве, что убирать мат придётся даже в javascript xDD

 

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прочел, и понял что читал ты невнимательно, я прекрасно знаю что

 

- IE работает с АддИвентЛистенер, я это написал в своем посте

- Теги я аппер регистром пишу для своего личного удобства

 

Вот это я пытался сделать только потому что думал что это возымеет действие, это был пробный варант я просто пытался взять элемент заного не используя уже тот что в объекте фрейм

 

function start() {
var frm = document.createElement("IFRAME");
frm.setAttribute("id", "FRM");
document.body.appendChild(frm);
document.getElementById("FRM").setAttribute("onLoad", "alert('what a fuck')");
}

 

Далее

 

isMSIE = /MSIE/.test(navigator.userAgent);

немного бажнутый и не самый оптимальный и короткий ?? Объясни на примере чем и где ? Работвает безошибочно во всех версиях броузеров, в чпем баг ??

 

Далее

 

Теперь с кодом, проблема следующая была и боюсь ты ее не решил.

 

Как только я делаю аппенд чайлд фрейма в документ у него срабатывает событие онлоад сразу же, мне нужно что бы оно срабатывало только после того как я в этот фрейм загружу контент - в теории делаеться через документ рэди, о чем я узнал недавно, но кроссбраузерный код охренительно длинный, поэтому пришлось выдумывать затычки и ненадо было мне объяснять что примеры которые я привел сильно кривые, но тем неменее спасибо за некоторый ликбез. А именно спецификацию прописывания тегов в ЖС

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах