JavaScript的并不总是在Chrome扩展工作,当我要运行它?(Javascript not

2019-08-05 05:45发布

我有这两种注射CSS和Javascript到页面Chrome扩展,并且在CSS总是被注入时,JavaScript是唯一有时并不能正常工作等。 如果不工作,我认为它的运行的东西存在,它必须处理之前。

JavaScript的仅仅是移动div在另一个上面使用insertBefore但是这并不总是发生,我想这是因为它的加载时的感觉。

我的清单是目前:

{
  ...
  "content_scripts": [{
    "matches": [ "*://example.com/*" ],
     "js": [
        "js/jquery-1.8.3.min.js", "js/myjavascript.js"
      ],
      "run_at": "document_end",
      "css": [
        "css/mycss.css"
      ]
  }]
} 

我已经run_at设置为document_end目前因为它似乎运行更顺畅(当它不工作),所以我想这是需要改变的东西。

如果任何人有任何建议,他们会不胜感激。

编辑:关于这个问题的答案添加了一个跟进的问题在这里 ,我觉得,如果我把它添加到这个问题,它可能是有用的人。

Answer 1:

如果代码是不是一直在努力,那么这表明元素(一个或多个)正在创建/由页面的JavaScript加载。 所以,你需要使用标准的AJAX感知技术来移动该专区。

该技术包括:定时器,突变观察员,突变事件,并拦截AJAX XHR(如适用)。 这些在其他堆栈溢出问题的所有讨论,但:突变事件已被弃用/车; 拦截XHR变得混乱,可能无法适用于此; 和变异观察家可能很复杂。

我建议你下载并添加了waitForKeyElements()实用程序到您的清单。

然后代码来移动<div>变为仅仅:

waitForKeyElements (
    "jQuery selector for div(s) you want to move",
    moveSelectDivs
);
function moveSelectDivs (jNode) {
    jNode.insertBefore ("APPROPRIATE JQUERY SELECTOR");
}


保持你的清单设置为在运行document_end 。 这相当于DOMContentLoaded -这是当$(document).ready()火灾。 默认run_at火灾为时已晚,在不可预测的时间。 run_at document_start将没有任何好处,因为:定时器,突变观察员,等一切都将不火,直到后DOMContentLoaded事件- Chrome浏览器的最新版本反正(其他浏览器不具有相同的限制)。



另一种方法,最快的行动,但速度慢的网页:

关于:

(页面载入,然后你可以看到DIV移动),这是我想避免的。

只有两种办法做任何事情之前DOMContentLoaded ,在Chrome浏览器:

  1. 您可以设置mycss.css隐藏DIV,直到你感动之后。 这可能是最经济有效的方法,性能明智的。
  2. 或者,您可以覆盖document.createElement() 这将是快速的新元素回应越好(假定它之前创建DOMContentLoaded ),但它可能会在页面整体放缓,由一个显着的量。

设置内容脚本在运行document_start和代用码必须注射。 因此,该脚本将如下所示:

addJS_Node (null, null, scriptMain);

function scriptMain () {
    var _orig_createElement = document.createElement;

    document.createElement  = function (tag) {
        var element = _orig_createElement.call (document, tag);

        var movingNode      = document.querySelector ("MOVING DIV SELECTOR");
        if (movingNode) {
            var target      = document.querySelector ("TARGET DIV SELECTOR");
            if (target) {
                target.parentNode.insertBefore (movingNode, target);

                document.createElement = _orig_createElement;
            }
        }

        return element;
    };
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}


不要试图使用jQuery这一点。



文章来源: Javascript not always working in Chrome Extension, when should I run it?