JQueryを介したアンカークリックの偽造に問題があります。入力ボタンを最初にクリックしたときに、2回目または3回目ではなく、thickboxが表示されるのはなぜですか。
ここに私のコードがあります:
<input onclick="$('#thickboxId').click();" type="button" value="Click me" />
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>
リンクを直接クリックすると常に動作しますが、入力ボタンを使用してシックボックスをアクティブにしようとすると動作しません。これはFFです。 Chromeの場合、毎回動作するようです。ヒントはありますか?
そのような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
イベントを更新して、Javascriptのwindow.location
を変更することです。
<script type="text/javascript">
$(function(){
$('#thickboxButton').click(function(){
window.location = $('#thickboxId').attr('href');
});
});
</script>
編集2:
ThickboxがカスタムjQuery UIウィジェットであることがわかったので、指示を見つけました here :
<a href>
)class="thickbox"
)の値を持つクラス属性を与えますhref
属性に、次のアンカーを追加します:#TB_inline
#TB_inline
の後のhref
属性で、次のクエリ文字列をアンカーに追加します。
?height = 300&width = 300&inlineId = myOnPageContent
それに応じて、クエリの高さ、幅、およびinlineIdの値を変更します(inlineIDは、ThickBoxに表示するコンテンツを含む要素のID値です。
tb_remove()
関数を呼び出す必要があるように、クエリ文字列にmodal = true(例:#TB_inline?height=155&width=300&inlineId=hiddenModalContent&modal=true
)を追加できます。非表示のモーダルコンテンツの例を参照してください。ThickBoxを閉じるには、yesまたはnoをクリックする必要があります。私のために働いたのは:
$('a.mylink')[0].click()
最近、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>
このアプローチは、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) {}
質問のタイトルには、「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
などを使用したことがあり、うまくいきました。
UPDATEtriggerHandler
は、実際にはOPが望むことをしません。 1421968 がこの質問に対する最良の答えを提供すると思います。
これは非常に古い質問ですが、このタスクを処理しやすいものを見つけました。シミュレートと呼ばれるjquery UIチームによって開発されたjqueryプラグインです。あなたは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
Selenium APIを見て、ブラウザと互換性のある方法で要素のクリックをトリガーする方法を確認することをお勧めします。
BrowserBot.prototype.triggerMouseEvent
関数を探します。
私はあなたが使用できると信じています:
$('#yourLink').bind('click', function() {
//Do something over here
});
$('#yourLink').trigger('click');
これにより、実際にクリックすることなく、クリック機能が簡単にトリガーされます。
ページへのランディング中にアンカーのクリックをシミュレートするために、jQueryを使用して$(document).ready.
のscrollTopプロパティをアニメーション化しました。複雑なトリガーは不要で、IE 6およびその他すべてのブラウザーで機能します。
JQueryを使用する必要がない場合、私はしません。 .click()
のクロスブラウザ機能に問題があります。だから私は使用します:
eval(document.getElementById('someid').href)
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");
リンクを模倣するアクションを持つjQueryまたはHTMLページコードでフォームを作成できますhref:
<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();
アンカークリックを偽造する必要がありますか? thickboxサイトから:
ThickBoxは、リンク要素、入力要素(通常はボタン)、および領域要素(イメージマップ)から呼び出すことができます。
それが受け入れられる場合、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の異なるバージョンを使用していることです。 thickboxページから取得したもの-jquery 1.3.2およびthickbox 3.1を使用しています。
Jureのスクリプトを使用して、これを作成し、必要な数の要素を簡単に「クリック」しました。
1600以上のアイテムでGoogle Readerを使用したところ、完全に機能しました(Firefoxで)。
var e = document.createEvent('MouseEvents');
e.initEvent( 'click', true, true );
$(selector).each(function(){this.dispatchEvent(e);});
これはAndroidネイティブブラウザーでは機能せず、「非表示の入力(ファイル)要素」をクリックします。
$('a#swaswararedirectlink')[0].click();
しかし、これは機能します:
$("#input-file").show();
$("#input-file")[0].click();
$("#input-file").hide();
JQuery('#left').triggerHandler('click');
はFirefoxおよびIE7で正常に動作します。他のブラウザではテストしていません。
自動ユーザークリックをトリガーするには、次の操作を行います。
window.setInterval(function()
{
$('#left').triggerHandler('click');
}, 1000);
JQuery UIスピナーを使用してユニットテストで「クリック」をシミュレートしようとしても、以前の回答がまったく機能しませんでした。特に、下矢印を選択する「スピン」をシミュレートしようとしていました。 jQuery UIスピナーユニットテスト を見て、次のメソッドを使用しました。
element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup();