Делаю расширение для сайта. Согласно логике необходимо добавить ссылку, при нажатие (пользователем) на которую, мне необходимо инициировать (программно) нажатие ссылки на сайте.
Конкретно, добавляю ссылку в панель инструментов. При клике на ссылку, необходимо открыть меню добавления комментария под вопросом за счет клика на ссылке «добавить комментарий».
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
Альтернативный вариант - можно внедрить на страницу обычный скрипт через инъекцию тэга