2012-02-07 2 views
0

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

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

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 
    } 
    } 
})(); 
+0

Извините, что вызвал это, но это звучит как-то отрывочно. –

+0

Какие браузеры? Если это всего лишь один браузер (например, Chrome), это совсем другая задача от поддержки всего браузера. –

+0

Хенрик, я обновил вопрос, чтобы он был настолько визуальным, насколько это возможно. –

ответ

1

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

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

(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. «Правильный» способ состоял бы в том, чтобы работать, когда запрос, но для вашей задачи может быть достаточно секунды или половины.

2

Попробуйте это:

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: в начале.

Смежные вопросы