开发者问题收集

e.PreventDefault 未定义

2016-12-13
3107

我有 registerAjax(e) 函数:

function registerAjax(e) {
e.preventDefault();
let userData = {
    username: $("#username").val(),
    password: $("#password").val(),
};
$.ajax({
    method: "POST",
    url: kinveyBaseUrl + "user/" + kinveyAppKey + "/",
    headers: kinveyAppAuthHeaders,
    data: userData,
    success: registerSuccess,
    error: handleAjaxError
});
function registerSuccess(userInfo) {
    saveAuthInSession(userInfo);
    showInfo('User registration successful.');
}

此函数由此函数调用

function registerUser() {
registerAjax();

当我运行应用程序时,我收到控制台消息“未捕获的 TypeError:无法读取未定义的属性‘preventDefault’(…)”

有没有简单的解决方案可以修复此异常?

function startApplication() { 
  //Bind The Form Submit Buttons 
  $(document).ready(function () {
    $("#btnRegister").on('click', registerUser()); 
  });
  loadingBox(); 
  //Bind the info / error boxes: hide on click 
  $("#infoBox, #errorBox").click(function () { 
    $(this).fadeOut(); 
  }); 
}
2个回答

这并没有像您想象的那样执行:

$("#btnRegister").on('click', registerUser());

这会立即调用 registerUser() ,并将点击处理程序设置为 registerUser() 返回值 ,该处理程序不会返回任何内容。我怀疑您想要的是:

$("#btnRegister").on('click', registerUser);

在将函数传递给处理程序时,函数名称本身可以用作表示该函数的变量。(或者在使用该函数执行大多数操作时,除了调用它之外。在 JavaScript 中,函数是一种与其他类型一样的类型,可以像任何变量一样传递。)

此外 ,您需要将事件传递给其他函数。默认情况下,点击处理程序将传递事件,因此您可以使用它:

function registerUser(e) {
    // e is your event
}

就您而言,您需要将其传递给其他函数:

function registerUser(e) {
    registerAjax(e);
    // etc.
}
David
2016-12-13

传递 registerUser 引用而不是调用它:

$("#btnRegister").on('click', registerUser); 

并将 event 参数添加到 registerUser

function registerUser(e) {
  registerAjax(e);
  ...
}
Igor
2016-12-13