首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:nodes ()不返回预期的节点

:nodes ()不返回预期的节点
EN

Stack Overflow用户
提问于 2014-09-01 21:25:10
回答 1查看 278关注 0票数 1

请考虑以下代码:

代码语言:javascript
复制
// @include     /(^https?:\/\/www\.|^https?:\/\/)google\.com(\.|\/).*/
// @include     /(^https?:\/\/www\.|^https?:\/\/)stackoverflow\.com\/.*/
// @include     /(^https?:\/\/www\.|^https?:\/\/)userscripts-mirror\.org\/.*/
// @include     http://wiki.greasespot.net/*
// @version     1.0
// @require     https://code.jquery.com/jquery-2.1.1.min.js
// @grant       GM_addStyle


$ ( 'body:contains("serscripts.org")').each ( function ()  {

var results = $(this);
var text = results.text();
console.log(text);
text = text.replace( /serscripts\.org/ig, "serscripts-mirror.org" );
text = text.replace( /(:8080|%3A8080)/ig, "");
    //results.text ( text );

} );

我预期返回应该只是包含该字符串的元素,但是控制台上的结果是主体的所有文本。

考虑一下线上的此页

代码语言:javascript
复制
// @updateURL       https://userscripts.org/scripts/so...

我想改变这一点。

或者这一个

代码语言:javascript
复制
// @require http://userscripts.org/scripts/source...

我也想换衣服。

标记之间的所有单词都应该检查字符串,并且只返回有字符串的单词。

正确的选择器是什么?

Note

<a></a>之间的链接属性和文本已经使用类似的.each ( function )进行了更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-01 22:57:03

:contains正在返回与预期完全相同的内容。来自规格

匹配的文本可以直接出现在所选元素中的任何一个元素的后代中,或者它的组合中。

通常,要在网页上替换、包装或突出显示文本术语,您需要在单独的TEXT_NODE级别上工作。任何其他的风险:URL,id,事件处理程序,等等。

您可以为此使用树行者

代码语言:javascript
复制
var txtWalker   = document.createTreeWalker (
    document.body,
    NodeFilter.SHOW_TEXT,
    {   acceptNode: function (node) {
            //-- Skip whitespace-only nodes
            if (node.nodeValue.trim() )
                return NodeFilter.FILTER_ACCEPT;

            return NodeFilter.FILTER_SKIP;
        }
    },
    false
);
var txtNode     = null;

while (txtNode  = txtWalker.nextNode () ) {
    var oldTxt  = txtNode.nodeValue;
    var newTxt  = oldTxt.replace (/serscripts\.org/ig, "serscripts-mirror.org");
    newTxt      = newTxt.replace (/(:8080|%3A8080)/ig, "");

    txtNode.nodeValue = newTxt;
}

这将安全地处理页面上的所有内容,除了hrefsrc等HTML属性。

如果您想要更改这些,请使用单独的、有针对性的.each ()代码--就像您说的那样--但是不要在<a></a>之间更改文本,因为这已经由树行者完成了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25613081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档