javascript - 在 Ajax 调用中防止 JavaScript 中的默认行为或标记单击事件

标签 javascript ajax addeventlistener preventdefault selectors-api

我过去曾使用 e.preventDefault() 来取消点击事件,但我无法弄清楚为什么它在这种情况下不起作用。我为一列中的所有标签分配了一个类名,然后使用 document.queryselectorAll(.classname) 获取对它们的引用,然后为每个标签添加一个从服务器获取值的点击事件,如果未满足验证应防止默认并给用户消息。

(function(){
const userName = document.getElementById('FullName').value;

// route
$route = '';
if (CheckDeploy(window.location.origin)) {
    $route = '/x/GetReviewerCheck/';
} else {
    $route = '/servername/s/GetReviewerCheck/';
}

let ReviewButtons = document.querySelectorAll('.verifyReviewer'); // .verifyReviewer = className of all a tags in table column

for (var i = 0; i < ReviewButtons.length; i++) {
    const ReviewButton = ReviewButtons[i];
    ReviewButton.addEventListener('click', function (e) {
        let newRow = ReviewButton.parentElement.parentElement;
        let AuditorName = newRow.cells[2].innerText;
        let ReviewType = newRow.cells[8].innerText;

        let ReviewTypeID = 0;
        if (ReviewType == 'Peer Review') {
            ReviewTypeID = 3;
        } else if (ReviewType == 'Team Leader Review') {
            ReviewTypeID = 4;
        }
        else if (ReviewType == 'Supervisor Review') {
            ReviewTypeID = 5;
        }

        let id = newRow.cells[0].firstChild.getAttribute('id').split('_')[1];

        $.ajax({
            url: $route,
            type: 'POST',
            data: { userName: userName, auditor: AuditorName, reviewType: ReviewTypeID, recordID: id },
            success: function (data) {
                // if data is 1, prevent default
                if(data == 1){
                    e.preventDefault();
                    return false;
                }
            }
        });

    }, false);
}
})();

最佳答案

它不起作用,因为响应是异步的。 e.preventDefault() 只有在 ajax 调用得到服务器的响应后才会执行。 你可以做到这一点。

  1. 防止所有操作的默认操作。
  2. 等待回复。
  3. 如果 response 不是 1,则解除 preventDefault() 的绑定(bind)。

我已经更新了 for 循环,并对更改进行了注释。请检查。

for (var i = 0; i < ReviewButtons.length; i++) {
        const ReviewButton = ReviewButtons[i];
        ReviewButton.addEventListener('click', function (e) {
            let newRow = ReviewButton.parentElement.parentElement;
            let AuditorName = newRow.cells[2].innerText;
            let ReviewType = newRow.cells[8].innerText;

            let ReviewTypeID = 0;
            if (ReviewType == 'Peer Review') {
                ReviewTypeID = 3;
            } else if (ReviewType == 'Team Leader Review') {
                ReviewTypeID = 4;
            }
            else if (ReviewType == 'Supervisor Review') {
                ReviewTypeID = 5;
            }

            let id = newRow.cells[0].firstChild.getAttribute('id').split('_')[1];

            $.ajax({
                url: $route,
                type: 'POST',
                data: { userName: userName, auditor: AuditorName, reviewType: ReviewTypeID, recordID: id },
                beforeSend:function()
                {
                    e.preventDefault(); //Prevent default action for all instances.
                },
                success: function (data) {
                    // if data is 1, prevent default
                    if(data != 1){
                        $(this).unbind('click'); // Restores the click default behaviour if data != 1
                        return false;
                    }

                }
            });

        }, false);
    }

关于javascript - 在 Ajax 调用中防止 JavaScript 中的默认行为或标记单击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40430321/

相关文章:

javascript - Google/Firebase reCaptcha 无法与 Angular 一起使用

javascript - jQuery DataTables - 访问所有行数据

javascript - 使用 javascript 或 ajax 在同一页面中打开链接

javascript - forEach 和 addEventListener 方法中 "this"的行为

javascript - XUL 将事件附加到使用 javascript 添加的 anchor

javascript - 无法在 React 应用程序的操作类中创建正确的 url

javascript - 基于 MySql 数据的单选按钮值更改

javascript - 间隔显示后 Div 的位置不正确(包括 fiddle )

javascript - DataTables Ajax 错误 - 无效的 JSON 响应

javascript - 将事件监听器添加到文档,而不是检查元素是否存在,然后添加事件监听器