【发布时间】:2018-09-21 12:52:17
【问题描述】:
如果密码错误,登录表单应该会显示警报。但是,它显示了 4 次警报。
id:'loginbutton' 的按钮在点击时触发函数'auth()'。 它适用于登录和注销。但是当我尝试使用错误的用户名,密码对时,警报消息 window.alert("Wrong username or password") 会一次又一次地显示四次。这意味着 onclick() 事件由于某种原因被触发了四次。
在这里,相同的登录按钮也可用作退出按钮。我正在使用函数 setLoginButton() 来确定用户的当前状态(登录与否)并据此更新按钮文本。
HTML:
<body onload = "setLoginButton()">
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Lorem</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<form class="navbar-form navbar-right">
<div class="form-group">
<input type="text" placeholder="Username" class="form-control" id="username">
</div>
<div class="form-group">
<input type="password" placeholder="Password" class="form-control" id="password">
</div>
<button type="submit" class="btn btn-success" onclick="auth(event)" id="loginbutton">Sign in</button>
</form>
</div><!--/.navbar-collapse -->
</div>
</nav>
Javascript:
// Init datatables
$(document).ready( function () {
$('#content1').DataTable();
$('#holdTable').hide();
} );
function setLoginButton() {
token = window.sessionStorage.getItem('cicitoken');
if (token == null) {
return false;
}
else {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 400) {
window.sessionStorage.removeItem('cicitoken');
buttonText = "Sign In";
displayForm = "block";
}
else {
buttonText = "Sign Out";
displayForm = "none";
}
document.getElementById("loginbutton").innerHTML = buttonText;
document.getElementById("username").style.display = displayForm;
document.getElementById("password").style.display = displayForm;
};
xhttp.open("POST", "/api-token-verify/", true);
xhttp.setRequestHeader("Content-type", "application/json");
xhttp.send(JSON.stringify({"token": token}));
}
}
//auth function to get token and use sessionstorage
auth = function(e) {
e.preventDefault();
token = window.sessionStorage.getItem('cicitoken');
if ( token != null) {
window.sessionStorage.removeItem('cicitoken');
location.reload()
}
else {
var xhttp = new XMLHttpRequest();
jdata={username:document.getElementById("username").value,password:document.getElementById("password").value};
xhttp.onerror = function(xhr, status, err) {
console.log(err);
}
xhttp.onabort = function(xhr, status, err) {
console.log(err);
}
xhttp.onreadystatechange = function() {
if (xhttp.readyState==4 && xhttp.status==200) {
var response = JSON.parse(xhttp.responseText);
window.sessionStorage.setItem('cicitoken',response.token);
}
else {
window.alert("Wrong username or password");
setLoginButton();
}
setLoginButton();
}
xhttp.open("POST", "/api-token-auth/", true);
xhttp.setRequestHeader("Content-type", 'application/json; charset=UTF-8');
xhttp.send(JSON.stringify(jdata));
}
}
【问题讨论】:
-
试试把type button和event.stopPropagation()
标签: javascript html onclick