$(document).ready() запускается сразу для контекста window.open()

Я пытаюсь выполнить операции над DOM всплывающего окна, но по какой-то причине ready событие запускается сразу для всплывающего окна, прежде чем что-то появится в DOM.

Я знаю, что jQuery может получить доступ к DOM всплывающего окна, используя контекст, и что я могу сделать это, используя setTimeout отложить любое действие, пока не пройдет разумное количество времени.

http://jsfiddle.net/GVcjn/

(function ($) {
    $(function () {
        var popup = window.open('/test');
            // JSFiddle 404 page

        $(popup.document).ready(function () {
            // Should fire when the DOM of the 404 page has loaded...

            $('h2', popup.document).css('color', '#FF0000');
                // Change the color of the header to red.

            console.log($('h2', popup.document).length);
                // Should log 1
                // Logs 0, though, because this function fires immediately, before the DOM loads.
        });

        setTimeout($.proxy(function () {
            // This will definitely fire after the DOM of the 404 page is loaded.

            var popup = this;
            $('h2', popup.document).css('text-decoration', 'underline');
                // This works, because it waited long enough.
                // But I don't want to guess how long it will take the DOM to load....
        }, popup), 5000);
            // After 5 seconds...
    });
})(jQuery);

Кроме того, я знаю, что это не вина JQuery. Если я добавлю console.log(popup.document.readyState); незамедлительно после var popup = window.open('/test');печатает complete, Но почему?

Любой совет?

Спасибо!

1 ответ

Решение

Вы пробовали это?

popup.onload = function () {
  //lot of things
};

При загрузке jQuery, согласно документации, http://api.jquery.com/load-event/ это:

$(popup).load(function() {
  // things
});

Этот вопрос также отвечает на что-то похожее: как я могу получить доступ к dom-дереву дочернего окна? Надеюсь, это поможет вам

Другие вопросы по тегам