Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Chrome扩展在页面中注入Javascript:并发性问题?_Javascript_Jquery_Google Chrome_Google Chrome Extension - Fatal编程技术网

从Chrome扩展在页面中注入Javascript:并发性问题?

从Chrome扩展在页面中注入Javascript:并发性问题?,javascript,jquery,google-chrome,google-chrome-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,我正在参与Chrome扩展的开发 在某些时候,我们需要运行一些静态的非生成代码,这些代码必须在页面的上下文中运行,而不是在扩展的上下文中运行 对于简单脚本,使用$.getScript(chrome.extension.getURL(..))或者script=document.createElement('script');,都没有问题。。。document.body.appendChild(脚本) 对于更复杂的脚本,我们有时需要包含jquery本身,或者其他一些脚本定义(因为依赖关系) 不过,在

我正在参与Chrome扩展的开发

在某些时候,我们需要运行一些静态的非生成代码,这些代码必须在页面的上下文中运行,而不是在扩展的上下文中运行

对于简单脚本,使用
$.getScript(chrome.extension.getURL(..))
或者
script=document.createElement('script');,都没有问题。。。document.body.appendChild(脚本)

对于更复杂的脚本,我们有时需要包含jquery本身,或者其他一些脚本定义(因为依赖关系)

不过,在后一种情况下,尽管Javascript被认为是单线程的,但在运行依赖脚本时,JQuery似乎并没有完全解析,这导致了以下问题

Uncaught ReferenceError: $ is not defined
假设JScript是单线程的,我错了吗?
当脚本之间存在依赖关系时,在页面中插入脚本的正确方法是什么?(例如,脚本X使用脚本Y中定义的函数)

在DOM中添加带有
src
属性的
script
元素并不意味着脚本已实际加载并准备好使用。您将需要监视脚本实际加载的时间,之后可以像平常一样开始使用jQuery

你可以这样做:

    var script = doc.createElement("script");
    script.src = url;
    /* if you are just targeting Chrome, the below isn't necessary        
    script.onload = (function(script, func){
        var intervalFunc; 

        if (script.onload === undefined) {
            // IE lack of support for script onload

            if( script.onreadystatechange !== undefined ) {

                intervalFunc = function() {
                    if (script.readyState !== "loaded" && script.readyState !== "complete") {
                        window.setTimeout( intervalFunc, 250 );

                    } else {
                        // it is loaded
                        func();

                    }

                };

                window.setTimeout( intervalFunc, 250 );

            } 

        } else {
            return func;
        }

    })(script, function(){

       // your onload event, whatever jQuery etc.
    });
    */
    script.onload = onreadyFunction; // your onload event, whatever jQuery etc.

    document.body.appendChild( script );

您可以对脚本使用onload事件

function addScript(scriptURL, onload) {
   var script = document.createElement('script');
   script.setAttribute("type", "application/javascript");
   script.setAttribute("src", scriptURL);
   if (onload) script.onload = onload;
   document.documentElement.appendChild(script);
}

function addSecondScript(){
    addScript(chrome.extension.getURL("second.js"));
}

addScript(chrome.extension.getURL("jquery-1.7.1.min.js"), addSecondScript);

成功了。我编写了一个链接机制,但是使用onload属性可以实现所需的功能。谢谢