我不明白这一点。这用于过滤不区分大小写:
jQuery.expr[':'].Contains = function(a,i,m){
return (a.textContent
|| a.innerText
|| "").toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
我们开始吧,编译器风格:
(a.textContent || a.innerText || "")
表示以下内容要么在 a.textContent 中定义的字符串上执行,要么在未设置的情况下在 a.innerText 上执行。两者通常都包含给定元素的文本内容,在这种情况下称为“a”。如果没有定义这些字符串,则使用空字符串来防止执行时出现以下错误。
.toUpperCase()
将该字符串(来自以下部分的结果)转换为大写,从而消除小写字母和大写字母之间的差异。
.indexOf( m[3].toUpperCase() )
indexOf() 获取位置,给定的参数字符串首先在执行它的字符串中找到。例如,("Hello").indexOf("e")
将返回 1(请记住,我们从 0 开始计数)。
m[3] 获取名为“m”的数组的第三个元素——不管它是什么。这个元素,此时必须是一个字符串,然后也转换为大写。当我们现在比较两个大写字符串时,整个函数变得不区分大小写。
因此,indexOf( m[3].toUpperCase() )
将返回“m[3]”在 a.textContent 或 a.innerText 中的位置。
最后一位>=0
是逻辑运算符。如果 indexOf()-Call 的结果返回 0 或更高,它将在该位置将整个表达式变为“true”。由于 indexOf() 准确地返回这个 - 零或更高 - 如果找到了寻找的字符串,如果m[3]
在a.textContent
or中找到,我们有效地得到一个“真” a.innerText
。
这个值是通过使用前导return
关键字从函数返回的。
--Lukx
代码可以像这样重写,更冗长,也许更容易理解。
jQuery.expr[':'].Contains = function(a,i,m){
var text;
if (typeof a.textContent !== 'undefined') {
text = a.textContent;
} else if (typeof a.innerText !== 'undefined') {
text = a.innerText;
} else {
text = "";
}
text = text.toUpperCase();
if (text.indexOf(m[3].toUpperCase()) >= 0) {
return true; // text contains the passed parameter
} else {
return false; // text didn't contain passed parameter.
}
};