コンテンツを AJAX に置き換える場合は、イベントを再度バインドする必要があります。そのため、コンテンツを置き換えた後にイベントを再度バインドすることをお勧めします。
イベントバブリングを使用して回避する方法があります。
JQuery 1.4+ は onchange イベントの伝播をサポートしているため、jquery デリゲート関数を使用して同じことを実現できます。http://api.jquery.com/delegate/
Jquery を使用すると、1 行だけで作業が完了します。
$("#container").delegate("#to_city", "change", doSomething); // Workd in all browsers
IE でサポートされていない addEventListener を使用しているため、以下の例では IE を無視しました。Jqueryなしの動作例(IEでは動作しません): http://codebins.com/bin/4ldqpb1/2
document.getElementById("container").addEventListener( 'change', function(e) {
var targ=e.target;
if (targ.id == "to_city") { //you just want to capture to_city event
//DO STUFF FOR SELECT
//DO STUFF
doSomething();
alert("id: " + targ.id + "\nvalue: " + targ.value);
}
}, false)
説明:
イベントをバインドすると、それらはセレクターや ID ではなく、その特定の要素にバインドされます。そのため、コンテンツと新しい置換要素を同じ ID の新しい要素に置き換えると、新しい要素にはイベントが関連付けられません。そのため、イベントを再度添付する必要があります。したがって、AJAX コンテンツの置換後にイベントを添付すると、doSomething が機能します。しかし、それはあまり良い解決策ではありません。
イベントバブリングの概念を使用しています。多くのイベントがドキュメントの上部にバブルされます。(IE は変更イベントをバブルしません) そこで、コンテナにハンドラーを記述し、イベントをリッスンします。各イベントには、このイベントを起動する dom 要素を示すターゲットまたは srcElement があります。dom 要素が探しているものである場合は、関数を実行します。この can では、ID が to_city の要素を探しています。それが if 条件です。