11

Chrome 拡張機能のコンテンツ スクリプトで、特定のサイトの Web ページ上の特定のリンク/ボタンをクリックします。そのために、コンテンツ スクリプトで次のコードを使用します (コンテンツ スクリプトに jQuery を埋め込みます)。

$(css_selector).trigger("click")

これはほとんどのサイトで機能します。

ただし、delta.com、match.com、paypal.com などの特定のサイトでは、要素のクリックをトリガーするこの方法は機能しません。delta.com で、コンテンツ スクリプトでトリガーしようとすると、次の例外がスローされます。

Error: An attempt was made to reference a Node in a context where it does not exist.
Error: NotFoundError: DOM Exception 8

奇妙なことに、delta.com で javascript コンソールを開き、jQuery を含めて、同じクリック トリガー コード スニペットを試行すると、機能します。

match.com と paypal.com では、コンテンツ スクリプトでトリガーが機能せず、エラーは発生しません。delta.com で行ったように、javascript コンソールから「クリック」イベントをトリガーすることさえできません。

手動でマウス クリックを使用すると、3 つのサイトすべてですべて正常に動作します。したがって、mousedown()、mouseup() を使用してシミュレートしようとしましたが、それも機能しませんでした。

これらのサイトの JavaScript がハイジャックしてイベントを無視しているため、これは問題のようです。これらのサイトからコードを読み取って何が起こっているのかを確認しようとしましたが、コードが多すぎました。

ここで何が起こっているのか、それを修正する方法について何か知っている人はいますか?

4

3 に答える 3

12

jQuery のクリック トリガー関数は、jQuery 以外の DOM クリック リスナーをトリガーしません (jsfiddle.net/k2W6M)。

jQuery のドキュメントは、この事実を実際に指摘する必要があります。これをめぐって猛烈な追跡を行った人は少なくないと思います。

.click() と .trigger("click") を使用してリンクでonclickハンドラーをトリガーしようとして、この同じ問題に数日間苦労していましたが、これを見るまですべて無駄でした。

この質問に対する完全な答えを得るために、MouseEventを要素にディスパッチすると、要素をクリックするのと同じ効果があります。次のコードは私にとってはうまくいき、コンテンツスクリプトからページ上の要素/リンクをクリックしようとするとうまくいくはずです:

$(css_selector)[0].dispatchEvent(new MouseEvent("click"))
于 2015-01-03T09:02:01.967 に答える
0

content_script はサンドボックスで実行されます。https: //developer.chrome.com/extensions/content_scripts を参照してください。

ただし、コンテンツ スクリプトにはいくつかの制限があります。彼らがすることはできません:

  • 拡張機能のページで定義された変数または関数を使用する
  • Web ページまたは他のコンテンツ スクリプトによって定義された変数または関数を使用する

content_script の $ は Web ページの $ にアクセスできませんが、イベント データは $ 内に格納されているため、トリガーできませんでした。

// taken from jQuery#1.11.2 from line4571, trigger method
...

// jQuery handler
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
if ( handle ) {
    handle.apply( cur, data );
}

// Native handler
handle = ontype && cur[ ontype ];
于 2015-01-08T13:24:32.943 に答える