Javascript 如何使用greasemonkey修改CDATA?

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'); ...

有一个网页,所有的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>

//

我想做的是用
Test
替换单词
Test
的所有实例,但我甚至不知道如何用这种方式获得元素/HTML。

您想包装
Test
,而有问题的HTML是通过javascript添加的。如果是这样,则有三种基本方法:

  • 你可以把目标词包装起来。这是最稳健的方法。详见下文

  • 您通常可以在以后重写有问题的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);
                    }
                }
            } );
        };
    }