問題を回避する方法について説明している以下を読む前に、そもそも問題が発生している理由を詳しく説明させてください。
Shift最新のブラウザは、どのマウス ボタンをクリックしたか、 / Ctrl/を押したかどうかなどに基づいて、リンクに対してさまざまなアクションを実行しますAlt。例として、Chrome では、リンクを左クリックする代わりに中クリックすると、ブラウザーは新しいタブでウィンドウを自動的に開きます。
を使用する場合.click()
、jQuery はクリックした「方法」について仮定する必要があり、デフォルトの動作が得られますが、これは正しい動作ではありません。MouseEvents
問題を解決するには、設定の形式でブラウザに「正しい」設定を指定する必要があります。
さて、それを修正する方法の短い議論に移りましょう:
パラメーターなしでjQuery の.click()
イベントを使用している場合、これは実際には、問題の要素で「偽造クリック」ではありません。代わりに、 http : //api.jquery.com/click/ の jQuery ドキュメントによると:
....click()
引数なしで呼び出された場合、.trigger("click") のショートカットです
つまり、$('#div1').click()
起動すると、イベントの実際の jQuery ハンドラーがない場合'click'
、デフォルトの処理が行われます。したがって、次の 2 つのケースを検討してください。
ケース 1 :
<a id='myLink' href='/some/link/'>Click me!</a>
<script type='text/javascript'>
$('#myLink').click();
</script>
この最初のシナリオで.click()
は、ハンドラーがないため、呼び出しは何もしません。イベントはトリガーされますが、それをキャッチして応答するものは何もありません。そのため、a
タグのデフォルトの処理が使用され、ユーザーが使用され/some/link/
ます。マウス ボタンやその他のパラメーターを指定していないため、これは真のデフォルトです。
ケース 2 :
<a id='myLink' href='/some/link/'>Click me!</a>
<script type='text/javascript'>
$('#myLink').bind('click', function (ev) {
ev.preventDefault();
ev.stopPropagation();
alert('you clicked me!');
}).click();
</script>
このシナリオでは、click
ハンドラーが作成されているため、ユーザーがリンクをクリックすると、ev.preventDefault()
とのev.stopPropagation()
呼び出しによって既定の処理が停止し、アラートが発生します。
ただし、この時点では-ev
を表すオブジェクトがありMouseEvents
、必要に応じて設定を変更できます。たとえば、次のことができます。
ev.altKey = true; // Held Alt
ev.button = 1; // Middle Mouse Button
これらの設定は、イベントを処理するデフォルトの方法を変更します。
jQuery 以外の代替ソリューション
次のコードを適用することで、ボタンのクリックを真にシミュレートすることもできます。
function fakeClick(event, anchorObj) {
if (anchorObj.click) {
anchorObj.click()
} else if(document.createEvent) {
if(event.target !== anchorObj) {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
var allowDefault = anchorObj.dispatchEvent(evt);
// you can check allowDefault for false to see if
// any handler called evt.preventDefault().
// Firefox will *not* redirect to anchorObj.href
// for you. However every other browser will.
}
}
}
(より完全な実装については、次の元の投稿を参照してください:アンカー タグへのクリックをシミュレートするにはどうすればよいですか? - そして、選択した回答を見てください)
これは実際には、ブラウザーのデフォルト ハンドラーと同じ方法でゼロからイベントを作成することにより、アンカー/スパンなどをマウスでクリックしたと信じ込ませるようにブラウザーを偽装しますが、一部の設定をオーバーライドすることができます。ただし、このアプローチはお勧めしません。クロス ブラウザー アプリケーションで問題が発生しやすく、すべてのパラメーターが何にマップされているかを把握する必要があるためです。