2008-11-25 6 views
7

Do celów śledzenia dokumentów innych niż HTML za pomocą google analytics potrzebuję wspomnianego algorytmu. Powinno ono:JavaScript: jak ustalić, czy link jest skierowany do tej samej domeny, co strona, na której się znajduje?

  • nie trudno kod domena
  • zignorować protokół (tj HTTP/HTTPS)
  • nie martwić się o obecności/nieobecności „www” (niedopuszczalność linki prefiks „www” a wszystkie strony BĘDĄ podawane za pośrednictwem "www")

Jest to skomplikowane z tego powodu, że muszę uzyskać do niego dostęp za pośrednictwem funkcji wywoływanej przez "attachEvent" tylko IE.

AKTUALIZACJA Niestety, napisałem to pytanie bardzo poważnie naprawdę. Prawdziwy problem polega na tym, aby działało to poprzez zdarzenie, ponieważ IE ma własny świat obsługi eventów. Weźmy następujący:

function add_event(obj) { 
    if (obj.addEventListener) 
     obj.addEventListener('click', track_file, true); 
    else if (obj.attachEvent) 
     obj.attachEvent("on" + 'click', track_file); 
} 

function track_file(obj) { } 

Wydaje się jakby „obj” w track_file nie jest taka sama w różnych przeglądarkach - w jaki sposób można odwołać się do tego, co kliknięciu w IE?

+0

Czy to dokument, który otwierasz w przeglądarce? –

+0

Zobacz http://stackoverflow.com/questions/9404793/check-if-same-origin-policy-applies – Seth

Odpowiedz

5

Chciałbym podkreślić, że jeśli jesteś na so.com poniższe linki są adresy URL w tej samej domenie:

(może się to wydawać dziwne, ale ostatnie dwie z nich są ważne: Jeśli” ponownie na http://so.com, ostatni zabierze Cię do http://so.com/mail.google.com/index.php?var=value, który jest całkowicie ważny)

To tak naprawdę nie odpowiada na pytanie, ale mam nadzieję, że poprowadzi resztę odpowiedzi. Jeśli jest jeszcze coś dziwnego, możesz je dodać.

+1

także href = "javascript: ..." jest tą samą domeną, chyba że zawiera zmianę dokumentu. , ale od ciebie zależy, co z tym zrobisz. – vsync

3

To brzmi jak odpowiedź komedii, ale z całą powagą byłoby wskazane, że można też zrobić coś takiego:

$('a.external') 

Oczywiście porównanie regex do window.location jest odpowiedzią programowy.

+0

Ponieważ często stosujemy linki zewnętrzne z 'target =" _ blank "', więc odwiedzający nie opuszczą strony, możesz również użyć tego atrybutu. – Gus

2

Sposób mocowania nie jest jedynym sposobem detektory zdarzeń IE oraz W3 różnią. Dla IE należy przeczytać window.event.srcElement; w W3 jest to event.target, gdzie event jest parametrem przekazywanym do funkcji wywołania zwrotnego.

Jeśli nie potrzebujesz wielu programów do obsługi zdarzeń w linkach, starsze modele zdarzeń DOM 0 są prawdopodobnie łatwiejszym sposobem, aby się do tego podejść, pozwalając nam tylko "nam" to uzyskać obiekt w dowolnej przeglądarce.

function bindtolinks() { 
    for (var i= document.links.length; i-->0;) 
     document.links.onclick= clicklink; 
} 

function clicklink() { 
    if (this.host==window.location.host) { 
     dosomething(); 
     return true; // I'm an internal link. Follow me. 
    } else { 
     dosomethingelse(); 
     return false; // I'm an external link. Don't follow, only do something else. 
    } 
} 
+0

Byłoby wspaniale, gdybym mógł pozbyć się podejścia ze starej szkoły, ale to musi być bardzo ogólny skrypt, który odnosi się do wszystkich linków na stronie, z których niektóre mogą mieć już funkcje obsługi zdarzeń. –

+0

Jeśli wiesz, że używasz innych programów obsługi zdarzeń, możesz oczywiście zapisać (link.orig_onclick = link.onlick) i ponownie wywołać istniejący moduł obsługi zdarzeń. – bobince

0

będę odpowiedzieć na pytanie w aktualizacji, o wydarzeniach w IE:

function track_file(evt) 
{ 
    if (evt == undefined) 
    { 
    evt = window.event; // For IE 
    } 
    // Use evt 
} 

jest klasyczny sposób, aby uzyskać spójną obiekt zdarzenia w różnych przeglądarkach.

Potem użyłbym wyrażeń regularnych do znormalizowania adresu URL, ale nie jestem pewien, na co się opiekujesz.

[EDIT] Niektóre prawdziwy kod do umieszczenia w praktyce to, co napisałem wyżej ... :-)

