Javascript 创建自定义jQuery筛选器
我刚刚了解到,您可以非常轻松地为jquery创建自定义过滤器,并组合一个过滤器,以便在文本内容或任何属性上使用正则表达式匹配函数 我预先设置了要与普通正则表达式匹配的属性,我知道这很奇怪,请不要被这抛到脑后,或者少考虑我 我遇到的问题是,正则表达式中是否有要匹配的括号。有时它是好的,有时它会导致语法错误 精细:Javascript 创建自定义jQuery筛选器,javascript,jquery,regex,Javascript,Jquery,Regex,我刚刚了解到,您可以非常轻松地为jquery创建自定义过滤器,并组合一个过滤器,以便在文本内容或任何属性上使用正则表达式匹配函数 我预先设置了要与普通正则表达式匹配的属性,我知道这很奇怪,请不要被这抛到脑后,或者少考虑我 我遇到的问题是,正则表达式中是否有要匹配的括号。有时它是好的,有时它会导致语法错误 精细::匹配(src/jquery.+\.(js)/i) 错误::匹配(src/jquery.+\.js()/i) 有人能从这个代码中告诉我这种行为的原因吗 // create new jque
:匹配(src/jquery.+\.(js)/i)
错误::匹配(src/jquery.+\.js()/i)
有人能从这个代码中告诉我这种行为的原因吗
// create new jquery filter
jQuery.expr[':'].match = function(e,i,p) { // element, index, params
// split params by custom format
m = p[3].match(/^([a-z]*)(\/?)(.+)\2([a-z]*)$/)
// set the attribute to be checked
myAttr = m[1] ? m[1] : 'text'
// define regex, including switches
myRegExp = new RegExp(m[3],m[4]);
// check for and return matched elements
if(myAttr == 'text')
return $(e).text().match(myRegExp)
else
return $(e).attr(myAttr) ? $(e).attr(myAttr).match(myRegExp) : false
};
// used like this
// :match(attr/regex/switches)
// or with default match (text) and case insensitivity switch (i):
// :match(/HeLlO WoRl/i)
// or in simplest form
// :match(RegexPattern)
// alert how many jquery plugins of the form jquery.something.js
alert($('script:match(src/jquery.+\.js/i)').length)
由于我对这个问题的回答非常好,我决定将我的过滤器重新设计成一个名为match的插件函数。有人对如何改进有什么意见吗?它是否适用于所有情况
// will save as file called jquery.match.js
// will wrap with
// (function($){
$.fn.match = function(regex, attr){ // optional attr
return this.filter(function(){
var subject = attr ? $(this).attr(attr) : $(this).text()
return subject && subject.match(regex) ? 1 : 0
})
}
// and end with
// })
// used like this: $('body *').match(/some content/)
// or to match attributes like this: $('script').match(/jquery/i,'src')
您的代码似乎失败了,因为第二个正则表达式中有额外的括号。由于jQuery在您可以解析表达式之前就已经解析了,并且不知道预定义的格式,因此它将看到
:match(src/jQuery.+\.js()/i)
为:match(src/jQuery.+\.js()
+/i)
。请注意,第二个括号被解释为接近匹配项
也许有一种方法可以告诉jQuery接受该)
的转义版本,但我不确定如何接受
或者
您可以像这样使用jQuery函数
$('script').filter( function(){
return $(this).attr("src").match( /jquery/i );
});
为了达到插件提供的类似通用性水平,您可以创建一个更高阶的函数来完成这项工作
function createFilterFunction(regex, /*optional*/ attr){
return function(){
if( !attr ){
return $(this).text().match(myRegex);
}
return $(this).attr(attr) ? $(this).attr(attr).match(regex) : false;
};
}
然后你可以像这样使用它:
var isJquery = createFilterFunction( /jquery.+\.js()/i, "src" );
alert( $('script').filter( isJquery ).length );
旁注
在编写javascript时,如果变量前面没有包含
var
,它们将“泄漏”到全局命名空间中。因此,您的变量m
、myAttr
和myRegExp
对任何使用您的脚本的人都是可见的,更重要的是,它将更改它们的值m
、myAttr
,以及myRegExp
(如果存在)。改为像var m=…
那样声明它们。由于第二个正则表达式中的额外括号,您的代码似乎失败了。由于jQuery在您可以解析表达式之前就已经解析了,并且不知道预定义的格式,因此它将看到:match(src/jQuery.+\.js()/i)
为:match(src/jQuery.+\.js()
+/i)
。请注意,第二个括号被解释为接近匹配项
也许有一种方法可以告诉jQuery接受该)
的转义版本,但我不确定如何接受
或者
您可以像这样使用jQuery函数
$('script').filter( function(){
return $(this).attr("src").match( /jquery/i );
});
为了达到插件提供的类似通用性水平,您可以创建一个更高阶的函数来完成这项工作
function createFilterFunction(regex, /*optional*/ attr){
return function(){
if( !attr ){
return $(this).text().match(myRegex);
}
return $(this).attr(attr) ? $(this).attr(attr).match(regex) : false;
};
}
然后你可以像这样使用它:
var isJquery = createFilterFunction( /jquery.+\.js()/i, "src" );
alert( $('script').filter( isJquery ).length );
旁注
在编写javascript时,如果变量前面没有包含
var
,它们将“泄漏”到全局命名空间中。因此,您的变量m
、myAttr
和myRegExp
对任何使用您的脚本的人都是可见的,更重要的是,它将更改它们的值m
、myAttr
,以及myRegExp
(如果存在)。改为像var m=…
那样声明它们。只是好奇,jQuery是否有此功能的文档?我似乎找不到它。我希望能在评论过的源代码中找到它,但我没有看。只是好奇,jQuery有这个特性的文档吗?我似乎找不到它。我希望能在注释过的源代码中找到它,但我没有查找。感谢全局变量的指针。我采纳了你的优秀答案,并将其重新制作成一个插件。你能帮我在刚编辑好的问题的末尾看一下吗?我认为这很好,但我想你可以检查一下,因为它是从你的代码开始的:)谢谢你给全局变量的指针。我采纳了你的优秀答案,并将其重新制作成一个插件。你能帮我在新编辑的问题的末尾看一下吗?我认为这很好,但我想你可以检查一下,因为它是从你的代码开始的:)