首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Chrome扩展向页面中注入Javascript :并发问题?

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

Stack Overflow用户
提问于 2012-03-24 20:01:24
回答 2查看 2K关注 0票数 6

我正在参与Chrome扩展的开发。

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

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

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

不过,在后一种情况下,尽管Javascript应该是单线程的,但在运行依赖脚本时,JQuery似乎并未完全解析,从而导致以下情况

代码语言:javascript
运行
复制
Uncaught ReferenceError: $ is not defined

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-24 20:31:50

您可以对脚本使用onload事件...

代码语言:javascript
运行
复制
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);
票数 9
EN

Stack Overflow用户

发布于 2012-03-24 20:16:31

在DOM中附加一个带有src属性的script元素并不意味着脚本已实际加载并可供使用。您将需要监控脚本实际加载的时间,在此之后您可以像往常一样开始使用jQuery。

你可以这样做:

代码语言:javascript
运行
复制
    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 );
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9851559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档