我在 Laravel 8 中制作了一个 博客应用程序。
我目前正在致力于通过 AJAX 提交评论和评论回复,而不是“经典”地进行。
<div id="commentSuccess-{{ $comment->id ?? '' }}" class="alert-box-ajax alert-box alert-box--success">
Your comment is pending
</div>
<div id="commentFail-{{ $comment->id ?? '' }}" class="alert-box-ajax alert-box alert-box--error">
Failed to add comment!
</div>
<form class="commentForm" method="post" action="{{ route('comment.submit') }}" autocomplete="off">
@csrf
<fieldset>
<input type="hidden" name="article_id" value="{{ isset($article->id) ? $article->id : $article_id }}">
<input type="hidden" name="parent_id" value="{{ $comment->id ?? '' }}">
<div class="message form-field">
<textarea name="msg" id="message" class="h-full-width" placeholder="Your Message" required></textarea>
@error('msg')
<p class="help-block text-danger">{{ $message }}</p>
@enderror
</div>
<br>
<input name="submit" id="submit" class="btn btn--primary btn-wide btn--large h-full-width" value="Add Comment" type="submit">
</fieldset>
为了进行验证,我使用 Jörn Zaefferer 的 jQuery 验证插件 (v1.19.0)
// Validate comment form
$(".commentForm").each(function() {
var form = $(this);
form.validate({
errorElement: 'p',
errorClass: "help-block text-danger",
submitHandler: function(event) {
event.preventDefault();
var $fields = form.find('textarea'),
url = form.attr('action'),
data = form.serialize();
$.ajax({
dataType: "json",
type: "post",
url: url,
data: data,
cache: false,
success: function(response) {
$(`#commentSuccess-${data.article_id}`).slideDown(250).delay(2500).slideUp(250);
$fields.val('');
},
error: function() {
$(`#commentFail-${data.article_id}`).slideDown(250).delay(2500).slideUp(250);
}
});
}
});
});
由于我一直无法找出原因,应该防止“经典”表单提交的部分
event.preventDefault()
不起作用。
经过一些研究,我发现事件实际上是在提交处理程序中收到的第二个参数。第一个是形式本身。
由于某些原因,文档不同步。
您可以尝试这样做来阻止表单默认表单提交。
submitHandler: function(form, event) {
event.preventDefault();
}
// Validate comment form
$(".commentForm").each(function(){
var form = $(this);
form.validate({
errorElement: 'p',
errorClass: "help-block text-danger",
submitHandler: function(_form, event) {
event.preventDefault();
var $fields = form.find('textarea'),
url = form.attr('action'),
data = form.serialize();
$fields.val('');
console.log("Submitting to "+url+" with data: "+data);
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form class="commentForm" method="post" action="/commentSubmit" autocomplete="off">
<fieldset>
<input type="hidden" name="article_id" value="33">
<input type="hidden" name="parent_id" value="1">
<div class="message form-field">
<textarea name="msg" class="h-full-width" placeholder="Your Message" required></textarea>
</div>
<br>
<input name="submit" class="btn btn--primary btn-wide btn--large h-full-width" value="Add Comment" type="submit">
</fieldset>
</form>
<form class="commentForm" method="post" action="/commentSubmit1" autocomplete="off">
<fieldset>
<div class="message form-field">
<textarea name="msg" class="h-full-width" placeholder="Your Message" required></textarea>
</div>
<br>
<input name="submit" class="btn btn--primary btn-wide btn--large h-full-width" value="Add Comment" type="submit">
</fieldset>
</form>
<script src="https://cdn.jsdelivr.net/npm/jquery-v[email protected]/dist/jquery.validate.min.js"></script>
不太熟悉 jQuery 验证插件,但我希望将验证代码放入 Document Ready 函数中会做出一些改变。
$( document ).ready(function() {
$(".commentForm").each(function(){
var form = $(this);
form.validate({
....
})
});
或
$(function() {
$(".commentForm").each(function(){
var form = $(this);
form.validate({
....
})
});