| 
 Не срабатывает обработчик window.onload. Привет  Всем,  я новичок в JavaScript и не могу разобраться с одной проблемой. Подскажите, пожалуйста, в чем может быть дело. Есть код (плагин для Google Chrome): 
if (window.top.onload)
   {
        var existingOnload = null;
        existingOnload = window.top.onload;
        window.top.onload = function (ev) {  // сюда не попадаем...      
             if (existingOnload) { existingOnload(ev); }
             setTimeout( Plugin.init , 1);        
        };
   }
   else
   {
        Plugin.init();
   }
На некоторых страницах (например, http://maps.yahoo.com/) срабатывает ветка if (window.top.onload), но не срабатывает функция 
window.top.onload = function (ev) {        
             if (existingOnload) { existingOnload(ev); }
             setTimeout( Plugin.init , 1);        
};
Почему такое может быть? Не инициируется событие onload? На странице http://maps.yahoo.com/ имеется javascript код: window.onload=YAHOO.Maps.loaded; ... но по идее должен выполниться он, а затем мой Plugin.init(); Тем не менее упраление не попадает в мою функцию window.top.onload = function (ev) {...}. Ветка if (window.top.onload) добавлена в связи с тем, что на некоторых сайтах javascript в window.onload выполняет такой код: 
objects = document.getElementsByTagName("object");
	for (var i = 0; i < objects.length; i++)
	{
		objects[i].outerHTML = objects[i].outerHTML;
	}
Моя цель сделать так, чтобы этот код отработал РАНЬШЕ моего вызова Plugin.init. Заранее благодарен! Environment: Windows XP SP3 Google Chrome 4.0.249.30 | 
| 
 Цитата: 
 гляньте темутему, чтобы посмотреть как определить состояние загруженности страницы, если оно уже наступило Цитата: 
 | 
| 
 Я совсем новичок в JavaScript... я сделал так: 
if (window.top.onload) {
     Utils.debug_console_write('case_1 begin');
     var existingOnload = null;
     existingOnload = window.top.onload;
     window.top.onload = function (ev) {   
          Utils.debug_console_write('function (ev) begin');     
          if (existingOnload) { existingOnload(ev); }
          setTimeout( Plugin.init , 1);        
          Utils.debug_console_write('function (ev) end');     
     };
      Utils.debug_console_write('case_1 end');
} else {
   Utils.debug_console_write('case_2 begin');
   Plugin.init();
}
//added your code
var readyBound = false;
var bindReady=function(){
    if ( readyBound ) return;
    readyBound = true;
 
    // Mozilla, Opera and webkit nightlies currently support this event
    if ( document.addEventListener ) {
        // Use the handy event callback
        document.addEventListener( "DOMContentLoaded", function(){
            document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
            ready();
        }, false );
 
    // If IE event model is used
    } else if ( document.attachEvent ) {
        // ensure firing before onload,
        // maybe late but safe also for iframes
        document.attachEvent("onreadystatechange", function(){
            if ( document.readyState === "complete" ) {
                document.detachEvent( "onreadystatechange", arguments.callee );
                ready();
            }
        });
 
        // If IE and not an iframe
        // continually check to see if the document is ready
        if ( document.documentElement.doScroll && window == window.top ) (function(){
            if ( isReady ) return;
 
            try {
                // If IE is used, use the trick by Diego Perini
                // [url]http://javascript.nwbox.com/IEContentLoaded/[/url]
                document.documentElement.doScroll("left");
            } catch( error ) {
                setTimeout( arguments.callee, 0 );
                return;
            }
 
            // and execute any waiting functions
            ready();
        })();
    }
 
    // A fallback to window.onload, that will always work
    if (window.addEventListener)
        window.addEventListener('load', ready, false);
    else if (window.attachEvent)
        window.attachEvent('onload', ready);
    else
        window.onload=ready;
}
/////------------------------------------------------
var    isReady=false;
var    readyList= [];
    // Handle when the DOM is ready
var ready=function() {
        // Make sure that the DOM is not already loaded
        if ( !isReady ) {
            // Remember that the DOM is ready
            isReady = true;
 
            // If there are functions bound, to execute
            if ( readyList ) {
                // Execute all of them
                var fn_temp=null
                while(fn_temp=readyList.shift()){
                    fn_temp.call( document);
                }
 
                // Reset the list of functions
                readyList = null;
            }
 
            // Trigger any bound ready events
            //jQuery(document).triggerHandler("ready");//???
        }
    }
/////------------------------------------------------
domReady=function(fn) {
        // Attach the listeners
        bindReady();
 
        // If the DOM is already ready
        if ( isReady )
            // Execute the function immediately
            fn.call(document);
 
        // Otherwise, remember the function for later
        else
            // Add the function to the wait list
            readyList.push( fn );
 
        return this;
    }
domReady(function(){
   alert('OK');
});
Utils.debug_console_write - вспомогательная функция для вывода логов. Chrome плагин подгружает этот скрипт на страничку на которую я захожу. Результаты получились такие: 
 | 
| 
 Цитата: 
 | 
| 
 Очень нужен совет! | 
| 
 да фиг его знает если вам ничего не помогло из моих советов, то остальное без попытки отладить самому ваш код под хромом кажется гаданием по кофейной гуще | 
| 
 А вот с помощью этой функции domReady можно проверить, что все обработчики onload, которые определены на сайте уже отработали? Или она проверяет, что DOM загружен? | 
| 
 А Вы пробовали проверить ? 
if (typeof Plugin != 'undefined')
{
    setTimeout( Plugin.init , 1);
}
Поясню свою мысль: если код плагина загружается внутри iframe, то у него область видимости iframe. Соответственно, нужно вызвать его изнутри iframe, а функция, замещающая onload вызывается в контексте window.top - главного окна. Попробуйте использовать замыкание и apply при установке таймера: 
if (window.top.onload)
   {
        var existingOnload = null;
        existingOnload = window.top.onload;
        var self = this;
        window.top.onload = function (ev) {  // сюда не попадаем...      
             if (existingOnload) { existingOnload(ev); }
             setTimeout( 
                 function(){
                     Plugin.init .apply(self, arguments);
                 }, 
                     1
             );        
        };
   }
   else
   {
        Plugin.init();
   }
 | 
| 
 Попробовал - не сработало - не попадаю я в обработчик (например, на сайте maps.yahoo.com). Я вообще не уверен, правильно ли писать "if (window.top.onload)" - ведь я могу зайти на любой сайт, и заранее не известно будут ли там фреймы... | 
| 
 На будущее мой Вам совет: если задаете вопрос, то приводите в примере кода только тот код, который касается исключительно непосредственно задаваемого вопроса. Так Вы сэкономите массу времени тем, кто читает ваши посты. Мне кажется ответ на вопрос очень прост. Google Chrome расширения загружаются на страницу уже после того как загружен основной документ и случилось событие onLoad документа. То есть Вам надо писать Ваш код просто в глобальном контексте расширения и не усложнять себе жизнь какими-то таймаутами, обработчиками и тд. | 
| Часовой пояс GMT +3, время: 19:34. |