@naveen onload гораздо ближе к тому, о чем он спрашивал еще до того, как отредактировал вопрос. OnDomReady будет срабатывать, как только HTML-код страницы загружен и проанализирован, что не означает полную загрузку страницы. Однако onload будет ожидать загрузки всех ресурсов на странице, таких как изображения, CSS-файлы и JavaScript. Он даже будет ждать загрузки файлов flash и silverlight, но не будет ждать, пока они будут выполнены, это невозможно без специального кода внутри flash или silverlight. То же самое касается Аякса.

твует ли определенный метод JavaScript для проверки, полностью ли загружена веб-страница? Полностью, что означает 100% завершено. HTML, скрипты, CSS, изображения, плагины, AJAX, все!

Поскольку взаимодействие с пользователем может повлиять на AJAX, давайте предположим, что никакого дальнейшего взаимодействия пользователя со страницей, кроме начального запроса страницы, больше нет.

 jnthnclrk08 июл. 2011 г., 12:46
Хотелось бы стандартное решение JavaScript не-JQuery.
 jnthnclrk15 июл. 2011 г., 12:28
Мне нравится решение, которое будет работать для страниц, которые я не контролирую.
 Pekka 웃31 мая 2011 г., 18:43
"полностью" означает что именно? Просто DOM, или также изображения, таблицы стилей CSS ...?
 jnthnclrk31 мая 2011 г., 19:04
Полностью, что означает 100% завершено. HTML, скрипты, CSS, изображения, плагины, все!

Ответы на вопрос(7)

которую я написал в сценарии, используя события при загрузке. В этом случае я запускаю события при загрузке скрипта js, так как это моя функция автозагрузчика js, но вы можете просто добавить событие для других элементов, используя тот же принцип. При условии, что этот скрипт выглядит после загрузки js-скриптов в выделенномДИВ тег.

function scriptLoaded(e) {
    var oLoadedScript = e.target || e.srcElement;
    alert ('loaded : ' + oLoadedScript.src);
    return false;
}

/**
 * Import js lib and fire function ControlData on events
 * @param js_librairies
 * @returns {Boolean}
 */
function init(){

    // lib import
    // Locate js in the div
    var myscript_location = document.getElementById('js_script_goes_here');


    // DEBUG
    if (undefined == myscript_location)
            alert('div not found');
        else
            alert('found div : ' + myscript_location);

 // to prevent js script from catching in dev mode
    var force_js_reload = "?version=1" ;

    for (var i=0; i < js_librairies.length ; ++i) {
        var my_script = document.createElement('script');
        my_script.defer = false;
        my_script.src = relative_path + js_librairies[i] + force_js_reload ;
        my_script.type = 'text/javascript';
        // DEBUG
        my_script.onload = scriptLoaded;

        myscript_location.appendChild(my_script);

    }
    return false;
}

/**
 * Start non intrusive js
 * @param func
 */
function addLoadEvent(func) {
      var oldonload = window.onload;
      if (typeof window.onload != 'function') {
        window.onload = func;
      } else {
        window.onload = function() {
          if (oldonload) {
            oldonload();
          }
          func();
        };
      }
}


//ONLOAD
addLoadEvent(init);
 hornetbzz13 июл. 2011 г., 23:38
@Jani: предупреждение было только для целей отладки и объяснения. Вы можете переместить это, добавив div и добавив его с текстовым узлом msg, или просто прокомментировать строку обратного вызова (вот почему это просто прокомментировано выше как «DEBUG»).
 Jani Hartikainen13 июл. 2011 г., 20:11
Так какая часть этого является ненавязчивой частью? Я вижу функции в глобальном пространстве имен,alert()х, он даже перезаписывает любойwindow.onload обработчики другой код мог установить ...

но я бы предложил не использовать window.onload, а:

if (window.addEventListener) {
    window.addEventListener("load", myfunction, false);
} else {
    window.attachEvent("onload", myfunction);
}

function myfunction() {
   ...
}
 jnthnclrk09 июл. 2011 г., 13:37
Будет ли это обрабатывать, AJAX, Flash и Silverlight?
 roberkules09 июл. 2011 г., 20:32
что вы подразумеваете под ajax? это точно такое же событие, какwindow.onload, поскольку ajax можно вызывать задолго после загрузки страницы (и она асинхронна по своей природе), «загрузка» ajax-запроса не является частью события onload. если вы выполняете ajax-запрос уже во время загрузки страницы, вы должны добавить один слушатель к событию window.load и один к событию завершения ajax ... установите глобальный флаг в обоих слушателях и проверьте, был ли запущен другой слушатель , если нет, ничего не делайте, кроме установки флага.
function r(f){/in/(document.readyState)?setTimeout(r,9,f):f()}

