【问题标题】:Chrome extension "$ is not defined" errorChrome 扩展“$ 未定义”错误
【发布时间】:2013-10-05 16:23:25
【问题描述】:

我在处理 chrome 扩展程序时收到错误“$ 未定义”。

这是我的清单文件:

   {
      "name": "X",
      "description": "Snip this page",
      "version": "2.0",
      "permissions": [
        "activeTab"
      ],
      "background": {
        "scripts": ["background.js"],
        "persistent": false
      },
      "content_scripts":[{
        "matches" : ["<all_urls>"],
        "js": ["jquery-2.0.2.js","jquery.Jcrop.js"],
        "css": ["jquery.Jcrop.min.css"]
      }],
      "browser_action": {
        "default_title": "Snip this page"
      },
      "manifest_version": 2
    }

这是我的 background.js 文件:

chrome.browserAction.onClicked.addListener(function(tab){
  // No tabs or host permissions needed!
  chrome.tabs.executeScript({
    file: 'content.js'
  });
});

最后是触发错误的文件:content.js

console.log('1');
var jcropapi, boundx, boundy;
$('body').attr('id', 'target');
$(document).ready(function(){
    $('target').Jcrop();
    console.log('4');
    document.onkeydown = function(){
        if(window.event.keyCode==13){
            console.log('enter');
        }
    };
});

据我了解,这是因为没有加载 JQuery。但是,我在清单中正确加载它,并且 jquery.js 也是清单内容脚本中调用的第一个文件。请帮我调试。谢谢!

【问题讨论】:

    标签: javascript jquery google-chrome google-chrome-extension


    【解决方案1】:

    当调用 jQuery 的脚本在 jQuery.js 加载之前加载时会发生这种情况。在问题提交者给出的示例中,后台在内容脚本之前加载,内容脚本在后台脚本调用 jQuery 之后加载 jQuery 本身。可以通过让后台脚本加载 jQuery 本身来修复这个示例,如下所示:

     "background": {
        "scripts": ["jquery-2.0.2.js", "jquery.Jcrop.js", "background.js"],
        "persistent": false
      },  
    

    还要记住,清单中列出的 js 文件是按照它们出现的顺序加载的。例如,假设您有一个文件“script.js”,其中包含:

    console.log($('#elementID'));
    

    如果您这样编写清单(错误),您将收到错误“$ 未定义”:

    "content_scripts": [
        {
            "js": [ 
                "script.js",
                "jquery.js" ]
        } 
    ]
    

    将清单更改为此(右)将修复错误:

    "content_scripts": [
        {
            "js": [ 
                "jquery.js",
                "script.js" ]
        } 
    ]
    

    请注意,“jquery.js”现在位于“script.js”之前,因此首先加载。

    问题似乎是间歇性的,因为这两个脚本几乎是同时加载的。如果您更改脚本以使对 jQuery 的调用低于其他一些 javascript 命令,则执行这些其他命令所需的时间可能刚好足够 jQuery.js 完成加载。因此,例如,如果您以上述错误方式编写清单,您还可以通过更改 script.js 文件来从技术上修复错误,如下所示:

    var t = setTimeout(function(){
         console.log($('#elementID'));
    }, 1000);
    

    1 秒的延迟让 jQuery.js 有足够的时间加载,然而,这显然不是理想的解决方案!

    【讨论】:

      【解决方案2】:

      这是因为您在 jQuery 文件之前调用脚本。
      正确的是这样的:

      {
        "name": "X",
        "description": "Snip this page",
        "version": "2.0",
        "permissions": [
          "activeTab"
        ],
        "background": {
          "scripts": ["background.js"],
          "persistent": false
        },
        "content_scripts":[{
          "matches" : ["<all_urls>"],
          "js": ["jquery-2.0.2.js","yourscript.js"],
          "css": ["jquery.Jcrop.min.css"]
        }],
        "browser_action": {
          "default_title": "Snip this page"
        },
        "manifest_version": 2
      }
      

      【讨论】:

        【解决方案3】:

        某处发生了冲突。通过将$ 的所有实例替换为jQuery 来解决它。

        【讨论】:

        • 差别不大。我收到错误消息:“未定义 jQuery”
        • 文件:content.js 被调用,因为我在 chrome 控制台中看到了“1”
        • “Chrome 控制台中的'1'”- 你的意思是一条错误消息吗?你确定 jquery.js 正在加载吗?我从来没有遇到过用jQuery 代替$ 的问题(至少使用jQuery 1.7)。
        • “1”仅用于调试目的。这就是我知道 content.js 被加载的方式
        【解决方案4】:

        我不知道它是如何工作的,但不知何故,当我将 JQuery 更改为最小化版本时,它现在可以工作了。

        【讨论】:

        • 我猜你在清单文件中添加 jQuery 后没有重新加载扩展。内容脚本会自动重新加载。 manifest.json 的更改只有在重新加载 Chrome 扩展程序后才会生效。
        • 你解决过这个问题吗?我有一个类似的问题,有时扩展工作,有时它无法加载 jquery.min.js
        • 嘿,很抱歉消息迟了,但我确实解决了。
        • 尝试将 jquery 放在文件开头
        猜你喜欢
        • 2016-04-05
        • 2018-06-09
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 2011-10-23
        相关资源
        最近更新 更多