2016-03-19 43 views
1

我用下面的代碼單擊要更改<a>href屬性重定向,
我不想使用window.locationwindow.open這樣做的原因,
因爲如果我用這個方法,當用戶點擊按鈕,他們可以仍然選擇選項卡按鍵盤打開新的URL或不變化HREF重定向

例如a在它的工作原理像往常一樣,但b只改變HREF 不是重定向,爲什麼呢?以及如何解決?

<div class="submit"> 
    <a>submit</a> 
</div> 

一個

$('.submit').on('click', function() { 
    var submit = $(this); 

    // var url = ...; 
    $(submit).find('a').attr('href', url); 
}); 

b

$('.submit').on('click', function() { 
var submit = $(this); 

    requestPost().then(function(response) { 
    // ... 

    // var url = ...; 
    $(submit).find('a').attr('href', url); 
    }); 
}); 
+0

「打開一個新的標籤」是很重要的瀏覽器功能。除非你有非常充分的理由,否則你不應該將其從用戶手中搶走。 –

+0

??雅我同意這一點很重要,那就是爲什麼我問這個問題。儘量找到方法,我可以使用ajax發佈數據,用戶還可以選擇是否打開tab,而不僅僅是使用window.open爲用戶決定。 – user1575921

回答

0

這是因爲在a你在onclick處理程序anchor的容器,這意味着click事件贏得分配href直到onclick處理程序完成才完成(因爲此處理程序可以通過返回來中止點擊和導航false或做一個event.preventDefault)。

雖然b,因爲您使用的是異步函數,onclick句柄成功完成完成異步函數requestPost之前,所以改變了錨的href沒有導航的影響,因爲的onclick已經沒有HREF完成標記,但是如果您再次點擊submit那麼它會導航,因爲href已在之前的點擊中設置。

所以,作爲一個快速的解決方法,你可以做的是觸發錨點擊您指定href屬性後,像

$(submit).find('a').attr('href', url).click();

+0

感謝您的回覆,我試過觸發點擊之前,但它會再次發佈數據,無限循環 – user1575921

+0

右鍵然後做一件事情,在'$('。submit')。'('click',function(){ '返回false,讓我嘗試附加一個片段到我的答案,如果SO支持導航 –

+1

在這種情況下可以在tagName上進行檢查,但無論如何,您對錯誤的過程是正確的,事情是他想要用戶決定是否必須在新選項卡中或在當前選項卡中或在新窗口中打開。 –