Se você estiver usando o Firefox , terá sorte, pois a resposta a seguir se aplica a você. Se você estiver usando o Chrome, tem muito menos sorte, veja a parte inferior desta resposta.
O Greasemonkey dispara os scripts do usuário assim que o DOM é carregado , portanto, você não precisa implementar um ouvinte "pronto para DOM".
Você também está no Firefox, para poder usar alguns doces modernos: for...of, let.
Aqui está o script Greasemonkey resultante:
// ==UserScript==
// @name Remove Google redirects
// @namespace google
// @description Remove redirects from Google Search result links.
// @include https://www.google.*/*
// @version 1
// @grant none
// ==/UserScript==
for (let element of document.querySelectorAll('#res .r > a')) {
element.removeAttribute('onmousedown');
}
Graças ao fato de letnão haver declarações locais, você não precisa incluir o código acima em um IIFE .
Para os infelizes usuários do Chrome (Tampermonkey):
Os links não são encontrados no momento em que o script é executado, mesmo que document.readyState === 'complete'... como resultado, você precise implementar algum loop com timer.
Portanto, você acaba com:
// ==UserScript==
// @name Remove Google redirects
// @namespace google
// @description Remove redirects from Google Search result links.
// @include https://www.google.*/*
// @version 1
// @grant none
// ==/UserScript==
(function removeGoogleRedirects() {
var links = document.querySelectorAll('#res .r > a');
if (links.length === 0) {
setTimeout(removeGoogleRedirects, 100);
return;
}
for (var link of links) {
link.removeAttribute('onmousedown');
}
})();
Atualização em outubro de 2018:
devido a uma alteração de marcação na página do Google, é h3.rnecessário alterar para div.r.
Fui mais longe e substituí h3.r > apor #res .r > a(substitui "tag.class" por apenas ".class" e adicionei um pai como segurança, para que o seletor não seja muito genérico).