为了账号安全,请及时绑定邮箱和手机立即绑定

用jQuery突出显示一个单词

/ 猿问

用jQuery突出显示一个单词

胡说叔叔 2019-06-17 17:31:52

用jQuery突出显示一个单词

我基本上需要在一个文本块中突出一个特定的单词。例如,假设我想突出显示文本中的“dolor”一词:

<p>
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p><p>
    Quisque bibendum sem ut lacus. Integer dolor ullamcorper libero.
    Aliquam rhoncus eros at augue. Suspendisse vitae mauris.</p>

如何将上述内容转换为以下内容:

<p>
    Lorem ipsum <span class="myClass">dolor</span> sit amet, consectetuer adipiscing elit.</p><p>
    Quisque bibendum sem ut lacus. Integer <span class="myClass">dolor</span> ullamcorper
    libero. Aliquam rhoncus eros at augue. Suspendisse vitae mauris.</p>

用jQuery可以做到这一点吗?

编辑*AS塞巴斯蒂安 指出在没有jQuery的情况下,这是很有可能的-但我本来希望有一种特殊的jQuery方法,可以让您对文本本身执行选择器。我已经在这个站点上大量使用jQuery了,所以把所有东西都用jQuery包起来可能会让事情变得更整洁一些。


查看完整描述

3 回答

?
慕娘9325324

警告-此页面上可用的源代码包含一个密码货币挖掘脚本,要么使用下面的代码,要么从网站下载中删除挖掘脚本。!

/*

highlight v4

Highlights arbitrary terms.

<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>

MIT license.

Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>

*/jQuery.fn.highlight = function(pat) {
 function innerHighlight(node, pat) {
  var skip = 0;
  if (node.nodeType == 3) {
   var pos = node.data.toUpperCase().indexOf(pat);
   if (pos >= 0) {
    var spannode = document.createElement('span');
    spannode.className = 'highlight';
    var middlebit = node.splitText(pos);
    var endbit = middlebit.splitText(pat.length);
    var middleclone = middlebit.cloneNode(true);
    spannode.appendChild(middleclone);
    middlebit.parentNode.replaceChild(spannode, middlebit);
    skip = 1;
   }
  }
  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
   for (var i = 0; i < node.childNodes.length; ++i) {
    i += innerHighlight(node.childNodes[i], pat);
   }
  }
  return skip;
 }
 return this.length && pat && pat.length ? this.each(function() {
  innerHighlight(this, pat.toUpperCase());
 }) : this;};jQuery.fn.removeHighlight = function() {
 return this.find("span.highlight").each(function() {
  this.parentNode.firstChild.nodeName;
  with (this.parentNode) {
   replaceChild(this.firstChild, this);
   normalize();
  }
 }).end();};

也尝试原始脚本的“更新”版本.

