8

jQueryUIダイアログコードを読んで、jQuery .attr()メソッドには文書化されていない動作があることがわかりました。

<button id="btn1">1</button>
<button id="btn2">2</button>

$(function() {
    var props = {
        text: 'Click it!',
        click: function () {
            console.log('Clicked btn:', this);
        }
    };

    $('#btn1').attr(props, true);    // Changes #btn1 inner text to 'Click it!' 
                                     // and adds click handler
    $('#btn2').attr(props);          // Leaves #btn2 inner text as it is and fires 
                                     // click function on document ready
});
  • それがどのように機能するか説明してもらえますか?true属性と値のペアのマップの後に2番目の引数として設定する必要があるのはなぜですか?
  • この機能をプロジェクトで安全に使用できますか?
4

3 に答える 3

3

私はjQueryソースに慣れていないので、ここで少し推測しています。jQuery.attrを呼び出しjQuery.access、jQuery.access関数の上のコメントは次のようになります。

// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function

さらに調査すると、text()関数は次のようにも呼び出しますjQuery.access

    attr: function( name, value ) {
        return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
    },
    .........
    text: function( value ) {
        return jQuery.access( this, function( value ) {
        ......
    },

attrを使用してテキストおよびイベントハンドラーを設定していますが、これはattrの目的ではありません。ただし、それらはすべて同じ関数を使用して作業を実行しているように見えるため、文書化されていないパラメーターを使用すると、偶然に期待される動作が得られます。

jQueryを将来アップグレードするとコードが破損する可能性があるため、ここで実行しようとしていることを実行するために、文書化されていない動作に依存することは信頼できないと思います。

于 2012-10-18T12:59:31.583 に答える
2

jQuery 1.8.2コードを見ると、trueパラメーターは最終的に変数passの次の行に到達します。

exec = pass === undefined && jQuery.isFunction( value );

これが設定されている場合は、キーに属する値をチェックするようにjQueryに指示し、関数の場合はすぐに呼び出します。したがって、その関数を登録click: function(...)するのではなく、その関数を呼び出します。

これは、さまざまなjQuery関数のバージョンがどのように機能するか.method(function() { ... }、つまり、プロパティに特定の値を渡す代わりに、元の値が渡され、その戻り値が関連するプロパティに割り当てられる関数を渡す場合のように見えます。

この機能をプロジェクトで安全に使用できますか?

それが文書化されるまで、私はそうしませんでした。

于 2012-10-18T13:00:40.507 に答える
0

これは面白いものです。このように/why/が機能することをお伝えするふりをすることはできません。また、これをバグレポートとしてjQueryに送信する理由もあると思います。なぜなら、彼らが文書化した動作が期待どおりに出てこないからです。 。

このページでは、次の引用が下部に表示されます:http: //api.jquery.com/attr/

"注:setter関数(つまり、function(index、attr){})で何も返されない場合、またはundefinedが返された場合、現在の値は変更されません。これは、特定の基準が満たされた場合にのみ値を選択的に設定する場合に役立ちます。 。」

これにより、私はjsFiddleで遊んでみました:http://jsfiddle.net/mori57/GvLcE/

ドキュメントとは異なり、ケース8と9はnullまたは何も返さないことに注意してください。Alnitakが言及したことを見ると、彼らのテストは/実際に/それが/関数である/その関数が返すものではないことを検証しているだけなので、それは理にかなっているようです(.isFunctionはtrue / falseのみを返す必要があります。これは、返される値はtrue/falseです)。

ただし、最終的には、これは信頼できる機能ではないというAlnitakとbcoughlanの両方に同意しますが、jQueryの将来のリリースで変更される可能性があるため不安定であることに加えて、また、文書化されていない機能に依存するハックに依存することも悪い習慣です。これは、今日作成するコードの将来の開発者(2〜4か月であなたを含む)がそこにあること、またはなぜそのように設定されているのかを簡単に忘れてしまう可能性があるためです。 。明示的であり、文書化された機能を使用する方がはるかに優れています。これにより、自分自身や他の人に、自分のコードが何を意図しているのかが明確になります。

于 2012-10-18T13:19:09.273 に答える