iframe поведение onload против addEventListener ('load'))
Я играл с добавлением скрытых элементов iframe на страницу, и я хочу манипулировать DOM из них после загрузки. Я заметил, что я не могу начать манипулировать DOM сразу после добавления iframe на страницу, так как он еще не загружен. Это не может быть сделано с DOMContentLoaded
событие, так как это срабатывает против документа, который не существует в iframe, пока он не будет добавлен на страницу, поэтому мы должны использовать load
событие.
вот некоторые испытания код:
var iframe = document.createElement('iframe');
iframe.onload = function() { console.log('loaded!'); };
document.getElementsByTagName('body')[0].appendChild(iframe);
это работает, как ожидалось, однако, когда я изменить его на addEventListener
он даже не добавляется в DOM:
var iframe = document.createElement('iframe');
iframe.addEventListener('load', function() { console.log('loaded!'); });
document.getElementsByTagName('body')[0].appendChild(iframe);
Я не проверял attachEvent
в IE.
кто-нибудь пролить свет на это?
3 ответов
это работает для меня:
HTML-код:
iframe source code: <br />
<textarea id="output" rows="20" cols="60">loading ...</textarea>
javascript (на documentReady):
var iframe = document.createElement('iframe');
iframe.id = iframe.name = "testframe";
iframe.src = "http://fiddle.jshell.net";
iframe.width = 400;
iframe.height = 100;
iframe.style.display = "none";
if (iframe.addEventListener)
iframe.addEventListener("load", loaded, false);
else
iframe.attachEvent("onload", loaded);
function loaded() {
var html;
if (iframe.contentDocument)
html = iframe.contentDocument.getElementsByTagName("HTML")[0].innerHTML;
else
html = window.frames[iframe.name].document.getElementsByTagName("html")[0].innerHTML;
document.getElementById("output").value = html;
}
document.getElementsByTagName("body")[0].appendChild(iframe);
смотрите демо по адресу:http://jsfiddle.net/WcKEz/
работает с addEventListener, но включает запасной вариант для attachEvent. Доступ к DOM IFRAME, конечно, только в том же домене.
первый пример работает? Не уверен, что именно вы ищете, но это должно освещать, когда события работают: документ jQuery.готовый источник
$(документ).готовый эквивалент без jQuery
addEventListener не работает в IE, поэтому, если это то, где вы тестируете, то 2-й потерпит неудачу до добавления iframe.
вы также можете добавить обратный вызов с самой страницы (например, используя jQuery, чтобы вы не reinvent the wheel) подозреваю $(iframe).ready() {..}
даст вам последовательное поведение.