1

私は、Firefox 用の vimperator プラグインで最も役立つと思われるいくつかの機能を備えた、Chrome 用の拡張機能を作成しています。

現在、ウェブページよりも前にキーストロークをキャプチャするのに問題があります。「最も簡単な」例はgoogle.comです。検索フィールドにフォーカスを置かずに何かを入力すると、フィールドが自動的に選択され、入力したテキストがフィールドに入力されます。

基本的に、ボタンを押したときにフォーカスが検索フィールドに移動しないように、この動作を停止したいと考えています。(その後、どのキーが押されたかに応じて拡張機能が反応するようにしたいのですが、フォーカスの移動を止めることができれば、多かれ少なかれすでに機能しています。)

これまでのところ、私の拡張機能のコンテンツ スクリプトで、removeEventListener() と jquery unbind() のさまざまな組み合わせ、およびその他のいくつか (または必要に応じて狂った推測) を試しましたが、今のところうまくいきません。英数字キーを押すと、フォーカスは引き続き検索フィールドに移動します。これを行う方法や、どこで答えを探すことができるかについて、誰か提案はありますか?

これは以前に尋ねられたことをお詫びしますが、私が見つけた質問のいずれからも助けを得ることができませんでした.

PS: より多くのコンテキストに興味がある場合は、これまでのコードをここで見つけることができます。しかし、これを見て頭を悩ませることなく、質問に答えることができると思います(混乱)。

4

1 に答える 1

0

element.focus()methodを読んだ後、focus()呼び出しがイベント ループに戻る前に、ドキュメントによってフォーカスされた要素をぼかす次のコードを書きました。

すべての要素にフォーカス リスナーを追加し、オンロード後にフォーカス リスナーを削除してfocus()、ユーザー イベント (jsfiddle.com や Google の結果ページなど) の後に呼び出す Web サイトが、ページが終了した後も適切に機能するようにするという考え方です。読み込まれました。

警告: Chrome でautofocusフィールドを無効にする方法がわかりません。

コンテンツ スクリプト (unfocus.js と呼びます):

document.addEventListener('DOMNodeInsertedIntoDocument', onInsertedIntoDocument, true);
document.addEventListener('DOMNodeRemovedFromDocument', onRemovedFromDocument, true);
window.addEventListener('load', function(e) {
  setTimeout(function() {
    removeOnFocus(document.documentElement);
    document.removeEventListener('DOMNodeInsertedIntoDocument', onInsertedIntoDocument, true);
    document.removeEventListener('DOMNodeRemovedFromDocument', onRemovedFromDocument, true);
  }, 1);
}, false);


// Whenever an element is inserted into document, listen for
// simple event named 'focus'.
function onInsertedIntoDocument(e) {
  var elt = e.target;
  if (elt.nodeType === 1)
    elt.addEventListener('focus', onfocus, false);
}
function onRemovedFromDocument(e) {
  var elt = e.target;
  if (elt.nodeType === 1)
      removeOnFocus(elt);
}
function onfocus(e) {
  // In Chrome, caller is null if the user initiated the focus,
  // and non-null if the focus was caused by a call to element.focus().
  var causedByUser = (onfocus.caller == null);

  console.log('onfocus ' + e.target.nodeName +
      ': caused by user? ' +causedByUser +
      (e.target.autofocus ? ' autofocus' : ''));

  if (! causedByUser) {
    e.target.blur();
  }
}
// Clean up by removing all the 'focus' event listeners.
function removeOnFocus(elt) {
  elt.removeEventListener('focus', onfocus, false);
  for (var i = 0; i < elt.children.length; i++)
    removeOnFocus(elt.children[i]);
}

そして、このmanifest.json:

{
  "name": "unfocus",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["unfocus.js"],
      "run_at": "document_start"
    }
  ]
}
于 2011-07-29T23:54:25.223 に答える