我正在尝试修改插件livefilter for jquery。我需要它来搜索LI的标题标签及其内容。我已经稍微修改了它(@ line#32),因此它不会隐藏匹配,而是会加粗它们以及将背景更改为所有匹配。
我尝试修改以下几行:
/** Case insensitive :contains jQuery pseudo selector */
$.expr[":"].icontains = function(obj, index, meta, stack) {
return (obj.textContent || obj.innerText || jQuery(obj).text() || "").toLowerCase().indexOf(meta[3].toLowerCase()) >= 0;
};
将此内容添加到返回的语句中:
|| jQuery(obj).attr('title')
但这似乎不起作用......
答案 0 :(得分:2)
请注意,因为OR运算符||
,一旦其中一个部分成立,测试就会停止,其他“部分”将根本不会被测试(希望我很清楚)。
这种写作通常被使用,因为浏览器的实现之间存在差异,可能有或没有这些属性。
以下情况就是这种情况:IE< 9不支持textContent
,因此obj.textContent
将被评估为false,然后innerText
将被评估,依此类推。最后一个|| ""
确保最终返回一个字符串,这样代码就不会中断。
这种语法的另一个用途是确保定义一个对象,如下所示:
function foo(bar) {
var _bar = bar || {};
// if "bar" is undefined, "|| {}" will be returned
// we can now surely work with "_bar"
}
进一步阅读:
你想要的是内容和 title属性,所以试试这个:
(obj.textContent || obj.innerText || jQuery(obj).text() || "") + jQuery(obj).attr('title')
<强> DEMO 强>
答案 1 :(得分:2)
如果你在“()”中插入jQuery(obj).attr('title'),它将是“lowerCased”,它将无效。
OR运算符在任何测试返回TRUE时停止句子,因此您需要将代码作为第一个测试而不是最后一个,但这将是一个错误,因为:contains伪选择器仅用于元素内容。
执行所需操作的其他方法是将选择器修改为:
$("someSelector :contains(text), someSelector [title*=text]")
请记住,改变jQuery代码是危险的,但修改插件代码不是