Javascript 如何使用greasemonkey修改CDATA?
有一个网页,所有的HTML结构都是用Javascript制作的。例如:Javascript 如何使用greasemonkey修改CDATA?,javascript,greasemonkey,cdata,Javascript,Greasemonkey,Cdata,有一个网页,所有的HTML结构都是用Javascript制作的。例如: <script language="JavaScript" type="text/javascript"> //<![CDATA[ function abcd() { document.writeln('<div id="abc">'); document.writeln('<div class="Wrapper">'); document.writeln('Test'); ...
<script language="JavaScript" type="text/javascript">
//<![CDATA[
function abcd()
{
document.writeln('<div id="abc">');
document.writeln('<div class="Wrapper">');
document.writeln('Test');
...
}
</script>
//
我想做的是用
Test
替换单词Test
的所有实例,但我甚至不知道如何用这种方式获得元素/HTML。您想包装Test
,而有问题的HTML是通过javascript添加的。如果是这样,则有三种基本方法:
// ==UserScript==
// @name YOUR_SCRIPT_NAME
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// ==/UserScript==
function abcd () {
document.writeln('<div id="abc">');
document.writeln('<div class="Wrapper">');
document.writeln('<b>Test</b>');
...
}
var D = document;
var scriptNode = D.createElement ('script');
scriptNode.type = "text/javascript";
scriptNode.textContent = abcd;
var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
targ.appendChild (scriptNode);
CDATA在这种情况下并不重要,因为它只是脚本代码注释。您可以简单地使用正则表达式替换
SCRIPT
元素textContent
中的文本。但要小心不要替换其他文本,如“MyTestFunction”。@Jay我对Javascript不太精通,如何将数据获取到一个变量中,以便我进行解析,然后替换它?如果是常规HTML,我可以通过ID遍历节点或获取标记,但在这种情况下我该怎么做?更改
标记中的文本不会影响任何内容,不管CDATA与否。一旦浏览器解析了代码,源代码就几乎被忽略了。您可以阻止
标记,或覆盖JS函数。或者,您可以只处理目标文本/节点,因为它们似乎尝试了包装文本目标,但它对我不起作用(在站点上,但在JFiddle上起作用)。我不知道您是否使用javascript编写HTML,但我注意到,在查看源代码时,我可以看到HTML标记。我正在查看的页面,当我查看源代码时,我没有看到任何HTML结构。我所看到的就是我在问题中发布的内容,“包装目标文本”在javascript加载的代码(即使使用CDATA)上也能完美地工作。你可以在电视上看到。如果它在你的页面上不起作用,那么问题中遗漏的东西就是问题。代码在frame还是iframe中?链接到目标页面。这是打印机的门户网站。它相当大,所以这里有一个我在点击ViewSource时看到的片段。
// ==UserScript==
// @name YOUR_SCRIPT_NAME
// @include http://fiddle.jshell.net/gH4nV/*
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change introduced
in GM 1.0. It restores the sandbox.
*/
waitForKeyElements ("div.Wrapper", emboldenTheWordTest);
function emboldenTheWordTest (jNode) {
var testWrapper = new wrapTextWithElement ('Test', '<b>');
testWrapper.wrap (jNode);
}
function wrapTextWithElement (targText, elemToWrapWith, bCaseSensitive) {
var self = this;
var bCaseSensitive = bCaseSensitive || false;
self.targRegEx = new RegExp ("(" + targText + ")", bCaseSensitive ? "" : "i");
self.elemToWrapWith = elemToWrapWith;
self.wrap = function (node) {
$(node).contents ().each ( function () {
if (this.nodeType === Node.ELEMENT_NODE) {
self.wrap (this);
}
else if (this.nodeType === Node.TEXT_NODE) {
var ndText = this.nodeValue;
if (self.targRegEx.test (ndText) ) {
var replaceNodes = $.map (
ndText.split (self.targRegEx),
function (phrase) {
if (self.targRegEx.test (phrase) ) {
var wrapped = $(self.elemToWrapWith, {text: phrase} );
return wrapped.get ();
}
else {
if (phrase == "")
return null;
else
return document.createTextNode (phrase)
}
}
);
$(this).replaceWith (replaceNodes);
}
}
} );
};
}