0

2つのJQuery関数を作成したいと思います。一方は、もう一方の関数で作成されたデータを使用します。言う:

jQuery.fn.myScroller = function (child) {
    var $moveable = this.children(child);
    var $children = this.children(child).children();

    posl = posl.replace('px', '');
    post = post.replace('px', '');
    var varList = [];
    $children.each(function () {
        var currVar = {};
        currVar.w = $(this).width();
        varList.push(currVar);
    });
    // I want to save varList variable somehow.
    this.varList = varList; // (1)
};

jQuery.fn.scrollUnitLeft = function () {
    // Now I need to use this varList if this function called
    // But the following returns undefined.
    // However, I've saved it inside this at (1)
    console.log(this.varList)
// More code...
}


$('#main_div').myScroller("#dummydiv");
$('#main_div').scrollUnitLeft();

コードのコメントで説明したように、これは機能しません。

これどうやってするの?

4

4 に答える 4

1

提案されているように名前空間またはグローバル変数を作成することは、私にはきれいに見えません。すでにjQueryを拡張しているので、jQuery変数にします。

jQuery.fn.varList = varList;

編集:私はjQueryの内部を本当に知りません。関数専用の場合fnは、それ自体に入れるかjQuery、ゲッターを作成します

jQuery.fn.getVarList = function () {
    return varList;
}
于 2013-01-16T17:49:39.027 に答える
0

グローバルスコープで名前空間を作成できます。

window.yourNamespace = {};

次に、varList変数をその名前空間に配置します。

yourNamespace.varList = []; //Whatever you want here

このようにして、変数は両方の関数(またはそれに関する任意の関数)で使用できるようになります。

于 2013-01-16T17:47:26.993 に答える
0

あなたの理解はthis私には少しバグがあるように見えます(私を許してください、あなたは私よりもはるかに経験豊富かもしれません)!this関数の呼び出し元を指します。どちらの場合もdivmain_divです。両方の関数の外部で宣言されているグローバル変数を使用するかdata、最初の関数のdivで属性を使用して、2番目の関数でその値にアクセスしてみてください。

于 2013-01-16T17:48:47.500 に答える
0

jQuery関数を実行するときはthis、それぞれの場合に使用されるjQueryオブジェクトインスタンスを参照します。

コードでは、2つのjQueryオブジェクトインスタンス(呼び出しごとに1つ$(...))を作成するため、データは最初のインスタンスで設定されるため、2番目のインスタンスでは使用できません。

同じjQueryオブジェクトインスタンスで両方のメソッドを実行すると、期待どおりに機能します。

jQuery.fn.mySet = function(){
  this.myVar = this.attr('id');
};

jQuery.fn.myGet = function(){
  console.log(this.myVar);
}

$('#a_div').mySet();
$('#a_div').myGet(); // outputs 'undefined'

var $other_div = $('#other_div');
$other_div.mySet();
$other_div.myGet(); // outputs 'other_div'

意図したことを実現するには、jQueryオブジェクトインスタンス以外の場所にデータを永続化する必要があります。jQueryは、メソッドを介してこれを行う方法を提供します.data()。このメソッドを使用すると、DOM要素にデータを添付できます。そのドキュメントを確認してください。

jQuery.fn.myRealSet = function(){
  this.data('myVar', this.attr('id'));
};

jQuery.fn.myRealGet = function(){
  console.log(this.data('myVar'));
}

$('#final_div').myRealSet();
$('#final_div').myRealGet(); // outputs 'final_div'

このスニペットはここでテストできます:http://jsfiddle.net/HPjYn/

編集:他の人の答えについてはまだコメントできませんが、提案されているようにjQueryプロトタイプ変数を追加すると、jQueryオブジェクトインスタンスからデータを利用できるようになります。これは、ここで意図されていることではないと思います。

于 2013-01-16T17:55:42.667 に答える