2

Я работаю над расширением Chrome, я хочу определить, когда пользователь набрал URL. Я знаю о:Как инициировать событие только тогда, когда пользователь меняет URL-адрес?

chrome.tabs.onUpdated.addListener(eventLisenerObj.onUpdated); 

Но она вызывается всякий раз, когда URL изменяется (например, когда страница авто перезагружается, или когда пользователь нажимает на ссылку и т.д.)

Я хочу, чтобы иметь возможность что URL-адрес был изменен только пользователем, набравшим URL-адрес.

+0

Обратите внимание, что методы принятого ответа ** также могут работать на Firefox **. –

ответ

4

Вы можете получить эту информацию, используя событие webNavigation.onCommitted (MDN). Слушателя событий получает свойство transitionType (MDN), который будет different values (MDN) на основе причины навигации. Какие значения, которые вы активируете, будут зависеть от точно того, что вы желаете. За то, что вы описали, вы, вероятно, хотите 'typed' (MDN), но потенциально также 'generated' (MDN), 'keyword' (MDN) и/или 'keyword_generated' (MDN).

Список возможных значений объясняется на Хрома History API page (они перечислены на webNavigation странице Chrome, но не объяснили там) (На MDN: TransitionType) (текст со страницы API истории Chrome):

  • "link"
    Пользователь получил эту страницу, нажав ссылку на другой странице.
  • "typed"
    Пользователь получил эту страницу, введя URL-адрес в адресной строке. Также используется для других явных действий навигации. Смотрите также generated (MDN), который используется в тех случаях, когда пользователь выбрал выбор, который не смотреть на все как URL.
  • "auto_bookmark"
    Пользователь получил эту страницу с помощью предложения в пользовательском интерфейсе - например, через пункт меню.
  • "auto_subframe"
    Навигация подрамника. Это любой контент, который автоматически загружается в кадр не верхнего уровня. Например, если страница состоит из нескольких кадров, содержащих объявления, эти URL-адреса объявлений имеют этот тип перехода. Пользователь может даже не понимают содержание на этих страницах представляет собой отдельный кадр, и поэтому не может заботиться о URL (смотри также manual_subframe (MDN)).
  • "manual_subframe"
    Для навигационных систем подкадра, которые явно запрашиваются пользователем и генерируют новые записи навигации в списке «назад/вперед». Явно запрошенный фрейм, вероятно, более важен, чем автоматически загруженный фрейм, потому что пользователь, вероятно, заботится о том, что запрошенный фрейм был загружен.
  • "generated"
    Пользователь добрался до этой страницы, введя адресную строку и выбрав запись, которая не выглядела как URL. Например, совпадение может иметь URL-адрес страницы результатов поиска Google, но может показаться пользователю «Поиск в Google для ...». Это не совсем то же самое, что и typed (MDN) Навигация, потому что пользователь не печатал и не указывал целевой URL. См. Также keyword (MDN).
  • "auto_toplevel"
    Страница была указана в командной строке или является начальной.
  • "form_submit"
    Пользователь заполнил значения в форме и отправил их. Обратите внимание, что в некоторых ситуациях - например, когда форма использует сценарий для отправки содержимого - отправка формы не приводит к этому типу перехода.
  • "reload"
    Пользователь перезагрузил страницу, нажав кнопку перезагрузки или нажав Enter в адресной строке. Завершение сеанса и повторная открытая вкладка также используют этот тип перехода.
  • "keyword"
    URL-адрес был сгенерирован из сменного ключевого слова, кроме поставщика поиска по умолчанию. См. Также keyword_generated (MDN).
  • "keyword_generated"
    Соответствует запросу, созданному для ключевого слова. См. Также keyword (MDN).

Чтобы различать некоторые типы переходов, в дополнение к transitionType значений, вы также хотите посмотреть на TransitionQualifier (MDN). Возможные значения (от Chrome documentation, которые описаны несколько иначе on MDN):

  • "client_redirect"
    один или несколько перенаправлений, вызванные JavaScript или мета-теги обновления экрана на странице произошло во время навигации.
  • "server_redirect"
    Одна или несколько перенаправлений, вызванных HTTP-заголовками, отправленными с сервера, произошли во время навигации.
  • "forward_back"
    Пользователь использовал кнопку «Вперед» или «Назад», чтобы начать навигацию.
  • "from_address_bar"
    Пользователь инициировал навигацию с адресной строки (известной как Omnibox).
+0

Спасибо, что он работал отлично. Официальная документация доступна здесь [link] (https://developer.chrome.com/extensions/webNavigation) 'var eventLisenerObj = {}; eventLisenerObj.onCommitted = function (oEvent) { \t console.log ("Dom Loaded" + oEvent.transitionType); }; chrome.webNavigation.onCommitted.addListener (eventLisenerObj.onCommitted); 'добавить этот код в' background.js' также добавить разрешения '' разрешения ': ["webNavigation"] 'в файле манифеста –

+1

@BrockAdams Я полностью поддерживаю вопросы/ответы заданы в кросс-браузерных целях для расширений Chrome/веб-приложений Firefox (и в конечном итоге Edge, Opera и т. д.). Я буду обновлять все ссылки (и некоторый текст) в этом ответе, чтобы также иметь цель MDN, как я сделал в других ответах. На данный момент я прорабатываю некоторые другие вещи, но это должно быть сегодня. – Makyen

+0

Я жду вашего ответа –

-1

Вы можете взглянуть на $locationChangeSuccess.

Вы можете получить этот путь:

var loc = $location.path(); 

Затем на смену loc вы можете прикрепить вашу функцию.