Самый маленький DOMReady код, когда-либо - Дастин Диаз

Обновление: и для IE

function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}

P.S:window.onload это совсем другая вещь

 Ilya Volodin09 июл. 2011 г., 20:17
Это реализация onDomReady. OnDomReady запускается, как только HTML-тег страницы полностью загружается и анализируется браузером. Он не заботится об изображениях, файлах CSS или файлах JavaScript, которые встроены в страницу, так что это совсем не то, о чем спрашивал автор. И нет, он не будет обрабатывать AJAX, Flash и Silverlight. Там нет никакого способа справиться с этим вообще. Даже событие Onload не будет правильно обрабатывать их, если вы не добавите пользовательские события в свой код flash / silverlight.
 Pointy31 мая 2011 г., 19:15
К сожалению, трюк "регулярное выражение является функцией" не работает в IE.
 naveen10 июл. 2011 г., 06:46
@ Илья Володин: я не мечтатель. Я не видел ничего о Flash, Ajax или Silverlight до 17 часов назад. Вопрос был отредактирован. Я надеюсь, что вы проголосовали заonload также
 Ilya Volodin13 июл. 2011 г., 05:33
@naveen onload гораздо ближе к тому, о чем он спрашивал еще до того, как отредактировал вопрос. OnDomReady будет срабатывать, как только HTML-код страницы загружен и проанализирован, что не означает полную загрузку страницы. Однако onload будет ожидать загрузки всех ресурсов на странице, таких как изображения, CSS-файлы и JavaScript. Он даже будет ждать загрузки файлов flash и silverlight, но не будет ждать, пока они будут выполнены, это невозможно без специального кода внутри flash или silverlight. То же самое касается Аякса.
 jnthnclrk09 июл. 2011 г., 13:37
Будет ли это обрабатывать, AJAX, Flash и Silverlight? IE не так важен для меня.

:

window.

Событие сработает в этой точке.

 Pointy31 мая 2011 г., 18:46
Да, хотя, строго говоря, это событие «load», а «onload» - это имя свойства объекта «window» для обработчика событий :-)
 jnthnclrk08 июл. 2011 г., 17:05
Будет ли это обрабатывать, AJAX, Flash и Silverlight?
 ADW31 мая 2011 г., 18:49
Да, в самом деле... :-)
 ADW08 июл. 2011 г., 17:26
Не уверен, что я понимаю ваш вопрос - он не будет обрабатывать AJAX, так как контент AJAX обычно загружается «после» загрузки страницы - вам придется формально ждать вечно, поскольку у браузера нет возможности узнать, будет ли больше контента загружен с AJAX. Он будет ждать, пока загрузится флэш-контент и т. Д., Но не будет ждать, пока они сделают то, что они собираются сделать (что может загружать больше контента!).
 ADW11 июл. 2011 г., 10:24
Я не думаю, что такое решение может существовать. Вам нужно будет сообщить коду, что ваш AJAX мог загружать и когда он мог загружаться. Например, если при «нормальной» загрузке страницы вы устанавливаете таймер для загрузки большего количества контента через AJAX через 10 минут, вы не можете ожидать, что универсальный метод сможет сообщить, что произойдет, если он не будет глубоко интегрирован с вашим сайтом. Рад, что кто-то еще может показать мне, как это будет сделано в общем виде.

window.onload, document.readyStateи обратные вызовы для запросов AJAX, вы должны иметь возможность делать то, что вы хотите. Просто убедитесь, что окно загружено, DOM готов к манипуляциям и отслеживайте запросы AJAX.

В частности, для AJAX, в зависимости от того, сколько запросов вы делаете: увеличивайте переменную каждый раз, когда вы делаете запрос, и когда переменная=== общее количество запросов, запустить функцию. Если вам не известно количество запросов AJAX, но вы знаете, какой из них будет последним, просто вызовите функцию обратного вызова, когда она завершится.

Когда все установлено и имеет значение true, запустите последнюю функцию, чтобы делать то, что вы хотите, зная, что все должно быть загружено.

Что касается приложений Flash и Silverlight (не уверен, еслиwindow.onload или жеdocument.ready отслеживает их), вы также можете записать объем данных, загруженных с приложением, и когда загруженные данные=== итоговые данные, приложение запускает функцию или увеличивает переменную на странице.

