`
feipigzi
  • 浏览: 111372 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

javascript实现文本高亮

阅读更多

  一个实验项目需要用到文本高亮的功能,使用javascript实现文本高亮的方法,暂时能想到的方法就是在给文本加上标签,然后添加样式。而如何给文本包裹一个标签,暂时也只想到两个方法:1、使用dom操作 2、用正则修改html代码

 

下午试验了一下使用dom操作的方法

 

/**
 * 使用原生javascript操作dom,实现文本高亮
 */

var HIGH_LIGHT_CLS = 'high-light';
var WRAP_TAG_NAME = 'a';
var TEXT_TYPE = 3;
var ELEMENT_TYPE = 1;
var COLOR = '#FFFF96';

Highlighter = function() {
	this.lastKey = null;
};

Highlighter.prototype = {
	/**
	 * 取消高亮
	 * @param {ElementNode} node #require
	 * @param {Node} parent #imply
	 */
	lowLightNode : function(node, parent) {
		//如果不是元素节点则退出
		if (!node || node.nodeType != ELEMENT_TYPE) {
			return;
		}
		//如果parent参数没传则默认使用node节点的父亲节点
		parent = parent ? parent : node.parentNode;
		//取得节点对应的文本值
		var text = node.firstChild.nodeValue + '';
		//使用文本节点替换元素节点
		parent.replaceChild(document.createTextNode(text), node);
	},

	/**
	 * 高亮
	 * @param {String} key 关键字 #require
	 * @param {TextNode} node #require
	 * @param {Node} parent #imply
	 */
	highlightNode : function(key, node, parent) {
		//如果不是文本节点则退出
		if (!node || node.nodeType != TEXT_TYPE) {
			return;
		}
		//如果没有传parent参数则parent默认为node节点的父亲节点
		parent = parent ? parent : node.parentNode;
		//大小小不敏感
		key = key.toLowerCase();
		//取得文本节点的值
		var text = node.nodeValue;
		//每次截取关键字后剩余的文本
		var remain = text + '';
		//每次截取时关键字对于文本值的的索引
		var index;
		//创建片段
		var fragment = document.createDocumentFragment();
		var count = 0;
		
		//对文本内容循环截取关键字,截取的每部分都包裹上一个classname为'high-light'
		//背景色为黄色, 的 a标签,
		while ((index = remain.toLowerCase().indexOf(key)) != -1) {
			
			//关键字前面部分的文本
			var beforeMatch = remain.substring(0, index);
			if (beforeMatch.length > 0) {
				fragment.appendChild(document.createTextNode(beforeMatch));
				count++;
			}
			
			//对文本包裹了a标签后的元素
			var wrapEl = document.createElement(WRAP_TAG_NAME);
			//设置包裹元素的html代码
			wrapEl.innerHTML = remain.substring(index, index + key.length);
			//设置classname
			wrapEl.setAttribute("class", HIGH_LIGHT_CLS);
			wrapEl.setAttribute("className", HIGH_LIGHT_CLS); // for IE
			//设置背景色
			wrapEl.style.backgroundColor = COLOR;
			//往片段添加包裹后的文本相关节点
			fragment.appendChild(wrapEl);
			count++;

			remain = remain.substring(index + key.length);
		}
		//截取完关键字后,添加剩余的文本
		if (remain.length > 0) {
			fragment.appendChild(document.createTextNode(remain));
			count++;
		}
		//将截取到的对应的文本节点替换成a标签元素节点
		parent.replaceChild(fragment, node);
		//返回截取到的关键字数量
		return count;
	},

	//判断一个节点(节点是否为对应关键字的包裹节点)
	isWrapEl : function(node, key) {
		if (key) {
			//比较节点类型
			if (node.nodeType == ELEMENT_TYPE) {
				//比较标签名
				if (node.tagName.toLowerCase() == WRAP_TAG_NAME.toLowerCase()) {
					//比较classname
					var cls = (node.getAttribute("class") || node.getAttribute("className") || "").toLowerCase();
					if (cls.indexOf(HIGH_LIGHT_CLS.toLowerCase()) != -1) {
						var firstNode = node.firstChild;
						//比较文本值
						if (firstNode
								&& firstNode.nodeValue
								&& firstNode.nodeValue.toLowerCase().indexOf(
										key.toLowerCase()) != -1) {
							return true;
						}
					}
				}
			}
		}
		return false;
	},
	
	/**
	 * 
	 * @param {HtmlElement} el #required 对el元素的所有子节点进行关键字高亮
	 * @param {String} key #required 关键字
	 * @param {bool} earseLast #imply 是否擦出上一次高亮(可能两次高亮的关键字不一样)
	 * @param {bool} forece #imply 强制高亮
	 */
	highlight : function(el, key, earseLast, force) {
		if(!el) return;
		if (this.lastKey == key && force !== true) return;
		doHighlight(el, key, earseLast, this);
		this.lastKey = key;
	},
	
	/**
	 * @param {} el #required 对el元素的所有子节点取消所有文本高亮
	 */
	removeAllHighlight : function(el){
		if(!el) return;
		doRemoveAllHighlight(el, this);
		this.lastKey = null;
	}
};

//只是不想上边代码太长,就写下来了
function doRemoveAllHighlight(el, me){
	//获取el下的所有子节点
	var nodes = el.childNodes;
	for ( var i = 0; i < nodes.length; i++) {
		var node = nodes[i];
		var nodeType = node.nodeType;
		//如果是元素节点
		if (nodeType == ELEMENT_TYPE) {
			//如果确定是高亮包裹的元素
			if (me.isWrapEl(node, me.lastKey)) {
				//进行取消高亮操作
				me.lowLightNode(node);
			}else{
				//递归子节点进行取消高亮				
				doRemoveAllHighlight(node, me);
			}
		}
	}
} 

function doHighlight (el, key, earseLast, me) {
	//大小写不敏感
	key = key.toLowerCase();
	//获得el下的子节点
	var nodes = el.childNodes;
	for ( var i = 0; i < nodes.length; i++) {
		var node = nodes[i];
		var nodeType = node.nodeType;
		// 如果是文本节点
		if (nodeType == TEXT_TYPE) {
			var text = node.nodeValue;
			// 如果该文本节点的文本值包含关键字
			if (text.toLowerCase().indexOf(key) != -1) {
				//进行高亮 (因为nodes.length会实时对应dom的状态做更新,所以要改变迭代的i)
				i = i + me.highlightNode(key, node, el) - 1;
			}
		}
		// 如果是元素节点
		else if (nodeType == ELEMENT_TYPE) {
			//判断是否为上次高亮包裹的元素,并且是否需要擦出
			if (me.isWrapEl(node, me.lastKey) && earseLast === true) {
				//擦出上次高亮
				me.lowLightNode(node);
				// 当前索引对应的节点再走一次
				i--;
			} else {
				//递归进行高亮
				doHighlight(node, key, earseLast, me);
			}
		}
	}
}
分享到:
评论

相关推荐

    jsdiff一个javascript的文本差异比较实现

    jsdiff作为一个强大的JavaScript文本比较库,提供了多种比较方式和丰富的API,使得在Web应用中实现文本差异比较变得简单易行。无论是开发代码审查工具,还是构建协同编辑系统,jsdiff都是一个值得信赖的选择。通过...

    10行 JavaScript 实现文本编辑器

    在这个"10行 JavaScript 实现文本编辑器"的主题中,我们将探讨如何利用简单的JavaScript代码创建一个基本的文本编辑器。 首先,我们需要理解JavaScript的基本语法和DOM(Document Object Model)操作。DOM是HTML或...

    jquery高亮插件(支持textarea内容高亮)

    **jQuery高亮插件——实现文本高亮与关键词查找** jQuery是一个广泛使用的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画以及Ajax交互。在网页开发中,有时我们需要对页面上的特定文本或者关键词进行...

    Swing实现编辑器(支持语法高亮)

    总的来说,使用Swing实现一个支持语法高亮的编辑器是一项挑战性的任务,需要深入理解GUI编程、文本处理和解析技术。但通过精心设计和适当利用已有资源,可以创建出功能强大、用户友好的代码编辑器。

    高亮显示XML文本内容

    在实际应用中,有一些知名的代码高亮库,如JavaScript的`Prism.js`、`highlight.js`,或是Java的`Prettify`等,它们可以集成到网页或编辑器中,实现XML的语法高亮。对于桌面端的开发,很多代码编辑器如Visual Studio...

    react中实现搜索结果中关键词高亮显示

    在React中实现搜索结果中关键词高亮显示的核心知识点可以分为几个部分: 1. 使用React组件的状态(state)和属性(props)进行交互。 2. 利用JavaScript的filter函数对数据进行过滤。 3. 使用正则表达式(RegExp)...

    代码高亮显示javascript插件

    "代码高亮显示JavaScript插件"是专门用于在Web页面中美化和突出显示JavaScript代码的工具,它能够将原始的黑白文本代码转换为具有不同颜色、字体和样式的视觉盛宴。本文将深入探讨这一主题,详细介绍JavaScript代码...

    HRjs微小JavaScript插件用于高亮显示和替换DOM中的文本

    总结,HR.js是一款实用的JavaScript插件,适用于快速实现文本高亮和替换功能。它的简洁API使得集成和自定义变得简单,而其高效的实现则保证了在各种场景下的良好性能。对于任何需要对页面文本进行处理的项目,HR.js...

    JavaScript简单实现关键字文本搜索高亮显示功能示例

    本文实例讲述了JavaScript简单实现关键字文本搜索高亮显示功能。分享给大家供大家参考,具体如下: &lt;!DOCTYPE ...

    易语言超级编辑框实现的javascript代码高亮

    总的来说,实现易语言超级编辑框中的JavaScript代码高亮涉及了文本解析、颜色样式设置和用户交互等多个方面。这是一项既需要理解编程语言语法,又需要掌握易语言API应用的技术挑战。通过这样的功能,开发者可以在...

    Js高亮显示文本输入框.rar

    在JavaScript编程中,高亮显示文本输入框是一个常见的需求,特别是在开发富文本编辑器、代码编辑器或搜索功能时。这个“Js高亮显示文本...通过学习和理解这段代码,你将能够更好地掌握JavaScript文本高亮的核心技巧。

    jquerymark强大的jQuery关键字文本高亮插件

    `jquery.mark`是一个高效且灵活的jQuery插件,专为实现文本高亮功能而设计。这个插件的核心功能是能够快速地在网页中的文本中找到并高亮显示用户指定的关键字,无论是单个词汇、变音符号、同义词还是自定义元素,它...

    javascript关键字高亮代码

    虽然故事本身并不直接关联到具体的IT技术细节,但从文档的部分内容可以看出,它涉及到了HTML与JavaScript的基本用法,尤其是如何在网页中实现文本关键字的高亮显示。 ### 关键词高亮显示 关键词高亮显示是一种常见...

    react-一个可以把文本中多个关键字高亮显示的react组件

    这个组件可以帮助开发者轻松地实现关键词高亮功能,提升用户在浏览和搜索文本时的体验。 首先,让我们了解React组件的基本概念。React是Facebook开源的一个JavaScript库,用于构建用户界面,尤其是单页应用。它采用...

    language-javascript-semantic, 面向 Atom的JavaScript语义高亮.zip

    1. **源代码**:实现语义高亮功能的JavaScript和CSS文件,这些文件定义了如何解析JavaScript代码并应用相应的高亮样式。 2. **配置文件**:可能包括`.cson`或`.json`文件,用于设置插件的行为,如启用/禁用某些特性...

    JavaScript实现关键字高亮功能

    通过这样的JavaScript实现,我们可以对页面的特定文本进行动态的高亮显示,无需后端支持,提高页面加载速度,并且可以实现更丰富的交互效果。这不仅适用于搜索结果页面,也可以广泛应用于文章阅读、论坛帖子、列表...

    javascript关键字实时自动高亮

    描述中提到的“本资料介绍了两种能让文本中的关键字实现高亮显示的javascript的代码”,意味着我们将探讨两种不同的方法来实现这一功能。一种方法可能是基于DOM遍历,另一种可能是利用正则表达式查找。这两种方式都...

    JavaScript应用实例-文本搜索高亮.js

    JavaScript应用实例-文本搜索高亮.js

Global site tag (gtag.js) - Google Analytics