0

特定のクラス名の要素を非表示または表示する関数があります。

$.fn.questionDetails = function(base_element, details_yes_no) {
  var details_element = '.' + base_element + '_details';
  var radio_element = '#' + base_element + '_' + details_yes_no;

  if ($(radio_element).attr('checked')) {
    $(details_element).show();
  } else {
    $(details_element).hide();
  }
}

この関数をアタッチ/バインドして、ページが読み込まれたときと特定のラジオ ボタン グループが変更されたときに 2 つのパラメーターで呼び出されるようにします。現時点では、これを達成するために次のコードを使用しています。

$(function() {
  // $.fn.questionDetails defined here, in same scope

  $.fn.questionDetails('question1', 'yes');
  $('input:radio[name=question1]').change().questionDetails('question1', 'yes');
}

最初の関数呼び出しは正常に機能します。ページが読み込まれると、question1_details パネルが表示または非表示になります。ただし、選択されているラジオボタンを変更すると、関数が正しく呼び出されないように見えます。また、change() 行を次のように変更しても機能しません。

$('input:radio[name=question1]').change($.fn.questionDetails('question1', 'yes'));

「ページがロードされたとき、および特定のラジオボタングループが変更されたときに、これらのパラメーターを使用してこの関数を呼び出す」と、最小限の繰り返しで言えるようにしたいと考えています。これについて最善の方法は何ですか?私はjQueryに比較的慣れていないので、最初から「間違った」方法でやっている可能性があります。

編集:これは最初に言及する必要がありました-私はjQuery 1.7.1を使用しています。

4

4 に答える 4

1

(イベント以外の)パラメーターを受け取る関数への呼び出しをイベントハンドラーに割り当てる場合は、次のように、その呼び出しを無名関数でラップする必要があります。

$('input:radio[name=question1]').change(function() {
    $.fn.questionDetails('question1', 'yes')
});

なんで?change()関数は、関数参照が渡されることを期待しているためです。あなたがそうするとき、あなたは関数参照ではなく、関数へchange($.fn.questionDetails('question1', 'yes'))の呼び出しの結果を渡します。$.fn.questionDetails('question1', 'yes')

于 2012-08-06T09:50:02.897 に答える
1

私はこのようなことを試してみます:

$('input:radio[name=question1]').change(function(ev) {
    ev.preventDefault();
    $.fn.questionDetails('question1', 'yes');
});

コールバックに渡すパラメーターを動的に決定する必要がある場合は、カスタム イベントをトリガーします。

$('input:radio[name=question1]').change(function(ev) {
    ev.preventDefault();
    var param1 = // A param you'd like to pass to the callback
    var param2 = // Another param
    $(this).trigger('mycustomevent', [param1, param2]);
});

その後、入力の変更時に発生するカスタム イベントをバインドし、次のようにパラメーターにアクセスできます。

$('input:radio[name=question1]').on('mycustomevent', function(ev, param1, param2){
    $.fn.questionDetails(param1, param2);
});

編集:

jQuery docでわかるように、トリガー関数を使用すると、コールバック関数に渡されるパラメーターの配列を含めることができます。

jQuery 1.7 以降を使用していると思います。そうでない場合は、イベントを添付する代わりにbindまたは関数を使用する必要があります。liveon

于 2012-08-06T09:51:32.913 に答える
0

まず、jquery 1.7.* を使用している場合は、関数の代わりにchange()関数を使用してみてください。on()以前のバージョンを使用している場合は、bind()またはを使用しますlive()

change() を使用したい場合は、関数をパラメーターとして変更に渡さないでください。代わりに、匿名関数を使用してから、その匿名関数内で関数を呼び出します。

于 2012-08-06T09:53:19.043 に答える
0

これを試して

$.fn.questionDetails = function(base_element, details_yes_no) {
  var details_element = '.' + base_element + '_details';
  var radio_element = '#' + base_element + '_' + details_yes_no;

    $(radio_element).change(function(){
        $(details_element).toggle();
    });
}
于 2012-08-06T10:01:55.443 に答える