検索

ホームページ  >  に質問  >  本文

javascript - 如何修改jQuery的内部暴露值

以下基于 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?

巴扎黑巴扎黑2897日前261

全員に返信(0)返信します

応答なし
  • キャンセル返事