0

関連する質問がこのサイトや他の場所に既にいくつかありますが、どの回答も私の状況には当てはまらないようです。HTMLにはたくさんのラジオボタンがあります。

<input type="radio" name="b1" value="aa"> aa<br>
<input type="radio" name="b1" value="ab"> ab<br>
<input type="radio" name="b1" value="ac"> ac<br>

<input type="radio" name="b2" value="ba"> ba<br>
<input type="radio" name="b2" value="bb"> bb<br>
<input type="radio" name="b2" value="bc"> bc<br>

<script type="text/javascript">
var PK = {    
   modes: ["b1", "b2"],

   init: function() {        
      // attach actions to radio buttons
      for (var key in this.modes) {
          var mode = this.modes[key];
          $("input[name='" + mode + "']").bind(
               "change", 
               function() { 
                 PK[mode]($("input[name='" + mode + "']:checked").val()); 
               } 
          );
       }
    },

    b1: function(val) { .. do something .. },

    b2: function(val) { .. do something else .. },
};

$(document).ready(function() {
   PK.init();
});
</script>

上記はまったく機能しません。.bind の代わりに .live を試しましたが、それでも期待どおりに動作しません。実際、どちらもアクションをモードの最後のエントリ (上記の「b2」) にバインドします。つまり、b1 または b2 ボタンの値を変更するかどうかにかかわらず、関数 PK.b2() が起動されます。モードのエントリを逆にすると、最後のエントリが値を取ります。上記をうまく達成するにはどうすればよいですか?

4

4 に答える 4

3

JavaScript クロージャーは親関数のスコープを使用するため、PK[mode]常に最後のmode. これを回避するには、次のようにします。

$("input[name=" + mode + "]").bind(
    "change", 
    function(mode) { 
        return function() {
             PK[mode]($("input[name='" + mode + "']:checked").val());
        };
    }(mode)
);

詳細については、たとえば、この記事の悪名高いループの問題セクションを参照してください。

于 2009-10-03T19:05:02.493 に答える
2

コードの for ループでは、さまざまなモードに対して毎回変数モードが設定されます。ただし、ループの最後の値のみが保持されます。代わりに、バインド内の関数にいくつかの変更を加える必要があります。

$("input[name=" + mode + "]").bind(
    "change", 
    function(e) {
        PK[$(this).attr('name')]($(this).val()); 
    } 
);

現在、ループからのデータの最後のビットのみを持つ変数に依存するのではなく、jquery を使用して作業中のアイテムの名前を把握しています。

于 2009-10-03T18:58:31.337 に答える
0

これがあなたがやりたいことであるなら、私はあなたが正しいことを理解していますか?

init: function() {
    // attach actions to radio buttons
    for (var key in this.modes) {
        var mode = this.modes[key];
        $("input[name='" + mode + "']")
            .bind("change", function(e) {
                var radio = e.srcElement;
                PK[radio.name](radio.value);
            })
            .bind("click", function() {
                // Loose focus of the radio button once clicked,
                // so the change-event fires
                this.blur();
            });
    }
},
于 2009-10-03T19:52:34.440 に答える
0

私が見たところ、2つの問題があります。

まず、lrudor が指摘したようmode、クロージャーでは反復される最後のモードです。

次に、[name=whatever]の代わりに使用し[name="whatever"]ます。

于 2009-10-03T19:13:14.963 に答える