window.onload = function() {
    var time = window.setInterval(function() {
     if(document.readyState == "interactive") { 
         increment(); 
         window.clearInterval(time);
     }
    }, 250);
}

var total = 10, current = 0;
var increment = function() {
    current += 1;
    if(current === total) { weAreDone(); }    
}

function weAreDone() {
    // Everything should be done!
}
 jnthnclrk15 июл. 2011 г., 12:27
У меня нет контроля над страницей, поэтому я не уверен, что смогу добавить обратные вызовы в AJAX и другие плагины. Мне нравится звук записи объема данных для данной страницы и последующего измерения. Есть ли функции JavaScript для этого?
window.onLoad = function(){
    //Stuff to do when page has loaded.
}

или же

<body onLoad="functionCall()">
 jnthnclrk09 июл. 2011 г., 13:35
Будет ли это обрабатывать, AJAX, Flash и Silverlight?
Решение Вопроса

что вы просите, практически невозможно. Нет способа определить, все ли загруженополностью, Вот почему:

На многих веб-страницах AJAX запускается только послеonload (или жеDOMReady) событий, что делает метод использованияonload событие, чтобы увидеть, загрузилась ли страница, невозможно.Вы можете теоретически определить, выполняет ли веб-страница запрос AJAX, переопределивwindow.XMLHttpRequest, но вы все еще не могли определить, загружались ли плагины, такие как Flash, или нет.На некоторых сайтах вродеTwitter.comстраница загружается только один раз и просто отправляет AJAX-запросы на сервер каждый раз, когда пользователь щелкает ссылку. Как узнать, закончилась ли загрузка страницы на такой странице?Фактически, сам браузер не может быть полностью уверен, полностью ли загружена страница, или он собирается делать больше запросов AJAX.

Единственный способ узнать наверняка, что все загружено - это иметькаждый кусок кода на странице, которая загружает что-то, скажите вашему коду, что он закончил после загрузки.

Хакерское, неполное решение: вы можете попробовать переопределитьXMLHttpRequest с функцией, которая оборачивает существующийXMLHttpRequest и возвращает его. Это позволит вам узнать, происходит ли событие AJAX в данный момент. Однако это решение не сработает, чтобы увидеть, загружены ли плагины, и вы не сможете определить разницу между AJAX-событиями, которые запускаются при загрузке страницы, и AJAX-запросами, которые происходят периодически, как те, которые изменяются при переполнении стека. значок Stack Exchange в левом верхнем углу, если у вас есть новые уведомления.

Попробуйте что-то вроде этого:

(function(oldHttpRequest){
  // This isn't cross-browser, just a demonstration
  // of replacing XMLHttpRequest

  // Keep track of requests
  var requests_running = 0;

  // Override XMLHttpRequest's constructor
  window.XMLHttpRequest = function() {
    // Create an XMLHttpRequest
    var request = new oldHttpRequest();

    // Override the send method
    var old_send = request.send;
    request.send = function () {
      requests_running += 1;
      old_send.apply(request, arguments);
    };

    // Wait for it to load
    req.addEventListener("load", function() {
      requests_running -= 1;
    }, false);

    // Return our modified XMLHttpRequest
    return request;
  };

  window.addEventListener("load", function() {
    // Check every 50 ms to see if no requests are running
    setTimeout(function checkLoad() {
      if(requests_running === 0)
      {
        // Load is probably complete
      }
      else
        setTimeout(checkLoad, 50);
    }, 50);
  }, false);
})(window.XMLHttpRequest)
 jnthnclrk13 июл. 2011 г., 12:05
В большинстве случаев возможности веб-разработки практически безграничны, но есть несколько таких случаев, когда вещи «невозможны». Спасибо за попытку, это лучший ответ на данный момент.
 Peter14 июл. 2011 г., 00:15
Отличный ответ! Хотя это, безусловно, можно отследить, применяя осторожную дисциплину во время разработки, браузер не может определенно определить это. Это действительно сводится к проблеме остановки, которую Тьюринг, как известно, оказался неразрешимым.
 Davy812 июл. 2011 г., 19:59
Интересно, есть ли способ проверить, что в очереди событий ничего не осталось для выполнения?
 Na7coldwater12 июл. 2011 г., 19:39
@trnsfrmr Невозможно бытьполностью уверен, что страница загружена, но вы можете получить правильное предположение. Смотрите обновленный ответ выше.
 jnthnclrk12 июл. 2011 г., 17:38
Можем ли мы предположить, что после первоначального запроса страницы дальнейшее взаимодействие с пользователем отсутствует? Все еще невозможно?

Ваш ответ на вопрос