有条件地阻止锚标记的默认操作的问题

时间:2013-02-08 05:33:53

标签: javascript jquery

有一个锚标记: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;
 };

无法识别问题。

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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);
     }
})

答案 2 :(得分:-1)

问题似乎是rateMap永远不会变为<= 0。因此,即使您手动调用click()方法,它仍然会跟随禁用默认操作的链,这就是它不会重定向到所需页面的原因。您应该添加另一个开始为true的状态变量,因此它会触发prevent default分支,然后在click()内手动调用navigateToInv()之前立即设置为false。