2014-09-04 56 views
0

我在銀行網站上使用以下代碼來警告用戶他們將離開網站。在JavaScript彈出警告消息中排除特定網址

$('a').filter(function() { 
      return this.hostname && this.hostname !== location.hostname; 
      }) 
      .click(function() { 
      return window.confirm('Warning message here...'); 
      }); 
}); 

當前當您點擊在線銀行登錄時,您將看到彈出窗口。我需要能夠排除不屬於網站域名的特定網址,因此我可以排除網上銀行網站,但我不知道如何去做。

任何幫助表示讚賞。

回答

1
$('body').on('click', 'a', function(e){ 
    if(this.hostname != 'mydomain.com' && this.hostname != 'www.mydomain.com'){ 
    if(!confirm('This is an external link. Are you sure you want to leave?')){ 
     e.preventDefault(); 
    } 
    } 
}); 

我在這裏使用event delegation以確保它捕獲所有鏈接(包括注入的鏈接)。 如果您有子域(例如www.mydomain.com),則可能需要添加多個域條件。

+0

所以我會把其中mydomain.com是上面顯示的網站的域名?你可以給我一個例子,我將如何添加另一個域到該JavaScript?謝謝。 – Lonnie 2014-09-04 21:39:22

+0

@Lonnie這是正確的,只需將其替換爲您的域。我更新了代碼以顯示多個域。 – Ryan 2014-09-04 21:41:35

+0

我用這個替換了原來的腳本並添加了兩個域,它不起作用。彈出窗口根本不顯示任何外部鏈接。 – Lonnie 2014-09-04 21:58:51

0

下面是Ryan回答的改進,它允許您阻止自己的域以及外部鏈接的特定路徑。

它會單獨檢查主機和路徑 - 因此您可以阻止所有不屬於您自己的域的鏈接,以及您自己的域中的特定路徑。

如果用戶點擊被阻止的鏈接,「request_confirmation」功能會在允許導航離開當前頁面之前向用戶請求確認。

我已將邏輯分解爲多個功能,因此您可以輕鬆修改它。

$('body').on('click', 'a', function(e){ 
    return (should_link_be_blocked($(this).attr('href')))? request_confirmation() : true; 
}); 

function should_link_be_blocked(link){ 
    var url = new URL(link); 

    return should_host_be_blocked(url.hostname) || should_path_be_blocked(url.pathname); 
} 

    function should_host_be_blocked(host){ 
    return !(host.match(/([a-z0-9]+\.)?example.com/)); 
    } 

    function should_path_be_blocked(path){ 
    var not_allowed = ['/block_me.html', '/block_another.html']; 
    var block = false; 

    not_allowed.forEach(function(n_a){ 
     block = (path == n_a)? true : block; 
    }); 

    return block; 
    } 

function request_confirmation(){ 
    return confirm('This is an external link. Are you sure you want to leave?'); 
} 

這裏工作的是一個醜陋的例子:http://codepen.io/anon/pen/Gjagi

+0

不幸的是,這個例子只適用於我在鉻,在safari彈出窗口不起作用。我必須讓它在safari的mac上也能正常工作。 – Lonnie 2014-09-05 15:25:23