Как я могу избежать перемещения фокуса на панель поиска Google в расширении Chrome?

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

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

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

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

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

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

1 ответ

После прочтения на 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"
    }
  ]
}
Другие вопросы по тегам