Как я могу избежать перемещения фокуса на панель поиска Google в расширении Chrome? - PullRequest
1 голос
/ 30 июля 2011

Я пишу расширение для Chrome с несколькими функциями, которые я считаю наиболее полезными в плагине vimperator для firefox.

В настоящее время у меня возникают проблемы с фиксацией нажатий клавиш до того, как это делает веб-страница. Самый простой пример - google.com . Когда я набираю что-то, не имея фокуса в поле поиска, поле выбирается автоматически, и любой вводимый текст вводится в поле.

По сути, я хочу остановить это поведение, чтобы при нажатии кнопки фокус не перемещался в поле поиска. (После этого я хочу, чтобы расширение реагировало в зависимости от того, какая клавиша была нажата, но у меня уже есть эта функция более или менее, если я могу остановить перемещение фокуса.)

До сих пор я пробовал различные комбинации removeEventListener () и jquery unbind () и несколько других вещей (или безумных догадок, если хотите.) В скрипте содержимого моего расширения, но пока не повезло. При нажатии буквенно-цифровой клавиши фокус все еще перемещается в поле поиска. У кого-нибудь есть предложения о том, как это можно сделать или где я могу найти ответ?

Я прошу прощения за это раньше, но я не смог получить какую-либо помощь по любому из вопросов, которые я нашел.

PS: Если вас интересует еще какой-то контекст, код, который у меня есть, можно найти здесь . Но я должен подумать, что на этот вопрос можно ответить, и у кого-то не будет головной боли, когда он смотрит на это (беспорядок).

1 Ответ

0 голосов
/ 30 июля 2011

После прочтения метода element.focus() я написал следующий код для размытия элементов, которые были сфокусированы документом, прежде чем вызов focus() вернется в цикл обработки событий.

Идея заключается в том, что мы добавляем прослушиватель фокуса к каждому элементу, а затем удаляем прослушиватель фокуса после загрузки, чтобы веб-сайты, которые вызывают focus() после события пользователя (например, jsfiddle.com или страница результатов Google), по-прежнему работать правильно после загрузки страницы.

Предостережение : Я не смог выяснить, как заставить 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]);
}

И этот манифест.json:

{
  "name": "unfocus",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["unfocus.js"],
      "run_at": "document_start"
    }
  ]
}
...