2012-08-22 46 views
7

我試圖在新窗口中打開網站上的所有外部鏈接。但是,該網站有兩個版本。例如商店和主要網站。因此,在主站點上,我們可能會有例如http://store.site.com的鏈接。打開除域以外的新選項卡中打開的所有外部鏈接

我在這裏有一些代碼可以讓我在新窗口中打開所有的外部鏈接。不過,我希望能夠排除某些域名。就像我上面提到的那個。

下面是代碼:

$(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" 
     }); 
     } 
    }) 
}); 

我是新來的JS/jQuery的使盡可能多的信息將是輝煌的。

回答

11

對於編程觸發點擊,你可以這樣做:

$(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

高科技,感謝您的答覆。我很抱歉,但我沒有看到這裏與我在頁面頂部有什麼不同。您介意向我展示我添加域的位置,而我認爲這不屬於外部域? –

+0

我將編輯我的答案以反映 – techfoobar

+0

請參閱我對排除列表邏輯的編輯(簡單解決方案)。原始答案是指出如何以編程方式觸發鏈接點擊(以便在新選項卡中打開它們) – techfoobar

1

您可以編輯HTML,以獲得更好的掛鉤,也許點擊事件?如果我需要分離內部或外部之間的某些鏈接,我會在HTML元素上應用相對值。

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

然後

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

編輯:看到,因爲你已經有一噸的鏈接,這個怎麼樣..

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

感謝您的回覆。是的,我可以訪問HTML,但有數百個鏈接,你可以想象,可能需要一段時間。不過,我要記下您爲未來網站構建完成的方式,所以非常感謝。 –

0

我想我會做這樣的:

$(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" 
      }); 
     } 
     }) 
    }); 

這是有點手動,但是,如果你不想處理分割字符串和數組,這是解決方案。我相信這會有所幫助。

編輯:除此之外,您可以使用techfoobar的解決方案來觸發鏈接點擊。這將有助於您的網站性能。

+0

很好,非常感謝。看起來這將對我有用。很快會更新回答。 –

0

與techfoobar的回覆相同,您可以創建應在同一窗口中打開的域列表。儘管使用常規表達式,但可以以更健壯的方式進行。如果你只是做一個直接的indexOf()檢查,你會跳過具有匹配的子域但沒有匹配域的鏈接,但是如果你想匹配href字符串中任何地方的名字,可以省略'$'。

該實現應該做你想做的事情,並且對你需要的代碼進行最小的修改。

$(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" 
     }); 
     } 
     } 
    }) 
}); 

本示例中,所有到google.com和stackoverflow.com的鏈接都將在現有頁面中打開。

0

如果你想用一個事件處理程序的身體比改變DOM,我建議這樣的事情...

// 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

這將這樣的伎倆,使用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

只需用'location.hostname'替換該php,而不再需要php – Uberfuzzy

相關問題