【问题标题】:Javascript: Changing color of every "r" in html documentJavascript:更改html文档中每个“r”的颜色
【发布时间】:2009-12-23 20:26:31
【问题描述】:

编辑 [如何] 使用 javascript 更改我的 HTML 文档中每个 R 和 r 的颜色?

【问题讨论】:

  • 看起来 Dan 想突出显示这封信

标签: javascript html colors


【解决方案1】:

我会使用highlight plugin for jQuery。然后执行以下操作:

$('*').highlight('r'); // Not sure if it's case-insensitive or not

在 CSS 中:

.highlight { background-color: yellow; }

【讨论】:

  • 谢谢,乔纳森。也不确定是否可以链接它,因此可能需要两次调用。
  • Chris,它不区分大小写,这意味着它已经替换了大写和小写,而无需两次调用。
【解决方案2】:

可行,但不是超级容易。没有 CSS 方法可以做到这一点。

基本上,您需要使用 Javascript 并遍历所有节点。如果是文本节点,可以搜索“R”,然后将R替换为<span style="color:red">R</span>

我显然简化了这一点,最好只动态添加一个“突出显示”类,而不是硬编码一个样式,并在 CSS 中定义它。同样,我确定您会想参数化搜索字符串。此外,这没有考虑文本节点是什么,例如,我有特殊处理来跳过 cmets,但你可能会发现还有其他东西(脚本节点?)你也需要跳过。

 function updateNodes(node) { 
   if (node.nextSibling)
     updateNodes(node.nextSibling);
   if (node.nodeType ==8) return; //Don't update comments
   if (node.firstChild)
      updateNodes(node.firstChild);
   if (node.nodeValue) { // update me    
       if (node.nodeValue.search(/[Rr]/) > -1){ // does the text node have an R
               var span=document.createElement("span");
               var remainingText = node.nodeValue;
               var newValue='';
               while (remainingText.search(/[Rr]/) > -1){ //Crawl through the node finding each R
                 var rPos = remainingText.search(/[Rr]/);
                 var bit = remainingText.substr(0,rPos);
                 var r = remainingText.substr(rPos,1);
                 remainingText=remainingText.substr(rPos+1);
                 newValue+=bit;
                 newValue+='<span style="color:red">';
                 newValue+=r;
                 newValue+='</span>';
               }
               newValue+=remainingText;
               span.innerHTML=newValue;
               node.parentNode.insertBefore(span,node);
               node.parentNode.removeChild(node);   
            } 
        }
     } 

        function replace(){   updateNodes(document.body); 
}

【讨论】:

    【解决方案3】:

    是的,这可以通过一点 Javascript、少量 CSS 和一些正则表达式来实现。

    首先,您需要定义一个样式来提供您需要的颜色(在下面的示例中,我指的是一个名为“new-color”的 CSS 类),然后在您的 HTML 内容上运行一些正则表达式,它会进行搜索和代替。您希望将所有 'r' 和 'R' 字符更改为类似的内容(例如):

    <span class="new-colour">r</span>
    

    如果您不了解正则表达式,这里有大量资源可以帮助您入门。您会很高兴知道您的要求非常简单,所以不用担心。这里有几个链接:

    regexlib.com

    8 regular expressions you should know

    【讨论】:

    • 为什么不使用正则表达式?迄今为止最好的答案使用它,它可能是我能看到的最简单的方法(尽管我可能会遗漏一些东西)。
    【解决方案4】:

    您需要使用 DOM(或 jQuery)来遍历文档中的每个文本节点。每当您找到字母 R 时,应用将字母包装在适当元素中的转换。

    例如将文本节点“art”转换为“a&lt;span class="colored"&gt;r&lt;/span&gt;t”。这会添加两个新的文本节点“r”和“t”,以及新的span 元素。

    【讨论】:

      【解决方案5】:

      jQuery 的高亮插件是一种选择。另一种选择 - 特别是从明天开始 - 您可能希望将突出显示扩展到关键字或其他术语是使用 Google 的 Closure goog.dom.annotate 类。这个类的美妙之处在于它实际上会正确地解析 dom 树 注释相关条款。它还允许您排除元素或具有某些类的元素。

      注释的一个常见问题是,如果您不小心,可能会弄乱您的 HTML。

      例如“上面发布的简单解决方案”

      var body = document.getElementsByTagName("body")[0];
      var html = body.innerHTML
      .replace(/(^|>[^<rR]*)([rR])/g, "$1<em>$2</em>");
      body.innerHTML = html; 
      

      肯定还会捕获任何样式属性中的术语。如果你有这个:

      <p class="red">text......</p>
      

      会变成

      <p class="<span class="red">r</span>ed .....
      

      这会破坏你的 html。

      通常 DOM 解析是“慢”的,所以尽量避免注释整个网页,问问自己为什么只需要突出显示 R?其实我很好奇你为什么要注释r的?:)

      【讨论】:

      • 我的“上面发布的简单解决方案”将捕获属性值。有一些魔法可以阻止它,这在神秘和神秘的圈子中被称为“正则表达式向后看”。
      • 而你并不想使用 Google Closure:sitepoint.com/blogs/2009/11/12/…
      【解决方案6】:

      无需任何 20kB JS 库的普通 JS 解决方案:

      var body = document.getElementsByTagName("body")[0];
      var html = body.innerHTML
                     .replace(/(^|>[^<rR]*)([rR])/g, "$1<em>$2</em>");
      body.innerHTML = html; // note that you will lose all
                             // event handlers in this step...
      

      【讨论】:

      • 库是程序员的朋友。不要重新发明轮子,尤其是在重新发明的解决方案有警告的情况下。
      • -1 表示“请注意,您将在此步骤中丢失所有事件处理程序和内容......”,因为它使您的解决方案具有破坏性。
      • -1 表示上述情况,当你的意思是“失去”时也可以写成“松散”
      • @Sam:我不认为 jQuery 插件与轮子属于同一类发明。对于一些 jQuery 插件,重新发明可能非常合适。并且这里的 jQuery 解决方案有很多注意事项,尤其是需要使用 50K 库来做一些你可以在几行代码中完成的事情。
      • 那又怎样?你有一个任务,你想解决它。我正在使用 jQuery mayself、MooTools 和 Prototype。我从查看它们的源代码中学到了很多我的 JS 技能。 但是我会小心使用它们,绝不会没有理由。如果您唯一的任务是突出显示页面中的某些内容,那么 20kB 的 JS 是多余的。我仍然认为,我的解决方案是一个好的、干净的解决方案。 而且如果你在 jQuery/pürototype/whatever 中做同样的事情,你也会失去事件处理程序,如果你不知道你在做什么。
      猜你喜欢
      • 2015-12-31
      • 2017-07-21
      • 2017-07-21
      • 1970-01-01
      • 2014-04-28
      • 2011-12-07
      • 2022-11-10
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多