Javascript 从bookmarklet动态加载js脚本

Javascript 从bookmarklet动态加载js脚本,javascript,Javascript,我正在尝试加载一个脚本,以便在bookmarklet生成的页面上使用脚本。(查看src:XHR,后跟beautify.js,后跟prettify.js) 我知道我基本上应该做什么()但是现在我找不到一个好方法来检测我需要的函数何时被实际加载 var doWhenLoaded = function (name) { if (typeof(eval(name)) === 'function') { eval(name+'()'); } else { s

我正在尝试加载一个脚本,以便在bookmarklet生成的页面上使用脚本。(查看src:XHR,后跟beautify.js,后跟prettify.js)

我知道我基本上应该做什么()但是现在我找不到一个好方法来检测我需要的函数何时被实际加载

var doWhenLoaded = function (name) {
    if (typeof(eval(name)) === 'function') {
        eval(name+'()');
    } else {
        setTimeout( 
            function () {
                console.log("from timeout: "+new Date().getTime());
                doWhenLoaded(name,call); 
            } , 50 
        );
    }
}   

我试过了,但是
eval(name+'()')抛出一个错误

我无法回答您的问题,但要测试某个函数是否可用,请使用:

var doWhenLoaded = function (name) {   
    if (typeof window[name] == 'function') {
      window[name]();
    } else {
      // set the timeout. Should have a limit, else it wil go on forever.
    }
    ...
};
编辑 更新为使用
窗口[name]
,但实际上应该使用对全局对象的引用。但我想,对于特定于浏览器的脚本,可以使用window


上面的代码不应该抛出任何错误。因为名称在形式参数中,所以它本质上是一个声明的局部变量。如果名称未定义,则
typeof name
将返回字符串“undefined”,该字符串未通过测试,因此不会计算
name()

我想我可以通过简单地编写文档而不是将脚本设置到dom中,来强制脚本在调用它们之前同步加载

好的。我不能让它工作。每当我调用doWhenLoaded时,如果名称未定义,我就会得到一个错误!我也无法让Chrome为错误提供行号:(我试图做的是不可能的吗?我正在bookmarklet创建的新窗口中加载脚本。如何在该窗口的“上下文”中运行我的测试检查功能?)?