1. ホーム
  2. javascript

[解決済み] Can I call jQuery's click() to follow an <a> link if I haven't bound an event handler to it with bind or click already?

2022-04-21 01:27:45

Question

I have a timer in my JavaScript which needs to emulate clicking a link to go to another page once the time elapses. To do this I'm using jQuery's click() function. I have used $().trigger() and window.location also, and I can make it work as intended with all three.

I've observed some weird behavior with click() and I'm trying to understand what happens and why.

I'm using Firefox for everything I describe in this question, but I am also interested in what other browsers will do with this.

If I have not used $('a').bind('click',fn) or $('a').click(fn) を呼び出してイベントハンドラを設定し、その後 $('a').click() は全く何もしていないように見えます。ブラウザが新しいページを読み込まないため、このイベントに対するブラウザのデフォルトハンドラを呼び出さないのです。

しかし、最初にイベントハンドラを設定すると、イベントハンドラが何もしなくても、期待通りに動作します。

$('a').click(function(){return true;}).click();

これは、あたかも私自身がaをクリックしたかのように新しいページを読み込みます。

この奇妙な動作は、私がどこかで何か間違ったことをしているからなのか? と、なぜ click() は、自分でハンドラーを作成していない場合は、デフォルトの動作で何もしないのですか?


Hoffmanが私の結果を複製しようとしたときに判断したように、私が上で説明した結果は実際には起こりません。昨日私が観察した事象の原因が何であったかは分かりませんが、今日、それが私が質問で説明したものでなかったことは確かです。

つまり、ブラウザでクリックを偽装することはできず、jQueryが行うのはイベントハンドラの呼び出しだけというのが答えです。ただし window.location を使用してページを変更することができます。

解決方法は?

興味深いことに、これはおそらくjQueryに対する機能要求(つまりバグ)でしょう。jQueryのclickイベントは、jQueryイベントを要素にバインドした場合にのみ、その要素のクリックアクション(DOM上ではonClickイベントと呼ばれます)をトリガーします。jQueryのメーリングリスト( http://forum.jquery.com/ )に報告する。これは望んだ動作かもしれませんが、私はそうは思いません。

EDIT

私はいくつかのテストを行い、あなたが言ったことは間違っている、あなたが'a'タグに関数をバインドしても、それはまだhref属性で指定されたWebサイトに移動しません。次のコードを試してみてください。

<html>
<head>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
 <script>
  $(document).ready(function() {
   /* Try to dis-comment this:
   $('#a').click(function () {
    alert('jQuery.click()');
    return true;
   });
   */
  });
  function button_onClick() {
   $('#a').click();
  }
  function a_onClick() {
   alert('a_onClick');
  }
 </script>

</head>
<body>
 <input type="button" onclick="button_onClick()">
 <br>
 <a id='a' href='http://www.google.com' onClick="a_onClick()"> aaa </a>

</body>
</html> 

直接リンクをクリックしない限り、google.comに行くことはありません(コメントされたコードの有無にかかわらず)。また、クリックイベントをリンクにバインドしても、ボタンをクリックすると紫色にならないことに注意してください。リンクを直接クリックした場合のみ、紫色になります。

ブラウザがjavascriptによる偽のクリックをサポートしないため、.clickは'a'タグでは機能しないようです。つまり、javascriptで要素をクリックすることはできないのです。a' タグを使えば、onClick イベントを発生させることはできますが、リンクの色は変わりません(訪問したリンクの色になります、ほとんどのブラウザのデフォルトは紫です)。なぜなら、href属性に移動する行為はonClickイベントの一部ではなく、ブラウザにハードコードされているからです。