2012-08-22 19 views
7

Próbuję otworzyć wszystkie linki zewnętrzne w witrynie w nowym oknie. Jednak są 2 wersje strony. np. sklep i strona główna. Tak więc na stronie głównej możemy mieć linki na przykład do http://store.site.com.Otwórz wszystkie linki zewnętrzne otwarte w nowej karcie poza domeną

Mam tutaj kod, który pozwoli mi otworzyć wszystkie linki zewnętrzne w nowym oknie. Chciałbym jednak móc wykluczyć niektóre domeny. Jak ten, o którym wspomniałem powyżej.

Oto kod:

$(document).ready(function() { 
    $("a[href^=http]").each(function(){ 
     if(this.href.indexOf(location.hostname) == -1) { 
     $(this).attr({ 
      target: "_blank", 
      title: "Opens in a new window" 
     }); 
     } 
    }) 
}); 

Jestem nowy w JS/jQuery tak dużo informacji byłoby genialne.

Odpowiedz

11

do wyzwalania kliknięć programowo, można zrobić coś takiego:

$(document).ready(function() { 

    $("a[href^=http]").each(function(){ 

     // NEW - excluded domains list 
     var excludes = [ 
     'excludeddomain1.com', 
     'excludeddomain2.com', 
     'excluded.subdomain.com' 
     ]; 
     for(i=0; i<excludes.length; i++) { 
     if(this.href.indexOf(excludes[i]) != -1) { 
      return true; // continue each() with next link 
     } 
     } 

     if(this.href.indexOf(location.hostname) == -1) { 

      // attach a do-nothing event handler to ensure we can 'trigger' a click on this link 
      $(this).click(function() { return true; }); 

      $(this).attr({ 
       target: "_blank", 
       title: "Opens in a new window" 
      }); 

      $(this).click(); // trigger it 
     } 
    }) 
}); 
+0

tech, dzięki za odpowiedź. Przykro mi, ale nie widzę, co jest tu innego, niż to, co mam na górze strony.Czy mógłbyś pokazać mi, gdzie dodaję domenę, która nie powinna działać jako domena zewnętrzna? –

+0

Będę edytować moją odpowiedź, aby odzwierciedlić, że – techfoobar

+0

zobacz moje zmiany logiki listy wykluczeń (proste rozwiązanie). Oryginalna odpowiedź polegała na wskazaniu, w jaki sposób można programowo uruchamiać kliknięcia linków (aby otworzyć je w nowej zakładce). – techfoobar

1

Czy jesteś w stanie edytować kod HTML, aby uzyskać lepszy hak dla może zdarzenie click? Jeśli muszę oddzielić pewne łącza między wewnętrznymi lub zewnętrznymi, zastosuję wartość rel na elemencie HTML.

<a href="URL" rel="external">Link</a> 

Następnie w JavaScript

$('a[rel="external"]').click(function(event) { 
    event.stopPropagation(); 
    window.open($(this).attr('href')); 
    return false; 
    }); 

EDIT: skoro masz już mnóstwo linków, jak ten temat ..

var a = new RegExp('http:\/\/store.blah.com'); 

    $('a').each(function() { 

     if(a.test(this.href)) { 
     $(this).click(function(event) { 
     event.preventDefault(); 
     event.stopPropagation(); 
     window.open(this.href, '_blank'); 
     }); 
     } 

    }); 
+0

Dzięki za odpowiedź. Tak, mam dostęp do kodu HTML, ale istnieją setki linków i jak można sobie wyobrazić, może to zająć trochę czasu. Jednak zamierzam zanotować sposób, w jaki zrobiłeś to dla przyszłych wersji strony, dzięki za to. –

0

myślę, że robię to w ten sposób :

$(document).ready(function() { 
     $("a[href^=http]").each(function(){ 
     if(this.href.indexOf(location.hostname) == -1 && this.href.indexOf("store.domain.com") == -1 && this.href.indexOf("other.domain.rule") == -1) { 
      $(this).attr({ 
       target: "_blank", 
       title: "Opens in a new window" 
      }); 
     } 
     }) 
    }); 

Jest to rodzaj instrukcji, ale jeśli nie chcesz zajmować się dzieleniem łańcuchów i tablic, to jest to rozwiązanie. Jestem pewien, że to pomoże.

Edycja: Oprócz tego możesz skorzystać z rozwiązania firmy techfoobar do wyzwalania kliknięć linków. Pomoże Ci to w wydajności witryny.

+0

Niezła, bardzo dziękuję. Wygląda na to, że to zadziała dla mnie. Niedługo zaktualizuję odpowiedź. –

0

W podobny sposób, jak w odpowiedzi Techfoobara, można utworzyć listę domen, które powinny pozostać otwarte w tym samym oknie. Możesz to zrobić w bardziej rozbudowany sposób, używając zwykłych wyrażeń. Jeśli po prostu wykonasz prosty test indexOf(), pominiesz odsyłacze, które mają pasujące subdomeny, ale nie pasują do domen, chociaż możesz pominąć "$", jeśli chcesz dopasować nazwę w dowolnym miejscu ciągu href.

Ta implementacja powinna zrobić to, co chcesz i są minimalne modyfikacje kodu, który potrzebujesz.

$(document).ready(function() { 
    //populate this list with whatever domain names you want, the 
    //$ sign matches the end of the string, only top level domains are affected 
    var whiteList = [/google.com\/$/, /stackoverflow.com\/$/]; 

    $("a[href^=http]").each(function(){ 
     if(this.href.indexOf(location.hostname) == -1) { 

     //check if the href of the current link matches any of our patterns 
     var href = this.href; 
     if(whiteList.filter(function(x){return x.test(href)}).length == 0) { 

     $(this).attr({ 
      target: "_blank", 
      title: "Opens in a new window" 
     }); 
     } 
     } 
    }) 
}); 

W tym przykładzie wszystkie linki prowadzące do witryny google.com i stackoverflow.com będą również dostępne do otwarcia na istniejącej stronie.

0

Jeśli wolisz używać programu obsługi zdarzeń na ciele niż zmienić DOM, polecam coś takiego ...

// open external links in a new tab 
    $('body').on('click','a',function(){ 
    var $a = $(this); 
    var href = $a.attr('href'); 
    if (href.indexOf('/') == 0) return; // ignore relative links 
    var target = $a.attr('target') || ""; 
    if (target.length > 0) return; // ignore links with a target attribute already 
    window.open(href, '_blank'); // open external links in a new tab 
    return false; 
    }); 
0

Ten rade dla wszystkich domen zewnętrznych wykorzystujących PHP

$(document).ready(function() { 
    $("a[href^=http]").each(function(){ 

     // NEW - excluded domains list 
     var excludes = [ 
     '<?php echo $_SERVER['HTTP_HOST']; ?>' 
     ]; 
     for(i=0; i<excludes.length; i++) { 
     if(this.href.indexOf(excludes[i]) != -1) { 
      return true; // continue each() with next link 
     } 
     } 

     if(this.href.indexOf(location.hostname) == -1) { 

      // attach a do-nothing event handler to ensure we can 'trigger' a click on this link 
      $(this).click(function() { return true; }); 

      $(this).attr({ 
       target: "_blank", 
       title: "Opens in a new window" 
      }); 

      $(this).click(); // trigger it 
     } 
    }) 
}); 
+0

po prostu zamień ten php na 'location.hostname' i nie potrzebujesz już php – Uberfuzzy

Powiązane problemy