2

質問

すべての機能を保持しながら jQuery 関数をラップできる最善の方法を知りたいです。本質的には呼び出したいのですが、関数をラップし、引数を変更して、元の jQuery 関数に渡すよう $('#someId')に動作させます。$('#' + id + 'someId')

動機

winId連結されてjQueryに渡される同じ変数を再利用するJSのセクションがあります。書く代わりに

$('#' + winId + 'someId').html();
$('#' + winId + 'someOtherId').css();
...
$('#' + winId + 'someThirdId').text();

ファイル全体を通して、jQuery関数をラップして、呼び出すだけです

$('#someId').html();
$('#someOtherId').css();
...
$('#someThirdId').text();

と をwinId通過する前に と を追加しました$


私の試み

これが私がラッパーとして考えていることです:

(function() {
    var fn = $;

    return $ = function() {
       for ( var i = 0; i < arguments.length; i++ ) {
          if ( typeof arguments[i] == 'string') {
             arguments[i] = /* code to add in winId, omitted */
          }
       }
       return fn.apply( this, arguments );
    }
})();

これはうまく機能しますが、次のような方法が明らかに$.ajax利用できないことを除けば:

Uncaught TypeError: Object function () {
    for ( var i = 0; i < arguments.length; i++ ) {
       if ( typeof arguments[i] == 'string' ) {
          arguments[i] = /* code to add in winId, omitted */
       }
    }
    return fn.apply( this, arguments );
} has no method 'ajax' 

注: を使用してオブジェクトをコピーできることはわかっていますがjQuery.extend($, jQuery)、可能であればそれよりも洗練されたソリューションに興味があります。

4

5 に答える 5

2

Bergi の提案と彼がここにリンクしている投稿に従って、これが 1 つの方法です。

$.fn.extend({
    initCore: $.fn.init,
    init: function (selector, context, rootjQuery) {
        if (typeof selector === 'string' && selector[0] === '#') {
            selector = selector.replace('#', '#' + winId);
        }
        return $.fn.initCore(selector, context, rootjQuery);
    }
});

$.fn.init.prototype = $.fn;

私がテストしたところ、このように、値の前に$('#foo')a が付いた div が見つかります。winIdid<div id="1foo"></div>

例: http://jsfiddle.net/MfdJS/1/

于 2013-09-20T03:23:27.920 に答える
1

要素に class="winID" を追加します。

$(".winID").find('#someId").css(...) を使用して、特定の要素の CSS 属性にアクセスします。

$(".winID").css(...) を使用して、すべての winID タグ付き要素への CSS 属性にアクセスします。

于 2013-09-20T04:09:20.783 に答える
-2

それはかなり奇妙なことです。winId の CSS セレクター文字列を作成して変数として保存してみませんか?

var foo = '#' + winId;

これで、次のことができます。

$(foo + ', #bar').html("add some content"); 

あなたが提案していることは、このプロジェクトに取り組んでいるすべてのプログラマー (今から 6 か月後のあなたを含む) を、$('#bar') を使用して実際に #foo と #bar を選択しているときに完全に当惑させることになります。

于 2013-09-20T03:58:22.860 に答える