我在 Laravel 8 中制作了一个博客应用程序。我目前正在通过 jQuery (v3.5.0) AJAX 添加评论回复。
在
comment-form.blade.php
我有:
<div class="form-wrapper">
<div class="alert-box-ajax alert-box alert-box--success">
Your comment is pending
</div>
<div 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>
</form>
</div>
当然,上面的模板对每个评论都会重复,因此可以将回复添加到其中任何一个。
回复通过 jQuery Ajax 提交:
$(".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();
$.ajax({
dataType: "json",
type: "post",
url: url,
data: data,
cache: false,
success: function (response) {
if (response.status === 'success') {
form.closest(".form-wrapper").find(".alert-box--success").slideDown(250).delay(2500).slideUp(250)
.slideDown(250)
.delay(2500)
.slideUp(250);
$fields.val("");
} else {
form.closest(".form-wrapper").find(".alert-box--error").slideDown(250).delay(2500).slideUp(250)
.slideDown(250)
.delay(2500)
.slideUp(250);
}
},
error: function (err) {
console.log(err);
},
});
},
});
});
可以选择最初为每个帖子加载最多 10 个评论,其余的通过 Ajax 调用加载到页面滚动上。
当此选项处于活动状态时,上面的脚本无法阻止通过 Ajax 加载的表单的默认行为。
无论每个评论有多少个表单,这都会起作用,因为每个表单都属于单个评论。
$(document).on("submit",".commentForm", function (event) {
event.preventDefault();
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();
$.ajax({
dataType: "json",
type: "post",
url: url,
data: data,
cache: false,
success: function (response) {
if (response.status === 'success') {
form.closest(".form-wrapper").find(".alert-box--success").slideDown(250).delay(2500).slideUp(250)
.slideDown(250)
.delay(2500)
.slideUp(250);
$fields.val("");
} else {
form.closest(".form-wrapper").find(".alert-box--error").slideDown(250).delay(2500).slideUp(250)
.slideDown(250)
.delay(2500)
.slideUp(250);
}
},
error: function (err) {
console.log(err);
},
});
},
});
});