function CheckTarget(evt) 
{ 
    if (evt == undefined) 
    { 
    // For IE 
    evt = window.event; 
//~  event.returnValue = false; 
    var target = evt.srcElement; 
    var console = { log: alert }; 
    } 
    else 
    { 
    target = evt.target; 
//~  preventDefault(); 
    } 
    alert(target.hostname + " vs. " + window.location.hostname); 
    var re = /^https?:\/\/[\w.-]*?([\w-]+\.[a-z]+)\/.*$/; 
    var strippedURL = window.location.href.match(re); 
    if (strippedURL == null) 
    { 
    // Oops! (?) 
    alert("Where are we?"); 
    return false; 
    } 
    alert(window.location.href + " => " + strippedURL); 
    var strippedTarget = target.href.match(re); 
    if (strippedTarget == null) 
    { 
    // Oops! (?) 
    alert("What is it?"); 
    return false; 
    } 
    alert(target + " => " + strippedTarget); 
    if (strippedURL[1] == strippedTarget[1]) 
    { 
//~  window.location.href = target.href; // Go there 
    return true; // Accept the jump 
    } 
    return false; 
} 

to kod testu, nie kod produkcyjny, oczywiście!

Linie z komentarzami // ~ pokazują alternatywny sposób zapobiegania klikaniu linku w celu wykonania skoku. Jest to, w pewnym sensie, bardziej wydajne, ponieważ jeśli używam Firebug's console.log, ciekawie zwrot false jest nieskuteczny.
Użyłem tutaj zachowania "podążaj za linkiem lub nie", nie znając prawdziwego celu końcowego.

Jak podkreślono w komentarzach, RE może być prostsze przy użyciu nazwy hosta zamiast href ... Zostawiam to jako, ponieważ było już zakodowane i może być użyteczne w innych przypadkach.
W obu przypadkach należy zastosować specjalne środki ostrożności, aby poradzić sobie z wyjątkowymi przypadkami, takimi jak localhost, adresy IP, porty ...
Pozbyłem się nazwy domeny przed ponownym przeczytaniem pytania i stwierdzeniem, że nie było problemu ... Cóż, może to może być przydatne dla kogoś innego.

Uwaga: I przedstawiono podobne rozwiązanie w pytaniu do dekoracji linki: Editing all external links with javascript

+0

W rzeczywistości, evt.srcElement.hostname (IE) i this.hostname (inne) działa dla mnie –

-2
if(someDomElementWhichIsALink.href.indexOf(window.location) != -1) { 
    // this is targeting your domain 
} 
+0

To nie będzie poprawnie wykrywać tej samej/innej domeny. – Seth

0

Biorąc zdarzenie click i oryginalny element docelowy, to powinno działać do pierwotnego pytania:

if(target.protocol == window.location.protocol && target.host == window.location.host){ 
} 

Przeglądarki ładnie przekształcają link z różnych wzorów wymienionych przez @Tom w pełne linki, więc protokół i wartości hosta muszą po prostu pasować do Twojej domeny.

Powiązane problemy