Angular JS文本高亮指令
Angular JS text highlighter directive
我想要一个指令,根据搜索字符串在元素中突出显示文本。
大多数可用的解决方案使用过滤器而不是指令,使用方式如下:
<div ng-html-bind-unsafe="This is the contents for this div | highlight:highlightText"></div>
下面是一个例子
我宁愿使用指令而不是过滤器,因为我不喜欢把元素的内容放在ng-html-bind属性中。我觉得元素的内容应该在里面。
无论如何,我写了这个指令,但想知道是否有更好的方法来写它。我觉得这不是最有效的方法。这是小提琴。注意,<code>
元素中的文本没有突出显示。这是因为.contents()只返回元素的直接子节点和文本节点。这种行为没有问题,除非有一种非常简单的方法递归遍历每个子元素的内容。
对于遍历每个子元素的内容,可以使用递归。将添加高光笔和删除高光笔的代码放入一个函数中,并为每个子元素调用这些函数。
.contents()返回一个Jquery对象。如果node.nodeType === 1
,将其转换为一个角元素并再次对其调用contents()。
/*Function to add Highlighters*/
scope.addHighlight = function (elm, value) {
angular.forEach(elm.contents(), function (node) {
if (node.nodeType === 3 && scope.needle.test(node.nodeValue)) {
node = angular.element(node);
node.after(node[0].nodeValue.replace(scope.needle, '<span class="highlight">$1</span>')).remove();
} else if (node.nodeType === 1) {
node = angular.element(node);
if (node.contents().length > 0) scope.addHighlight(node, value);
}
});
}
/*Function to remove current Highlighters*/
scope.removeHighlight = function (elm, value) {
angular.forEach(elm.contents(), function (node) {
nodetype = node.nodeType;
node = angular.element(node);
if (node[0].nodeName === 'SPAN' && node.hasClass('highlight')) {
node.after(node.html()).remove();
elm[0].normalize();
}
if (node.children().length > 0 && nodetype === 1) scope.removeHighlight(node, value);
});
}
相关文章:
- 从桌面读取python文件时高亮显示代码
- 高亮显示时编辑文本大小和颜色
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- 高亮显示与数组字符串一起使用时文本插件中断
- FF视图源|脚本高亮显示为红色
- 父页面的角度路由器导航高亮显示
- OpenLayers在悬停时高亮显示功能,并在单击时选择
- 当DIV中的文本高亮显示时,如何获得DIV中Span的值?(Javascript)
- 延迟高亮显示文本区域中的文本
- Mootools:如何在点击时保持元素高亮显示并停止所有事件
- 高亮显示单击菜单链接
- 在字符串列表中搜索任何出现的单词,如果单词的第一个字符匹配,则高亮匹配单词.Javascript正则表达式
- Firefox-当不在输入控件上时隐藏焦点高亮显示
- 高亮显示包含<br>以及重新格式化网格
- 使用下拉选择菜单高亮显示一行表格单元格
- javascript高亮文本字符串
- 如何限制javascript高亮显示函数的使用次数
- 在GXT中激活上下文菜单时,如何保持选中的文本高亮显示?(EXT GWT 2.x)
- 为什么数据迷你和数据高亮在滑块(jquery)中不起作用
- Angular JS文本高亮指令