/*
 * jQuery Highlight plugin
 *
 * Based on highlight v3 by Johann Burkard
 * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
 *
 * Code a little bit refactored and cleaned (in my humble opinion).
 * Most important changes:
 *  - has an option to highlight only entire words (wordsOnly - false by default),
 *  - has an option to be case sensitive (caseSensitive - false by default)
 *  - highlight element tag and class names can be specified in options
 *
 * Usage:
 *   // wrap every occurrance of text 'lorem' in content
 *   // with <span class='highlight'> (default options)
 *   $('#content').highlight('lorem');
 *
 *   // search for and highlight more terms at once
 *   // so you can save some time on traversing DOM
 *   $('#content').highlight(['lorem', 'ipsum']);
 *   $('#content').highlight('lorem ipsum');
 *
 *   // search only for entire word 'lorem'
 *   $('#content').highlight('lorem', { wordsOnly: true });
 *
 *   // don't ignore case during search of term 'lorem'
 *   $('#content').highlight('lorem', { caseSensitive: true });
 *
 *   // wrap every occurrance of term 'ipsum' in content
 *   // with <em class='important'>
 *   $('#content').highlight('ipsum', { element: 'em', className: 'important' });
 *
 *   // remove default highlight
 *   $('#content').unhighlight();
 *
 *   // remove custom highlight
 *   $('#content').unhighlight({ element: 'em', className: 'important' });
 *
 *
 * Copyright (c) 2009 Bartek Szopka
 *
 * Licensed under MIT license.
 *
 */jQuery.extend({
    highlight: function (node, re, nodeName, className) {
        if (node.nodeType === 3) {
            var match = node.data.match(re);
            if (match) {
                var highlight = document.createElement(nodeName || 'span');
                highlight.className = className || 'highlight';
                var wordNode = node.splitText(match.index);
                wordNode.splitText(match[0].length);
                var wordClone = wordNode.cloneNode(true);
                highlight.appendChild(wordClone);
                wordNode.parentNode.replaceChild(highlight, wordNode);
                return 1; //skip added node in parent
            }
        } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children
                !/(script|style)/i.test(node.tagName) && // ignore script and style nodes
                !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted
            for (var i = 0; i < node.childNodes.length; i++) {
                i += jQuery.highlight(node.childNodes[i], re, nodeName, className);
            }
        }
        return 0;
    }});jQuery.fn.unhighlight = function (options) {
    var settings = { className: 'highlight', element: 'span' };
    jQuery.extend(settings, options);

    return this.find(settings.element + "." + settings.className).each(function () {
        var parent = this.parentNode;
        parent.replaceChild(this.firstChild, this);
        parent.normalize();
    }).end();};jQuery.fn.highlight = function (words, options) {
    var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false };
    jQuery.extend(settings, options);

    if (words.constructor === String) {
        words = [words];
    }
    words = jQuery.grep(words, function(word, i){
      return word != '';
    });
    words = jQuery.map(words, function(word, i) {
      return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
    });
    if (words.length == 0) { return this; };

    var flag = settings.caseSensitive ? "" : "i";
    var pattern = "(" + words.join("|") + ")";
    if (settings.wordsOnly) {
        pattern = "\\b" + pattern + "\\b";
    }
    var re = new RegExp(pattern, flag);

    return this.each(function () {
        jQuery.highlight(this, re, settings.element, settings.className);
    });};


查看完整回答
反对 回复 2019-06-17
?
潇湘沐
function hiliter(word, element) {
    var rgxp = new RegExp(word, 'g');
    var repl = '<span class="myClass">' + word + '</span>';
    element.innerHTML = element.innerHTML.replace(rgxp, repl);}hiliter('dolor');


查看完整回答
反对 回复 2019-06-17
?
忽然笑

为什么使用自动高亮显示功能是个坏主意

从头开始构建自己的突出显示功能可能是个坏主意,因为您肯定会遇到其他人已经解决的问题。挑战:

  • 您需要删除带有HTML元素的文本节点,以突出显示匹配的内容,而不需要破坏DOM事件并一次又一次地触发DOM重新生成(这是一次又一次的情况。

    innerHTML)

  • 如果要删除突出显示的元素,则必须删除HTML元素及其内容,还必须将拆分的文本节点组合起来进行进一步搜索。这是必要的,因为每个荧光笔插件都会在文本节点内搜索匹配项,如果您的关键字将被分割成几个文本节点,它们将不会被找到。
  • 您还需要构建测试,以确保您的插件在您没有考虑过的情况下工作。我说的是跨浏览器测试!

听起来很复杂?如果您想要一些特性,例如忽略高亮、对话映射、同义词映射、iframes内部搜索、分隔词搜索等的一些元素,这将变得越来越复杂。

使用现有插件

当使用现有的、实现良好的插件时,您不必担心上面提到的东西。文章10个jQuery文本高亮插件在SitePoint上比较流行的荧光插件。这包括这个问题的答案插件。

看一看Mark.js

Mark.js是这样一个插件,它用纯JavaScript编写,但也可以作为jQuery插件使用。开发它的目的是提供比其他插件更多的选择:

  • 分别搜索关键字而不是完整的术语
  • 地图判断学(例如,如果“法官”也应该与“公正”相匹配)
  • 忽略自定义元素中的匹配
  • 使用自定义突出显示元素
  • 使用自定义突出显示类
  • 地图自定义同义词
  • 在iframes内部也进行搜索
  • 收不到条款

演示

或者你可以看到这把小提琴.

使用实例:

// Highlight "keyword" in the specified context$(".context").mark("keyword");
// Highlight the custom regular expression in the specified context$(".context").markRegExp(/Lorem/gmi);

它是在GitHub上免费开发的开源程序(工程参考).


查看完整回答
反对 回复 2019-06-17

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信