0

私は現在、javascript/jquery を特定のページに挿入するブラウザー拡張機能を構築しています。強制.click()イベントが挿入されたコードから機能しないという奇妙な問題が発生しています。奇妙な点は、コンソール js コンソールから呼び出しを行うと、完全に正常に動作することです。

私は問題が何であるかを本当に理解していません。私の他のすべての呼び出しは正常に機能しているようです。を使用してクリックイベントにバインドし.click(function(){...})(明らかに私のjqueryが適切にロードされています)、クリックされたときにメソッドを呼び出すことができます(明らかに私のjqueryが適切にロードされています)が、2番目にクリックを強制しようとすると、呼び出しだけです通らない。

誰が何が起こっているのか、またはそれを回避できる方法を説明できますか?

(問題は明らかに拡張機能にjsを挿入することに関係しているため、この問題を再現することはできません)

これは、レクリエーションのために私ができる最善のことです。

//I have tried all of these separately 
console.log($("#this_is_an_id"))  //This returns the correct element

$("#this_is_an_id").click()       //This does not work at all

$("#this_is_an_id").trigger("click") //I have also tried this without success

$("#this_is_an_id").click(function(){ console.log("stuff") }) //This works fine.

本当に、この時点で、それは私のせいではなく、スクリプトを挿入するブラウザの方法に何か問題があると思います。私はこれを修正するための本当にハッキーな方法を探していますeval('$("#this_is_an_id").trigger("click")'). 他に提案はありますか?

4

1 に答える 1

2

ここで、この問題に対する非常に優れた回答/回避策を最終的に見つけました: Trigger events from Firefox browser extension?

ユーザーcmsから:

まず、クリック イベントの場合、HTMLEvents ではなく、MouseEvents タイプのイベント オブジェクトを作成し、event.initEvent の代わりに event.initMouseEvent を使用する必要があります。

XUL オーバーレイから Firefox の現在のタブのドキュメントにアクセスするには、content.document プロパティを使用できますが、クリックしたい DOM 要素に既にアクセスしているため、Node.ownerDocument プロパティを使用できます。このノードの最上位ドキュメント オブジェクトを参照してください。

MouseEvents をシミュレートする単純な関数を作成しました。

function triggerMouseEvent(element, eventName, userOptions) {
  var options = { // defaults
    clientX: 0, clientY: 0, button: 0,
    ctrlKey: false, altKey: false, shiftKey: false,
    metaKey: false, bubbles: true, cancelable: true
     // create event object:
  }, event = element.ownerDocument.createEvent("MouseEvents");

  if (!/^(?:click|mouse(?:down|up|over|move|out))$/.test(eventName)) {
    throw new Error("Only MouseEvents supported");
  }

  if (typeof userOptions != 'undefined'){ // set the userOptions
    for (var prop in userOptions) {
      if (userOptions.hasOwnProperty(prop))
        options[prop] = userOptions[prop];
    }
  }
  // initialize the event object
  event.initMouseEvent(eventName, options.bubbles, options.cancelable,
                       element.ownerDocument.defaultView,  options.button,
                       options.clientX, options.clientY, options.clientX,
                       options.clientY, options.ctrlKey, options.altKey,
                       options.shiftKey, options.metaKey, options.button,
                       element);
  // dispatch!
  element.dispatchEvent(event);
}

使用法: triggerMouseEvent(要素, 'クリック');

こちらでテスト使用を確認してください。

イベント オブジェクト プロパティの値を変更する場合は、3 番目の引数としてオブジェクトを渡すこともできます。

この回答に感謝します。O_O

于 2012-04-30T19:58:20.110 に答える