すべてのHTML選択オプションを単純に返すajax呼び出しで動的に入力される選択フィールドがあります。以下はPHPの一部で、selectタグをエコーし、各オプション/値を動的に入力します。
echo "<select name='player1' class='affector'>";
echo "<option value='' selected>--".sizeof($start)." PLAYERS LOADED--</option>";
foreach ($start as $value) {
echo "<option value='".$value."'>".$value."</option>";
}
echo "</select>";
}
このリストにデータが入力された後、変更イベントを呼び出そうとしています。そのため、SELECTリストまたは同じクラスのテキストフィールドでデフォルトオプションが変更されるたびに、フォームの別の部分に設定されたラジオボタンが無効になります。 (機能のこの部分を動作させるために私が尋ねた最初の質問を見ることができます here )
$('.affector').change(function(){
$(this).parents('tr').find('input:radio').attr('disabled', false);
});
何らかの理由で、選択フィールドに適切なクラス名(affector)を指定しても、フィールドで別のオプションを選択すると、フォームの他の部分は無効になりません。同じクラスの静的テキストフィールドは正常に機能します。私は困惑しています。
何か案は?
あなたの最後の質問にコメントしました...私が言ったことは次のとおりです:
JQueryバインドを使用
function addSelectChange() {
$('select').bind('change', function() {
// yada yada
});
}
Ajax成功関数でaddSelectChangeを呼び出します。トリックを行う必要があります。 jQueryライブイベントもご覧ください(後のプロジェクトなどで、現在および将来のすべてのDOM要素にイベントを設定する場合)。残念ながら、変更イベントと他のいくつかのイベントは、ライブではまだサポートされていません。バインドは次善の策
最新の回答..
要素は動的に設定されるため、 イベント委任 を探しています。
ただし、.live()
/.bind()
/.delegate()
は使用しないでください。 .on()
を使用する必要があります。
jQuery API docs によると:
JQuery 1.7以降、
.on()
メソッドは、イベントハンドラーをドキュメントにアタッチするための推奨メソッドです。以前のバージョンでは、.bind()
メソッドを使用して、イベントハンドラーを要素に直接アタッチします。ハンドラーは、jQueryオブジェクトで現在選択されている要素にアタッチされるため、これらの要素は.bind()
の呼び出し時に存在する必要があります発生します。より柔軟なイベントバインディングについては、.on()
のイベント委任の説明を参照してください。
したがって、次のようなものを使用します。
$(document).on('change', 'select', function (e) {
/* ... */
});
.live()を使用した例
$('#my_form_id select[name^="my_select_name"]').live('change', (function () {
console.log( $("option:selected", this).val());
})
);
DOMに動的に挿入されるアイテムの場合、それらのイベントは
_$('.selector').bind('change',function() { doWork() });
_
これは、$(function(){});
を実行し、_$.click
_または_$.change
_などを使用してイベントをバインドすると、イベントを要素にバインドしているためです既にDOMに存在します 。その後に行う操作は、$(function(){});
呼び出しで発生するものの影響を受けません。 _$.bind
_は、現在の要素だけでなくセレクタ内の将来の要素も検索するようページに指示します。
唯一の解決策として見つけました
<select id="myselect"></select>
php/htmlファイルで、ajaxによってそのオプションを生成します。
$.post("options_generator.php", function (data) { $("#myselect").append(data); });
Options_generator.phpエコーオプションのみ:
echo "<option value='1'>1</option>";
echo "<option value='2'>2</option>";
.liveを試してください: http://docs.jquery.com/Events/live
Docsから:現在および将来のすべての一致要素のハンドラーをイベント(クリックなど)にバインドします。カスタムイベントをバインドすることもできます。
代わりにdelegate()関数を使用してください。詳細はこちら http://www.elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/