我正在开发一个 Chrome 扩展程序,它可以替换网页文本中的指定字符串或正则表达式。
总体来说效果很好,但有两个问题我想解决:
(1) 在文本替换发生之前,显示原始的、未更改的网页文本。
(2) 文本替换不会影响滚动到页面底部后动态加载的 Facebook 帖子。
这是代码,改编自https://stackoverflow.com/a/6012345#6012345有微小的变化。
// manifest.json
{
"manifest_version": 2,
"name": "Replace Text",
"version": "1.0",
"content_scripts": [ {
"js": [ "jquery.min.js", "replace.js" ],
"matches": [ "<all_urls>" ],
"run_at": "document_end"
} ]
}
// replace.js
jQuery.fn.textWalk = function( fn ) {
this.contents().each( jwalk );
function jwalk() {
var nn = this.nodeName.toLowerCase();
if( nn === '#text') {
fn.call( this );
} else if( this.nodeType === 1 && this.childNodes && this.childNodes[0] && nn !== 'script' && nn !== 'textarea' ) {
$(this).contents().each( jwalk );
}
}
return this;
};
$('body').textWalk(function() {
this.data = this.data.replace('This Text', 'That Text');
this.data = this.data.replace(/[Rr]eplace\s[Ss]ome\s[Tt]ext/g, 'with other text');
});
我在网上找到了一些部分答案,但无法让它们正常工作。
例如,提出的一种解决方案是更改"run_at": "document_end"
to "run_at": "document_start"
。这会在构建 DOM 之前运行内容脚本,因此理论上它应该在显示任何内容之前进行文本替换。但就我而言,它导致扩展完全停止替换文本。