2013-02-08 41 views
0

有一個錨標記:inventoryHome將用戶帶到不同的頁面。有條件地阻止錨標記的默認操作的問題

如果rateMap的大小大於0,我需要顯示一個確認彈出窗口,確認用戶是否想要放棄未保存的更改。

如果用戶確認放棄,則會調用navigateToInv()方法。

在下面的代碼中,雖然navigateToInv()方法被稱爲&,但單擊事件正在觸發,頁面不會導航到新頁面。

<li><a href="<%=request.getContextPath()%>/inventory" id="inventoryHome"> <spring:message code="inventoryTab" /></a></li> 

    $('#inventoryHome').click(function(e) { 
      if (Object.size(rateMap) > 0) { 

       e.preventDefault(); 
       showDiscardConfirmationPopUp(navigateToInv, false); 
      } 
     }); 

    var navigateToInv = function(){ 
     rateMap = new Object(); 
     $('#inventoryHome').trigger('click'); 
    } 

Object.size = function(obj) { 
    var size = 0, key; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 

無法確定問題。

+1

這似乎不亦樂乎令人費解的。如果從錨點抓取當前href並執行了document.location.href = thatUrl,該怎麼辦? –

+0

謝謝史蒂夫。這樣一個簡單直接的方式來實現它。 :) –

+0

將回答我是如何達到同樣的,一旦我被允許回答是在2天后。 –

回答

0

我實現一樣:

var navigateToInv = function(){ 
    document.location.href= $("#inventoryHome").attr('href'); 
} 
$('#inventoryHome').click(function(e) { 
    if (Object.keys(ratePopUpMap).length > 0) { 
    e.preventDefault(); 
    showDiscardConfirmationPopUp(navigateToInv, false); 
    } 
}) 
-1

該問題似乎是rateMap從未改變爲<= 0。因此,即使手動調用click()方法,它仍然會遵循禁用默認操作的鏈,這就是爲什麼它不會重定向到所需的頁面。您應該添加另一個始於true的狀態變量,因此它會觸發預設的默認分支,然後在click()的手動調用navigateToInv()之前立即設置爲false。

+0

rateMap = new Object();在navigateToInv()中將它設置爲零。 –

1

問題是,在錨標記上調用trigger('click')不會導致它導航到由href值指定的頁面。見this answer

你要麼必須設置window.location到href值,或更改邏輯,這樣你打電話e.preventDefault()用戶選擇後,纔不放棄更改,就像這樣:

$('#linkId').click(function(e) { 
    if (hasUnsavedChanges() && !confirmDiscard()) { 
     e.preventDefault(); 
    } 
} 

在你的情況下,將是:

$('#inventoryHome').click(function(e) { 
    if (!$.isEmptyObject(rateMap) && !confirm("Discard changes?")) { 
     e.preventDefault(); 
    } 
} 
+0

謝謝。現在我明白了這個問題。結合所有的註釋,我達到了相同的:'var navigateToInv = function(){ \t document.location.href = $(「#inventoryHome」)。attr('href'); 。 } \t $( '#inventoryHome')點擊(函數(e)中{ \t \t如果(Object.keys(ratePopUpMap)。長度> 0){ \t \t \t e.preventDefault(); showDiscardConfirmationPopUp(navigateToInv,假); \t \t} \t});' –

+0

Object.keys(rateMap)對IE有問題。 (http://forum.jquery.com/topic/object-keys-fails-in-ie8)這就是我沒有接受答案的原因。 –

+0

@Shikha - 答案的重點在於'trigger()'不適用於你的情況。我在代碼中顯示了'Object.keys()',因爲你在上面的註釋中提到了它。您的原始代碼已經有了一個函數來測試'rateMap'是否有任何屬性,但我認爲您可以使用'$ .isEmptyObject()'代替。 –