jqueryを使用してアンカークリックをシミュレートするにはどうすればよいですか?


144

jQueryによるアンカークリックの偽装に問題があります。thickboxが最初に入力ボタンをクリックしたときに表示され、2回目または3回目は表示されないのはなぜですか?

これが私のコードです:

<input onclick="$('#thickboxId').click();" type="button" value="Click me" />

<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

リンクを直接クリックした場合は常に機能しますが、入力ボタンを使用してシックボックスをアクティブにしようとした場合は機能しません。これはFFです。Chromeの場合、毎回動作するようです。ヒントはありますか?


1
ここではコードを省略します。表示したアンカーのクリックイベントに関連付けられたコードはありません。そのコードは何をしますか?他のコードは含まれていますか?
マット

1
@Mattパラメータを指定せずにclickメソッドを使用すると、イベントバインディングとして解釈されなくなり、チェーンされている要素が実際にクリックされます(マウスでクリックしたかのように)。この場合、input要素をクリックすると、ID「thickboxId」の要素もクリックする必要があります。
KyleFarris 2009

3
@KyleFarris:クリックされる要素にonclickイベントがアタッチされていない限り、click()イベントはChromeまたはSafariでは機能せず、その部分のみをトリガーし、href値に移動しません。上記の場合、ユーザーがリンクをクリックしたかのように、Aタグのhrefプロパティに移動したいと考えています。
Senseful

回答:


123

そのようなjQuery呼び出しをインライン化しないようにしてください。clickイベントにバインドするスクリプトタグをページの上部に配置します。

<script type="text/javascript">
$(function(){
    $('#thickboxButton').click(function(){
        $('#thickboxId').click();
    });
});
</script>

<input id="thickboxButton" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

編集:

ユーザーがリンクを物理的にクリックすることをシミュレートしようとしている場合、それは可能ではないと私は思います。回避策は、ボタンのclickイベントを更新window.locationしてJavaScript を変更することです。

<script type="text/javascript">
$(function(){
    $('#thickboxButton').click(function(){
        window.location = $('#thickboxId').attr('href');
    });
});
</script>

編集2:

ThickboxがカスタムjQuery UIウィジェットであることを理解したので、ここに手順を見つけました

