Заставьте мой userscript ждать загрузки других скриптов
[Edit: я заменяю оригинальный, запутанный вопрос упрощенным примером, демонстрирующим проблему.]
фон
Я пытаюсь написать userscript, который будет работать в Chrome. Этот скрипт должен вызвать функцию JavaScript AlertMe()
это вне userscript -- эта функция является частью страницы и содержит переменные, которые генерируются динамически на стороне сервера, поэтому невозможно переписать эту функцию в мой телефон.
код
скрипт на странице (на странице):
<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
. Думая, что это потому, что мой userscript работал до того, как все остальные скрипты были заряженный, я использовал setTimeout
ждать
3 ответов
Это не вопрос времени.
вы сталкиваетесь с ограничениями безопасности Greasemonkey, которые мешают вам выполнять функции на странице. Пожалуйста, см. Мой ответ на этот предыдущий вопрос для объяснения и некоторых безопасных обходных путей:
UserScripts & Greasemonkey: вызов функций JavaScript веб-сайта
вы всегда можете написать небольшую функцию, которая проверяет, загружена ли функция
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();
Если проблема действительно в том, что ваш скрипт запускается слишком рано, возможно, проверка и ожидание, пока DOM будет готов, является решением:полагаясь на готовность DOM вызывать функцию (вместо window.события onload)
редактировать
этот ответ на SO также может оказаться полезным.