on
が呼び出されると、change
に加えて、イベントハンドラを1回実行する必要があります。私は<select>
を変更したときにページの動作を変更しました。そのボタンのデフォルト値も設定されています。そのため、実際にchange
が発生する前に初めてchange
ハンドラを実行する必要があります。初めて呼び出されるALSOのjQueryイベントハンドラ
例(実際のコードははるかに複雑である):
<select id="sel"><option>A<option>B<option>C</select>
<a id="go" href="#">Go</a>
<script>
var base = "/act/";
function update_go(){
$('#go').prop('href',base+$(this).val());
}
$('#sel')
.on('change',update_go) // update button when select is changed
.each(update_go); // update button with the default value of the select
// todo: check: when select value is remembered by browser, does it work as it should?
</script>
私は.on
が呼び出されるときは常に、一度、実行されるイベントを許可し、jQueryのイベントを拡張したいと思います。このようにして.each
を省略し、インラインの匿名関数を使用することができます。そのような何か:
$('#sel').on('change runonce',function(){
$('#go').prop('href',base+$(this).val());
});
それは私が気付いていないよイベントハンドラを実行することができるので、私は.trigger('change')
をコールする必要はありません。また、trigger
を呼び出すことは、多くの要素が関わっているときには驚くほど高価です。それで私はtrigger('runonce')
に電話したくありません。
each
を使用するか、関数呼び出しを使用するほうがはるかに高速で見栄えが良いですが、すべてのイベントに対して名前付き関数が必要です。 https://jsfiddle.net/oriadam/Lu9ym1xy/13/
JSPerf: http://jsperf.com/jquery-custom-trigger-vs-each-vs-function-call1
あなたはjqueryの中で '1' の方法を確認しましたか? –
'私は
@PoulBak何かが起こる前に、一度だけ「変更」が発生するたびにイベントを実行する必要があります。 @A.Wolffはい! – oriadam