手順:

  • リンク要素を作成する(<a href>

  • リンクにthickbox(class="thickbox")の値を持つクラス属性を与えます

  • hrefリンクの属性に次のアンカーを追加します。#TB_inline

  • href後の属性#TB_inline追加、次のクエリ文字列をアンカーに追加します。

    ?height = 300&width = 300&inlineId = myOnPageContent

  • それに応じて、クエリの高さ、幅、およびinlineIdの値を変更します(inlineIDは、ThickBoxに表示するコンテンツを含む要素のID値です。

  • オプションで、クエリ文字列にmodal = trueを追加して(例#TB_inline?height=155&width=300&inlineId=hiddenModalContent&modal=true:)、ThickBoxを閉じるには、ThickBox tb_remove()内から関数を呼び出す必要があります。非表示のモーダルコンテンツの例を参照してください。この場合、[はい]または[いいえ]をクリックしてThickBoxを閉じる必要があります。


クリックハンドラーのwindow.locationは機能しません。シックボックスが期待どおりに機能しないためです。
prinzdezibel 2009

2番目の例では、解決されたURLを取得する.prop()代わりに使用することをお勧めしますattr()
Kevin Bowersox 2014年

これが受け入れられた答えであることに驚いています。クリックトリガーは、jQueryラッパー要素ではなく、ネイティブDOM要素でのみ機能します。これについては、@ Stevanicusとコメント、および他のいくつかのSOの投稿で議論されています。答えはステバニカスの答えに変更する必要があります。
オリバー

@Schollii-自由に編集して、必要な正確さを確保してください。
John Rasch 2014

3
受け入れられた回答は@stevanicusの回答でなければならないことを意味しました
Oliver

194

私のために働いたのは:

$('a.mylink')[0].click()

1
。次の部分がクラス名であることを寄付します。#はid用です。
Stevanicus

3
入力に必要な場合はfocusclick:)の代わりに使用します
AndriusNaruševičius13年

これは私にとっても機能しますが、なぜこれが機能するのですか?$( 'a.mylink')[0] .click()は機能するが、$( 'a.mylink')。eq(0).click()は機能しないのはなぜですか?
ChrisC 2013

4
[0]配列の最初の要素を示します。セレクターは、実行時に0以上の要素を返します。残念ながら、.click()他の呼び出しがセレクターからの要素のコレクションにフレームワーク全体で一貫して適用されているように見えるため、ここでは直接動作しないようです。
cfeduke 2014年

8
[0]またはを使用し.get(0)て同じです。これらは、jQueryバージョンではなく、要素のDOMバージョンを使用します。.click()この場合の関数はjQueryクリックイベントではなく、ネイティブイベントです。
Radley Sustaire、2014年

19

私は最近、jQueryを介してマウスクリックイベントをトリガーする方法を見つけました。

    <script type="text/javascript">
    var a = $('.path > .to > .element > a')[0];
    var e = document.createEvent('MouseEvents');
    e.initEvent( 'click', true, true );
    a.dispatchEvent(e);
    </script>

1
ドキュメントにcreateEventメソッドがないように見えるため、これはIEでは少なくとも7または8では機能しないと思います。
ジェレミー

イーグルが言うように、これはWebkitブラウザーで機能します。ただし、ここでは実際にjQueryを使用していないことに注意してください($選択以外)
tokland

1
これは魔法の半分欠けている:stackoverflow.com/questions/1421584/...を
daniloquio

9

このアプローチは、Firefox、Chrome、IEで機能します。それが誰かを助けることを願っています:

var comp = document.getElementById('yourCompId');
try { //in firefox
    comp.click();
    return;
} catch(ex) {}
try { // in chrome
    if(document.createEvent) {
        var e = document.createEvent('MouseEvents');
        e.initEvent( 'click', true, true );
        comp.dispatchEvent(e);
        return;
    }
} catch(ex) {}
try { // in IE
    if(document.createEventObject) {
         var evObj = document.createEventObject();
         comp.fireEvent("onclick", evObj);
         return;
    }
} catch(ex) {}

私の意見では相互互換性があるため、非常に役立ち、より優れたオプションです。すべてをtry / catchブロックでラップする必要はありませんが、これは各ブラウザーの試行をカスケードするために行われることを理解しています。
h0r53

8

これは非常に古い質問ですが、このタスクを処理するのに簡単なものが見つかりました。これは、jquery UIチームが開発したjQueryプラグインで、simulateと呼ばれています。あなたはjqueryの後にそれを含めることができ、それからあなたは次のようなことをすることができます

<a href="http://stackoverflow.com/"></a>
$('a').simulate('click');

chrome、firefox、opera、IE10で正常に動作します。https://github.com/eduardolundgren/jquery-simulate/blob/master/jquery.simulate.jsからダウンロードできます


の主要な機能はsimulate()、jQueryイベント送信するだけでなく、ネイティブのブラウザーアクショントリガーすることです。これは、今、正しい答え1
コーディングゴーン

チャームのように機能し、ユーザーが剣道グリッドのボタンをクリックすると、新しいタブでページを開くことができます。
John Sully

6

質問のタイトルには、「jQueryでアンカークリックをシミュレートするにはどうすればよいですか?」と書かれています。そうですね、 "trigger"または "triggerHandler"メソッドを次のように使用できます。

<script type="text/javascript" src="path/to/jquery.js"></script>
<script type="text/javascript" src="path/to/thickbox.js"></script>
<script type="text/javascript">
$(function() {
    $('#btn').click(function() {
        $('#thickboxId').triggerHandler('click');
    })
})
</script>
...
<input id="btn" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

この実際のスクリプトはテストされていませんが、使用しました trigger以前にet alます。

UPDATE
triggerHandlerは、実際にはOPが望むことを行いません。1421968がこの質問に対する最良の答えを提供すると思います 。



4

私はあなたが使うことができると信じています:

$('#yourLink').bind('click', function() {
  //Do something over here
});

$('#yourLink').trigger('click');

これにより、実際にクリックすることなく、クリック機能が簡単にトリガーされます。


2

アンカークリックを偽造する必要がありますか?thickboxサイトから:

ThickBoxは、link要素、input要素(通常はボタン)、およびarea要素(イメージマップ)から呼び出すことができます。

それが許容できる場合は、thickboxクラスを入力自体に配置するのと同じくらい簡単です。

<input id="thickboxButton" type="button" class="thickbox" value="Click me">

そうでない場合は、Firebugを使用し、アンカー要素のonclickメソッドにブレークポイントを配置して、最初のクリックでのみトリガーされるかどうかを確認することをお勧めします。

編集:

さて、私は自分で試してみました。私にとっては、あなたのコードはChromeとFirefoxの両方で動作しました。

<html>
<head>
<link rel="stylesheet" href="thickbox.css" type="text/css" media="screen" />
</head>
<body>
<script src="jquery-latest.pack.js" type="text/javascript"></script>
<script src="thickbox.js" type="text/javascript"></script>
<input onclick="$('#thickboxId').click();" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>
</body>
</html>

入力またはアンカー要素をクリックしても、ウィンドウがポップアップします。上記のコードが機能する場合は、エラーが別の場所にあり、問題を特定することをお勧めします。

別の可能性は、jquery / thickboxの異なるバージョンを使用していることです。私はシックボックスページから取得したものを使用しています-jquery 1.3.2とシックボックス3.1。


はい、私はそれを偽造する必要があり、はいクリックハンドラー自体は動作します。しかし、実際には、onclickイベントをまったく設定していませんでしたが、機能しましたが、初めてです。しかし、onclickがthickboxIdで処理される場合も機能しません。
prinzdezibel 2009

私が意味したのは、アンカー要素のonclickがinput要素をクリックするたびにトリガーされることを確認することでした。ああ、上の編集を見てください。
ワックスウィング2009

2

リンクを模倣するアクションを使用して、jQueryまたはHTMLページコードでフォームを作成できます。

<a id="anchor_link" href="somepath.php">click here</a>.

var link = $('#anchor_link').attr('href');
$('body').append('<form id="new_form" action="'+link+'"></form>');
$('#new_form').submit();

このメソッドは、単にアンカーにジャンプするのではなく、ページ全体をリロードさせます。さらに、「?」も追加します URLに変更すると、ページはexample.com#testではなくexample.com?#testになります。ChromeとSafariでテスト済み。
Senseful

FFでは、これはうまく機能します。Webkitブラウザーでは、Sensefulが説明するようにURLを取得します。しかし、これは問題ではありませんね。
sdepold 2011

2

ページに到達する際のアンカーのクリックをシミュレートするために、jQueryを使用してscrollTopプロパティをアニメーション化$(document).ready.し、複雑なトリガーは必要ありません。これはIE 6と他のすべてのブラウザーで機能します。


2

JQueryを使用する必要がない場合は、私とは異なります。のクロスブラウザ機能に問題がありました.click()。だから私は使用します:

eval(document.getElementById('someid').href)

迅速かつ汚いが、私のために働いた。jQueryでは、これはeval($( "#someid")。attr( "href"));です。
mhenry1384

2

JavaScriptでは、このようにすることができます

function submitRequest(buttonId) {
    if (document.getElementById(buttonId) == null
            || document.getElementById(buttonId) == undefined) {
        return;
    }
    if (document.getElementById(buttonId).dispatchEvent) {
        var e = document.createEvent("MouseEvents");
        e.initEvent("click", true, true);
        document.getElementById(buttonId).dispatchEvent(e);
    } else {
        document.getElementById(buttonId).click();
    }
}

そしてあなたはそれを次のように使うことができます

submitRequest("target-element-id");

1

Jureのスクリプトを使用してこれを作成し、必要な数の要素を簡単に「クリック」しました。
1600以上のアイテムでGoogleリーダーを使用したところ、Firefoxで完全に機能しました。

var e = document.createEvent('MouseEvents');
e.initEvent( 'click', true, true );
$(selector).each(function(){this.dispatchEvent(e);});

ドキュメントにcreateEventメソッドがないように見えるため、これはIEでは機能しません。少なくとも7または8では機能しません。
ジェレミー

代わりにdocument.createEventObject()をIEで使用する必要があると思いますが、まだ試していません。
fregante

@ bfred.it:IE createEventObjectでは、合成イベントをディスパッチするのではなく、ハンドラーに渡すイベントオブジェクトを作成するためのものです。IE fireEventはに近いかもしれませんがdispatchEvent、リスナーをトリガーするだけで、デフォルトのブラウザーアクションはトリガーしません。ただし、IEではclickメソッドを呼び出すだけです。
theazureshadow

1

JQuery('#left').triggerHandler('click');FirefoxおよびIE7で正常に動作します。他のブラウザではテストしていません。

自動ユーザークリックをトリガーする場合は、次の操作を行います。

window.setInterval(function() 
    {
        $('#left').triggerHandler('click');
    }, 1000);

1

これは、「ネイティブ入力(ファイル)要素」をクリックするAndroidネイティブブラウザーでは機能しません。

$('a#swaswararedirectlink')[0].click();

しかし、これはうまくいきます:

$("#input-file").show();
$("#input-file")[0].click();
$("#input-file").hide();

0

jQuery UIスピナーを使用した単体テストで「クリック」をシミュレートしようとすると、以前の答えが機能しませんでした。特に、下矢印を選択する「スピン」をシミュレートしようとしていました。私はjQuery UIスピナーの単体テストを見て、次のメソッドを使用しました。

element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.