Javascript Bookmarklet для нажатия ссылок с определенным текстом - PullRequest
0 голосов
/ 07 февраля 2012

На странице много ссылок, и мне нужно быстро щелкнуть ссылки с текстом «Удалить». Это вызывает запрос AJAX, поэтому требуется небольшая пауза. Каким был бы код букмарклета javascript (без библиотек, например, jQuery), который будет быстро вызывать событие onclick (), связанное со ссылками непосредственно как атрибут, но только с текстом «Удалить»?

Насколько я могу сделать это сам, я получаю:

javascript:
(function(){
  var links = document.getElementsByTag('a');
  for(var i = 0; i <= links.length; i++){
    if(links[i].innerHTML == "Delete"){
     setTimeout("links[i].onclick()", 500); // pause for previous AJAX to proceed
    }
  }
})();

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Попробуйте:

javascript:j=0;l=document.links;for(var i=0;i<l.length;i++){if(l[i].innerHTML.toLowerCase().indexOf("delete")!=-1){setTimeout("l["+i+"].onclick();",j*500+1);j++;}}

Обратите внимание на несколько вещей.Во-первых, я только что проверил, содержит ли HTML внутри тега ссылки слово delete.Если бы внутри тега ссылки был какой-либо дополнительный HTML или текст, ваш код не работал бы.Во-вторых, команда в setTimeout исправляет проблему области видимости, в которой переменная i не существовала бы при запуске setTimeout.Наконец, обратите внимание, что время ожидания указано как j * 500, причем j - это отдельная переменная, которая увеличивается каждый раз, когда обнаруживается ссылка «удалить».setTimeout не ждет полсекунды, запускает код и возвращается.Скорее он возвращает сразу, затем запускает код позже, если указано.При этом первая ссылка будет нажата за одну миллисекунду (0 * 500 + 1 = 1), вторая - через 501 миллисекунду, следующая - через 1001 и т. Д.

Я также хочу упомянуть, чтопоследняя версия Firefox, похоже, не поддерживает ввод букмарклетов прямо в адресной строке.Вы должны использовать веб-консоль (Ctrl + Shift + K) или блокнот JavaScript (Shift + F4) для запуска подобных фрагментов.Если вы сделаете это таким образом, удалите javascript: part в начале.

1 голос
/ 07 февраля 2012

onclick часто не может использоваться таким образом - иногда событие не связано напрямую с объектом. Это решение имитирует щелчок. Вместо этого вы должны использовать element.eventDispatch, я нашел его путем поиска , как вызвать события .

Итак, вот что должно работать:

(function(){
  // First we create the event
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);

  var links = document.getElementsByTag('a');
  for(var i = 0; i <= links.length; i++){
    if(links[i].innerHTML == "Delete"){

      // And here, we trigger the event
      setTimeout("links[i].dispatchEvent(evt)", 500); // pause for previous AJAX to proceed

    }
  }
})();

Я не уверен в вашем способе ожидания запросов AJAX. «Правильный» способ будет работать при запросе, но для вашей задачи может быть достаточно секунды или половины.

...