几周前我正在努力解决同样的问题。我发现,结果已经代表了一个元素列表(如果有的话),并且可以遍历它。我需要构建一个 jQuery 插件来实现部分或完整文本字符串的搜索,这意味着任何 DOM 元素的内部文本,如 LI 或 H2。我在他的页面上得到了初步的了解:Document.evaluate() | MDN
几个小时后,我运行了插件:仅在“p”元素中搜索单词“architecture”,找到部分匹配的字符串(<p>todays architecture in Europe</p> 的“true”)而不是整个文本的匹配项(<h2>architecture</h2>) .
var found = $('div#pagecontent').findtext('architecture','p',true);
找到的结果是常规的jQuery对象,可以照常使用。
found.css({ backgroundColor: 'tomato'});
上面的用法示例可以像这样更改,以搜索整个文档和像这样的所有节点类型(部分结果)
var found = $('body').findtext('architecture','',true);
或仅完全匹配
var found = $('div#pagecontent').findtext('architecture');
插件本身显示了一个变量“es”,它是“element”的单个“e”的复数形式。你可以看到,结果是如何迭代的,并用f = f.add($(e)) 收集到一堆对象中(其中“f”代表“found”)。函数的开头处理不同的条件,例如完全或部分搜索(“c”表示条件)和搜索的文档范围(“d”)。
它可以在任何需要的地方进行优化,可能并不代表最大的可能性,但它代表了我目前的最佳知识,运行没有错误,它可能会回答你的问题,希望如此。就是这样:
(function($) {
$.fn.findtext = function(s,t,p) {
var c, d;
if (!this[0]) d = document.body;
else d = this[0];
if (!t || typeof t !== 'string' || t == '') t = '*';
if (p === true) c = './/'+t+'[contains(text(), "'+s+'")]';
else c = './/'+t+'[. = "'+s+'"]';
var es = document.evaluate(c, d, null, XPathResult.ANY_TYPE, null);
var e = es.iterateNext();
var f = false;
while (e) {
if (!f) f = $(e);
else f = f.add($(e));
e = es.iterateNext();
}
return f || $();
};
})(jQuery);