我们在开发子比主题会遇到在使用模态框提交完成后模态框没有自动关闭的问题,那么其实这个问题很好解决,因为子比主题已经写了处理某种异步操作(如Ajax请求)的成功回调的函数,我们只需要在前端中加入相应的代码即可解决!
子比主题后端JS在处理AJAX请求回调的函数:
success: function (n) {
var ys = n.ys ? n.ys : n.error ? 'danger' : '';
notyf(n.msg || '操作成功', ys, '', notyf_id);
miniuploaded(n.no_preview_reset);
if (n.hide_modal) {
$(_this.parents('.modal')[0]).modal('hide');
}
if (n.url && n.replace_img) {
$('img' + n.replace_img).attr('src', n.url);
}
if (n.reload) {
if (n.goto) {
window.location.href = n.goto;
window.location.reload;
} else {
window.location.reload();
}
}
_this.trigger('miniuploaded', n, form);
},
- 函数定义:
success: function (n) {...}
: 这是一个成功回调函数的定义,其中n
是从服务器返回的响应对象。
- 状态判断与通知显示:
var ys = n.ys ? n.ys : n.error ? 'danger' : '';
: 这行代码用于决定通知消息的类型。如果响应对象n
中有ys
属性,则使用该属性的值;如果没有ys
但有error
属性,则将类型设置为'danger'
;否则,类型为空字符串。notyf(n.msg || '操作成功', ys, '', notyf_id);
: 使用notyf
函数显示通知消息。如果响应对象n
中有msg
属性,则显示该消息;否则,默认显示'操作成功'
。ys
表示通知的类型,notyf_id
可能是用于标识特定通知的ID。
- 处理上传后的状态:
miniuploaded(n.no_preview_reset);
: 这可能是一个自定义函数,用于处理上传完成后的一些UI逻辑,例如重置预览区域。具体行为取决于n.no_preview_reset
的值。
- 模态框处理:
if (n.hide_modal) {$(_this.parents('.modal')[0]).modal('hide');}
: 如果响应对象n
中的hide_modal
为真,则隐藏当前触发事件元素所在的最近的模态框。
- 图片替换:
if (n.url && n.replace_img) {$('img' + n.replace_img).attr('src', n.url);}
: 如果响应中包含url
和replace_img
属性,则将选择器匹配到的img
元素的src
属性替换为n.url
的值。
- 页面重载与跳转:
if (n.reload) {...}
: 如果需要重新加载页面(n.reload
为真),则根据是否指定了跳转地址(n.goto
)来决定是直接重新加载当前页面还是跳转到新的URL。window.location.href = n.goto; window.location.reload;
: 首先改变当前页面的URL为n.goto
指定的地址,然后尝试重新加载页面。这里有一个小错误,window.location.reload
应该是一个函数调用(window.location.reload();
),而不是一个属性。
- 自定义事件触发:
_this.trigger('miniuploaded', n, form);
: 在当前触发事件的元素上触发一个名为miniuploaded
的自定义事件,并传递响应对象n
和表单对象form
作为参数。
上面代码中的第四条就包含了,关于模态框的处理方法。
实战应用:
- 下面是我在写子比主题反馈插件的相关代码
- 在代码中我加入了一个判断
zib_send_json_success(array('message' => '反馈成功', 'hide_modal' => true));
,在反馈成功的时候会向服务器返回包含"hide_modal": true
的响应 - 当用户点击提交按钮并且服务器处理成功时,前端JavaScript将接收到一个包含
"hide_modal": true
的响应,然后后端子比主题在处理模态框自动关闭的JS函数中,收到了"hide_modal": true
的响应,就会隐藏模态框。
function add_ajax_feedback() {
$user_id = get_current_user_id();
if (!$user_id) {
zib_send_json_error('登录失效,请刷新页面后重试');
return; // 使用return代替exit,以便于单元测试和代码维护
}
// 从POST请求中获取数据,并进行初步的清洗
$article_url = isset($_POST['article_url']) ? trim($_POST['article_url']) : '';
$pan_title = isset($_POST['pan_title']) ? trim($_POST['pan_title']) : '';
$pan_url = isset($_POST['pan_url']) ? trim($_POST['pan_url']) : '';
if (empty($article_url)) {
zib_send_json_error('请输入文章网址');
return;
}
if (empty($pan_title)) {
zib_send_json_error('请输入失效网盘标题');
return;
}
if (empty($pan_url)) {
zib_send_json_error('请输入失效网盘链接');
return;
}
global $wpdb;
$table_name = $wpdb->prefix . 'feedback_form_data';
// 防止SQL注入,使用$wpdb->prepare方法
// 检查是否已经有相同的反馈
$query = $wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE article_url = %s AND pan_url = %s", $article_url, $pan_url);
$exists = $wpdb->get_var($query);
if ($exists > 0) {
zib_send_json_error('已经有人反馈啦');
return;
}
if (zib_user_is_ban($user_id)) {
zib_send_json_error('封禁用户禁止提交');
return;
}
// 准备插入数据
$data = array(
'user_id' => $user_id,
'article_url' => $article_url,
'pan_title' => $pan_title,
'pan_url' => $pan_url,
'timestamp' => current_time('mysql', 1)
);
$format = array('%d', '%s', '%s', '%s', '%s'); // 根据数据类型定义格式,例如user_id是整数
$result = $wpdb->insert($table_name, $data, $format);
if ($result) {
// 反馈成功,要求前端隐藏模态框
zib_send_json_success(array('message' => '反馈成功', 'hide_modal' => true));
} else {
zib_send_json_error('反馈失败,请稍后重试');
}
}
add_action('wp_ajax_add_feedback', 'add_ajax_feedback');
add_action('wp_ajax_add_wxr_blog_qq', 'add_ajax_feedback');
具体代码:
if ($result) {
// 反馈成功,要求前端隐藏模态框
zib_send_json_success(array('message' => '反馈成功', 'hide_modal' => true));
} else {
zib_send_json_error('反馈失败,请稍后重试');
}
© 版权声明
本站提供的资源转载自国内外各大资源站和网络,仅供学习体验;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该资源内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!请点击《侵权处理》
THE END
暂无评论内容