33

A既存の div 内にタグを動的に作成し、それを「クリック」して jQuery 関数を呼び出すJavaScript があります。これは、Safari を除くすべてのブラウザーで意図したとおりに機能します。

Safari は次のエラーを返します。

'undefined' は関数ではありません ('$('.shell a')[0].click()' を評価します)

私が間違っていること、またはこれがSafariで機能しない理由、およびそれを機能させる方法(またはすべてのブラウザーで機能するコードの一部)についてのアイデア.trigger("click")も使用してみましたが、同じエラーが発生します.

JavaScript

function writeAndClickLink(url) {

    $('.shell').html('<a href="' + url + '"></a>');
    $('.shell a')[0].click();
}

そしてHTMLで:

<div class="shell"></div>

私がこの奇妙な方法でやっている理由は、関数が Flash サイトから呼び出されて、ツイートの報酬を与える Twitter ウィンドウを開くためです。これまでのところ、「つぶやき」イベントをウィンドウにバインドする唯一の方法でした。ウィンドウを別の方法 (window.open など) で開くと、実際にツイートを完了したことを知らせるバインドされたイベントがキャプチャされません。

流れは次のようなものです。

  • ユーザーがフラッシュでつぶやきボタンをクリック
  • Flash は javascript 関数を呼び出して動的に href を書き込み、それを「クリック」します。
  • ツイッターウィンドウが開きます
  • ユーザーがツイートに成功しました
  • ツイートイベントがキャプチャされ、フラッシュが正常に更新されます
  • コンテンツはフラッシュでロック解除されます
4

4 に答える 4

33
var a = $('.shell a')[0];
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent('click', true, true, window);
a.dispatchEvent(evObj);

http://www.howtocreate.co.uk/tutorials/javascript/domeventsを参照してください(「イベントを手動で起動する」を検索してください)。

于 2012-10-17T00:45:13.423 に答える
8

Trevor Dixon の回答Safari を修正しますが、最新の Firefox でも壊れます。

TypeError: MouseEvent.initMouseEvent への引数が不十分です

Firefox を壊さずに Safari をサポートする最善の方法は、initEvent代わりに次のinitMouseEventように使用することです。

var element = document.getElementById('your_id_here');
if(element.click)
    element.click();
else if(document.createEvent)
{
    var eventObj = document.createEvent('MouseEvents');
    eventObj.initEvent('click',true,true);
    element.dispatchEvent(eventObj);
}

2016 に更新するには、非推奨MouseEventの代わりに使用する必要があります。initMouseEvent

var eventObj = new MouseEvent("click", {
    bubbles: true,
    cancelable: true
});
element.dispatchEvent(eventObj);
于 2014-05-06T13:54:25.363 に答える
6

$('.shell a')[0]jQuery オブジェクトから DOM オブジェクトを取得します。その DOM オブジェクトには DOM メソッドのみがあり (jQuery メソッドではありません)、HTML5 まで要素に業界標準の.click()メソッドはなく、まだすべてのブラウザーに実装されていません。したがって、さまざまなブラウザー間で不完全な実装が表示されます。<a>

いくつかの選択肢があります。最初のオプションは、jQuery オブジェクトを取得し、jQuery オブジェクトで.click()メソッドを使用します。<a>これは、タグのデフォルトのクリックだけが必要な場合ではなく、jQuery クリック ハンドラーをトリガーしている場合にのみ確実に機能します。

function writeAndClickLink(url) {

    $('.shell').html('<a href="' + url + '"></a>');
    $('.shell a').eq(0).click();
}

または、URL をクリックして新しい Web ページに移動するだけの場合は、わざわざ DOM を変更する必要はなく、window.location を設定するだけです。新しいウェブページ:

function writeAndClickLink(url) {
    window.location = url;    
}
于 2012-10-17T00:03:12.607 に答える
3

$('.shell a')[0]jQueryメソッドがバインドされていないネイティブDOM要素を返します

「[0]」を削除して、jQueryメソッドを使用するためにjQueryオブジェクトを保持します

 $('.shell a').click()
于 2012-10-16T23:56:40.580 に答える