4 に答える
$('select').change(onChange($(this));
関数を呼び出すことと、それをオブジェクトとして渡すことの違いを理解する必要があります。関数は JavaScript の第一級オブジェクトであり、他のものと同じようにオブジェクトであるため、変数に格納したり、他の関数に引数として渡したりすることができます。
あなたが持っているコードは onChange 関数を呼び出し、結果を jQuery の change 関数に渡します。あなたはそれを望んでいません。アイデアは、関数自体を jQuery の change 関数に渡すことであり、そうするのが適切な場合に jQuery がそれを呼び出します。
関数名の後に括弧 () がある場合は、それを呼び出しています。それ以外の場合は、オブジェクトとして扱っています。したがって、あなたがしようとしていることは、次のように達成できます。
$('select').change(onChange);
私は同様の問題を抱えていて、この解決策をここで見つけました:
このようなことをすると:
$('p').click( function() { alert('blah'); } )
現在存在するすべての'p' 要素には、クリック ハンドラーがアタッチされます。他の 'p' 要素をページに追加すると、それらの要素には クリック ハンドラがアタッチされません。「再実行」する必要があります
$('p').click( function() { alert('blah'); } )
新しい要素で、ハンドラーをそれらにアタッチします。
新しく追加されたすべての要素を管理する「LiveQuery」プラグインを見 て、ページに追加されたときに以前に添付されたハンドラーを取得することをお勧めします。
カール・ラッド
そのため、select を追加した後、change() 呼び出しを繰り返す必要があります。
助けてくれてありがとう、答えはうまくいきましたが、私がやっていたことにはうまくいきませんでした。私はついにfirebugを使ってそれを理解しました。ajaxが処理を完了する前に、変更イベントを割り当てようとしていました(お気づきかもしれませんが、このajaxの処理は初めてです)。
load()のコールバックに割り当てるイベントを追加しましたが、すべてうまく機能しています。
$(this).load('ploc002.php', {JobNumber: JobNumber, Edit: this.id}, function()
{
// The DOM has been changed by the AJAX call
// Now we need to reassign the onchange events
$('select,input').change( function()
{
onChange(this)
});
});
select をページに追加したら、change イベントをページに追加する必要があります。
$('#newSelect').change(
function()
{
onChange(this)
}
);
選択したすべてのクラスが同じ場合は、最初にバインドを解除してから再バインドすることをお勧めします。
$('.classname').unbind("change");
$('.classname').change(
function()
{
onChange(this)
}
);