Я сделал кнопку, которая открывает новую страницу в новой вкладке, например https://google.com. И я отправляю сообщение фоновому скрипту, чтобы он начал принимать URL-адрес новой открытой страницы. Проблема в том, что я не знаю, как остановить слушателя после получения URL. Таким образом, он продолжает выполнение даже после того, как я закрыл эту вкладку.
Popup.js
$('#click').click(function(e)
{
chrome.tabs.create({url: 'https://google.com'});
chrome.runtime.sendMessage({greeting: "googleisopened"}, function(response) {
console.info(ok);
});
});
Background.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.greeting == "googleisopened")
{
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
alert(changeInfo.url);
});
}
});
Вы хотите получить URL-адрес новой вкладки один раз? или пока открыта новая вкладка? ...
Да, я хочу получить URL-адрес один раз



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Думаю, вам интересна эта функция http://api.jquery.com/off/
Он удаляет все события из объекта, поэтому в вашем случае вы можете просто подключить его в любом месте своего события щелчка следующим образом:
$(this).off('click');
// Or like this if you want to be specific
$('#click').off('click');
Вы можете избежать удаления всех обработчиков событий, используя функциональность пространство имен.on() и .off() ...: D
Я пытался использовать его в операторе if, но безрезультатно
"подключи его куда угодно в вашем событии клика". Background.js находится в другой области и не должен влиять на содержимое всплывающего окна.
Но это не решает проблему остановки слушателя. Мне нужно остановить его в фоновом режиме после получения URL-адреса. Мне нужно использовать фоновый скрипт, потому что URL-адрес открывается в новой вкладке. Выполнение события по щелчку заканчивается отправкой сообщения фоновому скрипту.
Выкл. Убирает триггер, но ваша функция продолжит работать нормально. Я думаю, вы неправильно понимаете, как работает «выключено». Это не равно «возврату», даже если это была первая строка функции, ваша функция продолжит работать.
Спасибо всем, кто пытался мне помочь. Я сам нашел решение.
Вместо использования слушателя я начал использовать tabs.getSelected для получения URL страницы только при необходимости (а не в цикле, как в onUpdated.addListener).
Итак, сценарий задний план будет следующим:
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.greeting === "googleisopened")
{
chrome.tabs.getSelected(null, function(tab)
{
chrome.tabs.onUpdated.addListener(mylistener);
function mylistener (tabId, changeInfo, tab)
{
alert(changeInfo.url);
chrome.tabs.onUpdated.removeListener(mylistener);
}
});
}
});
Возможный дубликат Как удалить прослушиватель событий в расширении Chrome