Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Программное нажатие на кнопку из расширения обозревателя

Делаю расширение для сайта. Согласно логике необходимо добавить ссылку, при нажатие (пользователем) на которую, мне необходимо инициировать (программно) нажатие ссылки на сайте.
Конкретно, добавляю ссылку в панель инструментов. При клике на ссылку, необходимо открыть меню добавления комментария под вопросом за счет клика на ссылке «добавить комментарий».
function processAddingAssociationLink() { $("#question .post-menu").append("" + associateHelpText + ""); $("#associate-link").click(function() { $(".question .js-add-link").trigger("click"); $(".question .comment-form textarea").text(associationTag + " "); $(".question .comment-form input").val(addAssociationHelpText); event.preventDefault(); }); }
Вызов $(".question .js-add-link").trigger("click"); не создает нажатия, хотя если выполнять этот код в консоли Хрома, все работает, как надо. Подскажите, пожалуйста, как исправить?
Если выполнить код ($(".question .js-add-link").trigger("click");) в консоли, а затем нажать на созданную мной кнопку, то необходимые поля обновляются (то есть часть обработчика отрабатывает).
Обновление
Решение может быть такое
var event;
if (document.createEvent) { event = document.createEvent("HTMLEvents"); event.initEvent("click", true, true); } else { event = document.createEventObject(); event.eventType = "click"; }
event.eventName = "click";
var element = $(".question .js-add-link")[0]; if (document.createEvent) { element.dispatchEvent(event); } else { element.fireEvent("on" + event.eventType, event); }
Но не до конца понятно, почему оно работает, а стандартный вызов – нет.


Ответ

Тут есть две проблемы.
Основная проблема заключается в том, что метод trigger в jquery выполняет только те обработчики, которые были назначены элементу в том же самом jquery. Ну еще иногда выполняет другие обработчики - но не всегда. А у вас в расширении загружен другой инстанс jquery.
Вторая проблема, content script выполняется в изолированном окружении и в принципе не имеет доступа к объектам страницы, поэтому обычный ответ в таком случае "зачем вы добавили на страницу вторую jquery?" не применим.

Для того, чтобы вызвать обработчик независимо от того кто его зарегистрировал - следует использовать dispatchEvent
Альтернативный вариант - можно внедрить на страницу обычный скрипт через инъекцию тэга