Chrome扩展在内容脚本中使用jquery解决创建对话窗口时的错误

esyap4oy  于 2023-04-11  发布在  jQuery
关注(0)|答案(2)|浏览(135)

我尝试在我的Chrome扩展中使用jQuery和jQuery-UI。我尝试在每次创建新标签时在内容脚本对话框窗口中创建,但我一直得到:

Property '$' of object [object Window] is not a function

我想我在加载脚本时做错了什么。下面是我所得到的:

{
"name":"Sample",
"description":"This is a sample",
"manifest_version":2,
"version":"2",
"background":{
    "scripts":["background.js"]
},
"content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["jquery-1.8.3.min.js","jquery-ui.js","client.js","myscript.js"]
      "run_at":"document_end",
      "all_frames": true
    }
  ],
"web_accessible_resources": [
    "client.js","jquery-1.8.3.min.js","jquery-ui.js"
  ],
"permissions": [ 
        "unlimitedStorage",
        "http://*/",
        "<all_urls>",
        "tabs"
   ]
}

myscript.js(内容脚本):

var ss = document.createElement('script');
ss.type = "text/javascript";
ss.src = chrome.extension.getURL('jquery-1.8.3.min.js');
ss.onload = function() {
    ss.parentNode.removeChild(ss);
     console.log("jquery-1.8.3.min.js loaded");

};

var ss_ui = document.createElement('script');
ss_ui.type = "text/javascript";
ss_ui.src = chrome.extension.getURL('jquery-ui.js');
ss_ui.onload = function() {
    ss_ui.parentNode.removeChild(ss_ui);
    console.log("jquery-ui.js loaded");
};

var s = document.createElement('script');
s.type = "text/javascript";
s.src = chrome.extension.getURL('client.js');
s.onload = function() {
    s.parentNode.removeChild(s);
    console.log("client.js loaded");
};

        try{

            (document.head||document.documentElement).appendChild(ss);
            (document.head||document.documentElement).appendChild(ss_ui);
            (document.head||document.documentElement).appendChild(s);

        }catch(e){
          console.log("exception in appendChild");
        }

client.js(我在其中创建对话框)

try{
        console.log("Starting to create tabel");

        var layerNode= document.createElement('div');
            layerNode.setAttribute('id','dialog');
            layerNode.setAttribute('title','Basic dialog');
        var pNode= document.createElement('p');
            pNode.innerHTML = "This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.";

        layerNode.appendChild(pNode);
        document.body.appendChild(layerNode);

        jq162 = jQuery.noConflict(true);
(function($){
    $(document).ready(function() {
       $("#dialog" ).dialog();
    });
})(jq162);

        }
        catch(e){
          console.log("script in page exception in appendChild"+e);
          //alert(e);
        }

当我在控制台中看到打印的顺序时,我得到:

Starting to create tabel client.js:2
script in page exception in appendChildTypeError: Cannot call method 'dialog' of null client.js:26
client.js loaded chrome-extension://mmoccjinakdjcmhjdjghhjnihbfkkgkp/myscript.js:24
jquery-1.8.3.min.js loaded chrome-extension://mmoccjinakdjcmhjdjghhjnihbfkkgkp/myscript.js:6
jquery-ui.js loaded

我做错了什么?

cvxl0en2

cvxl0en21#

通常的免责声明,我真的不做jQuery...但我看到你的代码有一个明显的问题,所以给了它一个机会...
摆脱client.js,在你将它注入的文件添加到清单的内容脚本部分后,它就不再需要了。在你将它们添加到清单后,Chrome现在会为你注入它们。一旦你这样做了,它就开始工作了一半。
在那之后我注意到对话框出现了,但是没有图形/样式,所以你需要将css文件添加到清单的内容脚本部分来注入。现在有一些样式,但是控制台说它无法获得样式所需的图形文件。
我不知道从css文件引用extensions目录中包含的图形文件的最佳方法是什么,所以我只是将所有的图形转换为dataurl并将它们放入css文件中。
http://dataurl.net/#dataurlmaker
......去完成它。
现在我们有了一个好看的对话框。

manifest.json

{
"name":"JQuery UI Dialog",
"description":"https://stackoverflow.com/questions/13669762/chrome-extention-using-jquery-in-content-script-resolve-error-when-creating-dial",
"manifest_version":2,
"version":"2",
"content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["jquery-1.8.3.min.js","jquery-ui.js","client.js"],
      "run_at":"document_end",
      "all_frames": true,
      "css":["jquery-ui-base64.css"]
    }
  ],
"web_accessible_resources": [
    "client.js","jquery-1.8.3.min.js","jquery-ui.js"
  ],
"permissions": [ 
        "unlimitedStorage",
        "http://*/",
        "<all_urls>",
        "tabs"
   ]
}

jquery-ui-base64.css

https://gist.github.com/4193693
我觉得放在这里可能有点太大了。

client.js

try {
  console.log("Starting to create tabel");

  var layerNode = document.createElement('div');
  layerNode.setAttribute('id', 'dialog');
  layerNode.setAttribute('title', 'Basic dialog');
  var pNode = document.createElement('p');
  pNode.innerHTML = "This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.";

  layerNode.appendChild(pNode);
  document.body.appendChild(layerNode);

  jq162 = jQuery.noConflict(true);
  (function($) {
    $(document).ready(function() {
      $("#dialog").dialog();
    });
  })(jq162);


} catch(e) {
  console.log("script in page exception in appendChild" + e);
  //alert(e);
}

编辑

使用chromes i18 n支持,我们可以更改css中图像的url,使它们指向我们扩展中的文件。
https://stackoverflow.com/a/8864212/189093
所以这...
url(images/ui-bg_flat_0_aaaaaa_40x100.png)
变成了
url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_flat_0_aaaaaa_40x100.png)
路径不再是相对的,__MSG_@@extension_id__被替换为您的扩展名的ID。
此外,所有以这种方式使用的图像都需要在mainfest的web_accessible_resources部分声明。
所以,清单中的那部分最终看起来像这样(注意我取出了你在那里的三个,它们不再需要被包括在内,因为它们现在被扩展注入了)。

"web_accessible_resources": [
    "images/ui-bg_flat_75_ffffff_40x100.png","images/ui-icons_222222_256x240.png","images/ui-bg_highlight-soft_75_cccccc_1x100.png"
  ]

..我只包含了我需要的文件来让我的测试工作,你可能需要添加更多。检查脚本运行页面上的控制台,它会告诉你需要添加什么文件。
这里有一个链接到我的测试中使用的相同的CSS文件,其中URL更新为以这种方式工作…
https://gist.github.com/4195616

velaa5lx

velaa5lx2#

当您调用jQuery.noConflict时,将不会定义$变量。
但是在script.js中,你在noConflict之后调用了$(document)。我想你在调用noConflict之后忘记了一行(function($
你必须把你的代码改成这样:

jq162 = jQuery.noConflict(true);
(function($){
    $(document).ready(function() {
       $("#dialog" ).dialog();
    });
})(jq162);

相关问题