我有这两种注射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
目前因为它似乎运行更顺畅(当它不工作),所以我想这是需要改变的东西。
如果任何人有任何建议,他们会不胜感激。
编辑:关于这个问题的答案添加了一个跟进的问题在这里 ,我觉得,如果我把它添加到这个问题,它可能是有用的人。
如果代码是不是一直在努力,那么这表明元素(一个或多个)正在创建/由页面的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浏览器:
- 您可以设置
mycss.css
隐藏DIV,直到你感动之后。 这可能是最经济有效的方法,性能明智的。 - 或者,您可以覆盖
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这一点。