7

[编辑:我用一个简单的例子来代替原来的、令人困惑的问题。]

背景

我正在尝试编写一个将在 Chrome 中运行的用户脚本。该脚本需要调用用户脚本AlertMe()之外的 JavaScript 函数——该函数是页面的一部分,包含在服务器端动态生成的变量,因此无法在我的用户脚本。

代码

页面上的脚本(访问页面):

<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>

我的用户脚本(安装在 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未定义呢?

4

3 回答 3

9

您总是可以编写一个小函数来检查该函数是否已加载

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();
于 2011-02-23T15:19:07.243 回答
7

这不是时间问题。

您遇到了 Greasemonkey 的安全限制,这会阻止您在页面中执行功能。请参阅我对上一个问题的回答以获得解释和一些安全的解决方法:

UserScripts & Greasemonkey:调用网站的 JavaScript 函数

于 2011-02-23T17:38:57.250 回答
-1

如果问题确实是您的脚本运行得太早,也许检查并等待 DOM 准备好是解决方案:依靠 DOM 准备好调用函数(而不是 window.onload)

编辑

这个关于 SO 的答案也可能被证明是有用的。

于 2011-02-23T15:17:04.050 回答