以下基于 jquery 1.7.2
目的是扩展jQuery的伪类选择器:仿照:last增加:middle。
扩展过程中需要修改origPOS的值(jQ源码第4840行),并且jQuery将它暴露出来了(jq源码4851行)
// Expose origPOS
// "global" as in regardless of relation to brackets/parens
Expr.match.globalPOS = origPOS;
以下是我的扩展修改代码
(function($){
$.expr.match.POS =
new RegExp($.expr.match.POS.source.replace(/odd/,'odd|middle'));
$.expr.leftMatch.POS =
new RegExp($.expr.leftMatch.POS.source.replace(/odd/,'odd|middle'));
})(jQuery);
但是这样并没有改变origPOS的值(debug):

正确的source值应该是:(nth|eq|gt|lt|first|last|even|odd|middle)(?:\((\d*)\))?(?=[^\-]|$)/ 少|middle
但是此时输出$.expr.match.POS的值是正确的

估计是执行顺序不对导致的:
jQ整体是一个自执行函数,我在外部修改时jq的内部相关处理已经执行完毕,导致扩展失败。
感觉是我的扩展方式不对,请各位大大帮我解惑,谢谢!
===
接着补充:
jQ将此变量暴露应该是可以修改的。而且目的是扩展,所以jq源码是不能有改动的。
我在jQ 1.8.0上扩展是成功的
http://jsbin.com/qayuza/7/edit?html,console,output
console可弹出 4
扩展代码:
$.expr.match.POS =
new RegExp($.expr.match.POS.source.replace(/odd/,'odd|middle'),'ig');
$.expr.setFilters.middle = function(elements,argument,not){
var firstLast = [elements.pop(),elements.shift()];
return not ? firstLast : elements;
};
并且值matchExpr["POS"](对应1.7 的origPOS)是正确的

难道是这是bug?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号