LINUX.ORG.RU

[grease monkey help needed] VK links tracking gone


0

1

VK любить следить по каким вы ходите ссылкам (vk.com/away.php) что меня дико раздражает, поэтому я накатал тут (взяв за основу чужой скрипт) такое:


// VKontakte click tracking gone
// version 0.1
// Release Date: 11-11-11
//
// ===== INSTRUCTIONS =====
//
// This is a Greasemonkey user script.
//
// To use this script, get Greasemonkey: http://greasemonkey.mozdev.org/
// After you've installed it, come back to this page. A dialog box will
// appear asking you if you want to install this script.
//
// To uninstall, go to Tools->Greasemonkey->Manage User Scripts, select
// "VKontakte click tracking gone" from the list on the left, and click
// Uninstall.
//
// ==UserScript==
// @name           VKontakte click tracking gone
// @namespace      http://sbdev.org
// @description    Removes click tracking from VK web sites
//
// @include        http://vkontakte.ru/*
// @include        http://vk.com/*
// ==/UserScript==

// doIt();

document.addEventListener('DOMAttrModified', function (event) {
    doIt();
}, false);

document.addEventListener('DOMNodeInserted', function (event) {
    doIt();
}, false);

function doIt() {
  resultLinks = $x("//a");
  resultLinks.forEach(function(link) {  // loop over links
    var oldLink = link.href;
    if (/^http:\/\/vk.com/.test(oldLink) || /^http:\/\/vkontakte.ru/.test(oldLink)) {
      var matches = /away.php\?(to)=(.+?)&/.exec(oldLink);
      if (matches != null) {
        link.href = unescape(matches[2]);
      }
    }
  });
}

// XPath helper, from
// http://wiki.greasespot.net/Code_snippets
function $x() {
  var x='',          // default values
      node=document,
      type=0,
      fix=true,
      i=0,
      toAr=function(xp){      // XPathResult to array
	var final=[], next;
	while(next=xp.iterateNext())
	  final.push(next);
	return final
      },
      cur;
  while (cur=arguments[i++])      // argument handler
    switch(typeof cur) {
      case "string":x+=(x=='') ? cur : " | " + cur;continue;
      case "number":type=cur;continue;
      case "object":node=cur;continue;
      case "boolean":fix=cur;continue;
    }
  if (fix) {      // array conversion logic
    if (type==6) type=4;
    if (type==7) type=5;
  }
  if (!/^\//.test(x)) x="//"+x;            // selection mistake helper
    if (node!=document && !/^\./.test(x)) x="."+x;  // context mistake helper
  var temp=document.evaluate(x,node,null,type,null); //evaluate!
  if (fix)
    switch(type) {                              // automatically return special type
      case 1:return temp.numberValue;
      case 2:return temp.stringValue;
      case 3:return temp.booleanValue;
      case 8:return temp.singleNodeValue;
      case 9:return temp.singleNodeValue;
    }
  return fix ? toAr(temp) : temp;
}

Одна проблема - Firefox жутко тормозит при открытии страниц и пролистывании бесконечных списков (комментариев, новостей и прочих лент).

Как бы это оптимизировать?

Ответ на: комментарий от redixin

Для гугла оно сто лет как есть: Google Tracking-B-Gone

juk4windows
() автор топика

более по другому будет делать редирект когда ты уже попал на авей.пхп - это кстате будет совсем халявно если он тоже отдается аяксом+history api.

zz ★★★★
()

Делал подобный userscript для хрома.

DOMAttrModified, DomSubtreeModified и пр. слишком часто вызывались и от них в итоге отказался.

Сделал как-то так:

document.addEventListener('mousedown',function(event){
    		var node = event.target;
		if(node.tagName == 'A'){
			//проверяем и меняем node.href
		}
}, false);

Возможно, событие будет вызывать не сам элемент ссылки, а его потомок, тогда нодо еще проверять node.parentNode до какой-то глубины.

anonymous
()

Жалько, спецов по GM тута нету.

juk4windows
() автор топика

Я не спец по GreaseMonkey, но вижу в скрипте две странности:

  1. Как я понимаю, каждый раз когда происходит DOMAttrModified или DOMNodeInserted, происходит переработка всей страницы. Почему бы не обрабатывать только event.target?
  2. Точно ли XPath в данном случае быстрее getElementsByTagName?
proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Это всё круто, но я вообще JS не знаю :(

Вы бы не могли переделать/причесать скрипт, чтобы он «правильно» работал?

juk4windows
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.