Функция запуска Javascript после загрузки страницы

Я пытаюсь создать небольшую автоматизацию script в Javascript, которую я хочу запустить на сайте с помощью функции Opera User script, чтобы определить внешние скрипты для запуска. Я использовал эту функцию раньше, чтобы запускать скрипты, которые я писал с внешних сайтов, с хорошим эффектом.

Мне нужно подождать, пока страница загрузится для script, но я не могу заставить ее работать. Код в настоящее время:

if (addEventListener in document) { // use W3C standard method
    document.addEventListener('load', meerfirst(), false);
} else { // fall back to traditional method
    document.onload = meerfirst();
}

function meerfirst(){
    nameForm = document.forms['aspnetForm'];
    nameForm.elements('ctl00$CPH1$NewQuoteView$TitlesView$DropDownListTitles').value = 'MR:TRUE:MR';
    nameForm.elements('ctl00$CPH1$NewQuoteView$TextBoxFirstName').value = 'James';
 }

Это моя собственная функция с добавлением оператора if, найденного по другому вопросу. Я также попробовал window.onload, но он все еще не работал.

Странно Opera фактически не выполняет script вообще, как если бы я установил точку останова в выражении if, который она на самом деле не разрывает на ней. Может ли сайт иметь встроенную функцию антивируса? Или возможно что-то, что я делаю неправильно, чтобы остановить это выполнение?

Ответ 1

В этом коде несколько проблем:

if (addEventListener in document) { // use W3C standard method
    document.addEventListener('load', meerfirst(), false);
} else { // fall back to traditional method
    document.onload = meerfirst();
}
  • Вам нужно поставить кавычки вокруг addEventListener в оператор if. Вы ищете имя свойства в document, поэтому имя должно быть строкой: if( 'addEventListener' in document )

  • Вы хотите ссылаться на функцию по имени в инструкции addEventListener, а не называть ее немедленно. Вы должны удалить круглые скобки - используйте meerfirst вместо meerfirst().

  • Назначение document.onload не влияет. Посмотрите мой ответ на window.onload vs document.onload и вместо этого используйте window.onload.

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

  • Наконец, я рекомендую слушать DOMContentLoaded, а не load - если вы не собираетесь запускать какой-то код, который должен ждать загрузки всех изображений.

Ответ 2

Передайте функцию как обратный вызов

addEventListener('load', meerfirst, false);
                  // no parens! ^^

поместив скобки, вы вместо этого сразу вызовите функцию (перед загрузкой) и передайте ее (бесполезное, не функциональное) возвращаемое значение в addEventListener.


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

Ответ 3

Try:

window.onload = function() 
{

meerfirst();

};

Ответ 4

Ваш ответ хорошо вложен в O'Reilly "Javascript: окончательное руководство"

// Register the function f to run when the document finishes loading.
// If the document has already loaded, run it asynchronously ASAP.
function onLoad(f) {
    if (onLoad.loaded) // If document is already loaded
        window.setTimeout(f, 0); // Queue f to be run as soon as possible
    else if (window.addEventListener) // Standard event registration method
        window.addEventListener("load", f, false);
    else if (window.attachEvent) // IE8 and earlier use this instead
        window.attachEvent("onload", f);
}
// Start by setting a flag that indicates that the document is not loaded yet.
onLoad.loaded = false;
// And register a function to set the flag when the document does load.
onLoad(function() { onLoad.loaded = true; });

Это будет работать не только при завершении загрузки браузером, но также и в отношении кроссбраузерных расхождений. Наслаждайтесь:)