Xem xét đoạn code dưới đây:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
function getTokenFromApi(){
return '1234567890';
}
function addTokenFromAPI (e) {
e.preventDefault();
var token = getTokenFromApi();
$('<input>')
.attr('type','hidden')
.attr('name', 'token')
.val('1234567890')
.appendTo('form');
$("form")
.unbind('submit')
.trigger('submit');
}
$(document).ready(function(){
$("form").on('submit', addTokenFromAPI);
});
</script>
</head>
<body>
<form action="/action_page.php">
First name: <input type="text" name="FirstName" value="Mickey"><br>
Last name: <input type="text" name="LastName" value="Mouse"><br>
<input type="submit" value="Submit" name="submit">
</form>
</body>
</html>
Mô tả: khi click vào button Submit, form gọi method preventDefault để thêm vào 1 field mới, (có thể là token trả về từ api nào đó) sau đó unbind('submit')
để remove handler, rồi lại submit lần nữa để chạy handler default là submit form.
Expected: click 1 lần form add thêm input token rồi submit
Actual: click 1 lần form chỉ thêm input token, click lần 2 form mới submit.
Test: các bạn có thể copy code và test tại:
https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_submit
Yêu cầu:
- giải thích nguyên nhân
- cách khắc phục.
Câu hỏi chỉ nhằm mục đích để các bạn trao đổi kiến thức.
Những comment kiểu như: thời nào rồi còn dùng jquery?, sao không dùng ajax mà dùng form submit? reactjs dễ hơn nhiều? xin vui lòng đừng