#javascript #jquery #dom-events #greasemonkey
#javascript #jquery #dom-события #greasemonkey
Вопрос:
У меня есть скрипт Greasemonkey, который выполняет некоторую связь между JIRA и приложением ticket. Когда вы связываете элемент с билетом JIRA, он отправляет некоторые сообщения API в JIRA, чтобы добавить другой билет в JIRA, чтобы он был двунаправленным. Соответствующий HTML (который я не могу изменить)::
<div id="related_inputs" class="related-items-actions-inner">
<label class="align" style="width: 104px;">full_jira_url: </label>
<input type="text" style="margin-left: 109px;">
<br>
</div>
И кнопка:
<a id="relate-button" class="tt_button">
<span id="relate-button-text">Relate</span>
</a>
Поэтому, по сути, когда пользователь нажимает кнопку / ссылку, я хочу извлечь значение, введенное во вводе выше (в div «связанные входы»), а затем выполнить некоторые другие действия. Раньше он работал и больше не работает, поэтому я не уверен, связано ли это с регрессией браузера, изменением JIRA или изменением кода веб-сайта, для которого я пишу сценарий.
Суть скрипта Greasemonkey заключается в:
(function () {
console.log("Started script!");
$('#relate-button').click( function(event) {
var related_ticket_type = $('#related_inputs label').text().trim();
console.log("ticket type is " related_ticket_type);
if (related_ticket_type != JIRA_LABEL_TEXT) {
return;
}
var jira_url = $('#related_inputs input').val();
console.log(jira_url); // <<== this is "" all the time now even when the input has data in it when pressed
var match = jira_url.match(JIRA_REGEX);
if (match.length != 2) {
console.log("We didn't match the URL to a valid RDS Jira url.")
return;
}
...
Проблема в том, что значение, которое я получаю от элемента ввода, каждый раз пустое. Я подтвердил в консоли, что это правильный элемент ввода. Элемент label является правильным, поскольку он попадает во входной код.
Есть идеи или предложения?
После того, что я обнаружил ниже, вопрос сводится к следующему: в чем разница между jQuery .click(handler)
и vs element.addEventListener( 'click', function(event) {...}, true)
?
Комментарии:
1. Какая версия Greasemonkey? GM 2 добавил несколько вещей. Каков ваш блок метаданных? (лучше всего также ссылаться на весь скрипт) войдите в консольный журнал
$('#related_inputs input')
и трижды проверьте, что это ожидаемый узел.2. Да, определенно найден правильный узел, просто из-за какой-то проблемы с синхронизацией значение =»», даже если при вводе текста в нем есть текст во время нажатия на ссылку. addEventListener решил это, хотя я не знаю почему.
3. Аргх, поэтому я использовал .on(‘щелчок’… и делегат для прикрепления события к внешнему div, просто если веб-сайт выполнял некоторый AJAX, но он по-прежнему обнаруживает, что поле ввода текста пустое (метка всегда правильная, и в div есть только один ввод, поэтому объект ввода правильный, только с пустым значением =»»). Есть другие идеи?
Ответ №1:
Поэтому вместо использования jquery .click(обработчика) я сделал следующее:
var button_el = document.getElementById('relate-button');
button_el.addEventListener( 'click', function(event) {....}, true);
Это устранило проблему (т.Е. Значение url не было пустым). Тем не менее, мне было бы действительно интересно узнать, почему это устранило мою проблему.
Я использую Greasemonkey 1.15.