如果代码并不总是有效,则表明元素是由页面的 javascript 创建/加载的。因此,您需要使用标准的 AJAX 感知技术来移动该 div。
这些技术包括:计时器、突变观察者、突变事件和拦截 AJAX XHR(如果适用)。这些都在其他 Stack Overflow 问题中讨论过,但是: 突变事件已被弃用/存在错误;拦截 XHR 会变得混乱,可能不适用于此处;突变观察者可能会变得复杂。
我建议下载并添加waitForKeyElements() 实用程序 https://gist.github.com/2625891到您的清单。
然后是移动它的代码<div>
仅仅变成:
waitForKeyElements (
"jQuery selector for div(s) you want to move",
moveSelectDivs
);
function moveSelectDivs (jNode) {
jNode.insertBefore ("APPROPRIATE JQUERY SELECTOR");
}
将清单设置为run at document_end http://developer.chrome.com/extensions/content_scripts.html#run_at。这相当于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。