Заставить мой скрипт пользователя ждать загрузки других скриптов - PullRequest
7 голосов
/ 23 февраля 2011

[ Редактировать: Я заменяю оригинальный, запутанный вопрос упрощенным примером, демонстрирующим проблему.]

Фон

Iпытаюсь написать usercript, который будет работать в Chrome.Этот сценарий должен вызывать функцию JavaScript AlertMe(), которая находится за пределами пользовательского сценария - эта функция является частью страницы и содержит переменные, которые динамически генерируются на стороне сервера, поэтому переписать это невозможнофункция в моем скрипте пользователя.

Код

Скрипт на странице ( посещение страницы ):

<script type="text/javascript">
    function AlertMe()
    {
        alert("Function AlertMe was called!");
        // then do stuff with strings that were dynamically generated
        // on the server so that I can't easily rewrite this into the userscript
    }
</script>

Мойuserscript ( установить его в Chrome ):

function tryAlert()
{
    if (typeof AlertMe == "undefined") {
        console.log('AlertMe is undefined.');
        window.setTimeout(tryAlert, 100);
    }
    else {
        AlertMe();
    }
}

tryAlert();

Проблема

Когда я попытался просто вызвать функцию, консоль Chrome позволила мнезнаю, что AlertMe is not defined.Думая, что это произошло из-за того, что мой пользовательский скрипт выполнялся до загрузки всех других скриптов, я использовал setTimeout, чтобы дождаться определения функции AlertMe.

К сожалению, если вы установите скрипт, а затем посетите страницу, вы увидите, что он просто выводит AlertMe is undefined. навсегда и никогда не вызывает функцию.Если вы наберете typeof AlertMe в консоли Chrome, он будет правильно отвечать "function", так почему мой пользовательский скрипт всегда думает, что AlertMe не определен?

Ответы [ 3 ]

8 голосов
/ 23 февраля 2011

Вы всегда можете написать небольшую функцию, которая проверяет, загружена ли функция

function waitForFnc(){
  if(typeof absearch == "undefined"){
    window.setTimeout(waitForFnc,50);
  }
  else{
    runMyFunction();
  }
}

function runMyFunction(){
    var urlParams = window.location.search.substring(1).split('&'),
        username = "",
        hscEmailInput = document.getElementById('userfield6'),
        i = 0;
    if (urlParams !== "") {
        for (i = 0; i < urlParams.length; i++) {
            if (urlParams[i].substr(0,4) === "USER") {
                username = urlParams[i].replace('USER=', '');
                hscEmailInput.value = username + '@example.com';
                absearch('&PAGESIZE=1');
            }
        }
    }
}

waitForFnc();
7 голосов
/ 23 февраля 2011

Это не вопрос времени.

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

UserScripts & Greasemonkey: вызов функций JavaScript на сайте

0 голосов
/ 23 февраля 2011

Если проблема действительно в том, что ваш скрипт выполняется слишком рано, возможно, проверка и ожидание, пока DOM не будет готов, является решением: Полагаться на готовность DOM для вызова функции (вместо window.onload)

Редактировать

Этот ответ по SO также может оказаться полезным.

...