Измените ссылки href с помощью событий onmousedown и click.
В основном, когда я делаю поиск в Яндексе, я получаю что-то вроде этого:
,
Однако, когда я щелкаю правой кнопкой мыши и копирую ссылку, я получаю не настоящую ссылку, а более раннюю (ту, которая работает как промежуточная функция с функцией отслеживания моего клика перед перенаправлением на нужную ссылку).
Я пытаюсь написать скрипт, который удаляет эти ненужные ссылки. Вот что я попробовал:
function decodeURL(str) {
return decodeURIComponent((str+'').replace(/\+/g, '%20'));
}
function getRealLinks() {
var classes = document.getElementsByClassName('organic typo typo_text_m typo_line_s'); // gets any search result
var cleanLinks = new Array(); // we'll store any clean link to this array
for (i = 0; i < classes.length; i++) {
var html = classes[i].innerHTML; // we get part of the inner html of the selected search result
var pattern = /(url=(.*?))(?=&\w+=)/; // with this regex we'll match the url
var match = pattern.exec(html); // attempt matching pattern
cleanLinks.push(decodeURL(match[2])); // decode the url, then push the match to the array
}
console.log(cleanLinks);
}
function bindEventListeners() {
var lis = document.getElementsByTagName('li'); // search results have `li` selector
for (var i = 0; i < lis.length; i++) { // iterate every element
(function(i) {
lis[i].addEventListener('click', function() { // add a listener to the current element
alert(this.dataset.cid); // each result has an id (by default between 0-9)
}, false);
})(i);
}
}
bindEventListeners();
getRealLinks()
дает мне правильные ссылки, но я не знаю, как "прогресс", чтобы заменить href
s результатов поиска с чистыми ссылками.
bindEventListeners()
как он называется, привязывает слушателей, которые будут срабатывать при щелчке по части тела результата поиска. Мне будет полезно получить id
результата поиска по клику, просто чтобы отклонить ссылки на нужную мне. Например, пользователь нажимает на результат поиска с индексом 3
, Я сделаю var search_3 = getRealLinks()[3]
,
Как я могу заменить те ссылки, которые вы видите, чистыми в JavaScript?
1 ответ
Прикрепить mousedown
слушатель на window
, самый верхний объект DOM, и укажите true
параметр useCapture в addEventListener для перехвата события в самом начале фазы захвата из window
к цели клика. То есть наш код будет выполняться до onmousedown
,
// ==UserScript==
// @name Defluff yandex links
// @include *://yandex.*/*
// ==/UserScript==
window.addEventListener('mousedown', event => {
const a = event.target.closest('a');
if (a) {
a.onmousedown = null;
}
}, true);