Files
wordpress-theme-aksrt/assets/js/runtime/mini-upload.js
T
kate522 9375b1c30c refactor(assets): vendor 资产迁入标准目录并全仓去除 zibll 标识
- assets/vendor 全量迁移: fontawesome5→assets/fontawesome5, css→assets/css,
  js→assets/js/runtime(避开 14 个同名自有文件), img 合并去重→assets/img,
  fonts→assets/fonts; 删除 assets/vendor
- libs 五个与 widgets/third-party 字节相同的库不重复入库, loader paths 改指向
- 运行时切换: _win.uri=assets 根, loader baseUrl=/js/runtime, enlighter 注入
  路径同步; PHP 7 个引用文件切换并改名 $zibll_*→$runtime_*
- 去品牌: Qinver 头注释/品牌 console.log/演示链接清除, 默认文案中性化
- 功能标识符改名: zib__→aksrt__, zib_ajax→aksrt_ajax, window.zib→
  window.aksrtLegacy, zibllblock/*→aksrtblock/*, .zib-widget→.aksrt-panel,
  .zib-slider→.aksrt-slider, zib_menu_options meta 键等
- 自有 CSS 改名: legacy-utilities/compat-vars/footer shell
- admin SPA 重建; 契约测试同步(路径/断言/文件更名)
- 例外保留: tests/visual 对照环境与 fixtures 前缀(外部 Zibll 产品引用)

验证: php -l 133 个改动文件通过; runtime 86 个 JS node --check 通过;
契约测试 68/70(2 个失败经 stash 对照确认为存量问题)
2026-08-22 16:16:30 +08:00

310 lines
11 KiB
JavaScript

'use strict';
function miniupload() {
var _body = $('body');
var input_selector = '[aksrtupload="image_upload"]';
var submit_selector = '[aksrtupload="submit"]';
var form_selector = '.form-upload,.mini-upload,form';
var add_html = '<div class="add"></div>';
var add_selector = '.add';
var mini_file = {};
var pre_html;
_body.on('change', input_selector, function (e) {
var _this = $(this);
var files = this.files || e.dataTransfer.files;
var form = $(_this.parents(form_selector)[0]);
var size_max = _this.attr('size_max') || Number(_win.upload_img_size) || 3;
var pre_selector = _this.attr('data-preview') || '.preview';
var pre = form.find(pre_selector);
pre_html = pre.html();
var accept = _this.attr('accept'); //允许上传的文件类型
var multiple = _this.attr('multiple'); //是否允许多选
var multiple_max = _this.attr('multiple_max'); //多选最多允许几个
var accept_yanz = false;
if (-1 !== accept.indexOf('image')) {
accept_yanz = 'image';
}
if (-1 !== accept.indexOf('vedio')) {
accept_yanz = 'vedio';
}
var upload_id = _this.attr('upload_id');
//设置唯一ID标识
if (!_this.attr('upload_id')) {
upload_id = parseInt((Math.random() + 1) * Math.pow(10, 4));
_this.attr('upload_id', upload_id);
}
if (!mini_file[upload_id]) {
mini_file[upload_id] = [];
}
$.each(files, function (key, val) {
var name = val.name;
if (accept_yanz && -1 == val.type.indexOf(accept_yanz)) {
//如果限制文件格式
notyf(aksrt_sprintf('upload_format_error', name), 'danger'), _this.val('');
} else if (size_max && val.size > size_max * 1048567) {
//限制文件大小
notyf(aksrt_sprintf('upload_size_exceeded', name, size_max), 'danger');
} else if (!pre.find('[preview-name="' + name + '"]').length) {
//不允许重复文件
mini_file[upload_id].push(val);
}
});
var a_file = [];
var ii = 1;
var empty = false;
$.each(mini_file[upload_id], function (key, val) {
if (multiple_max && multiple_max < ii) {
//限制文件数量
notyf(aksrt_sprintf('upload_count_exceeded', multiple_max), 'danger');
return false;
} else {
ii++;
a_file.push(val);
ToB64(val, function (e) {
var img = '<img class="fit-cover" preview-name="' + val.name + '" src="' + e + '">';
if (multiple) {
if (!empty) {
pre.html('');
empty = true;
}
var cloce = '<div class="preview-remove" upload-id="' + upload_id + '" file-key="' + $.inArray(val, a_file) + '"><svg class="ic-close" aria-hidden="true"><use xlink:href="#icon-close"></use></svg></div>';
img = '<div class="preview-item">' + img + cloce + '</div>';
pre.append(img).find(add_selector).remove();
if (multiple_max && multiple_max >= ii) {
pre.append(add_html);
}
} else {
pre.html(img);
}
});
}
});
mini_file[upload_id] = a_file;
form.find('[auto-submit]').click();
});
_body.on('click', '.preview-remove', function () {
var _this = $(this);
var file_key = _this.attr('file-key');
var upload_id = _this.attr('upload-id');
_this.parent().animate(
{
width: 0,
},
200,
'swing',
function () {
var pre = $(this).parent();
$(this).remove();
mini_file[upload_id].splice(file_key, 1);
if (!pre.find(add_selector).length) {
pre.append(add_html);
}
}
);
return false;
});
_body.on('click', '.preview ' + add_selector, function () {
var _this = $(this);
var form = $(_this.parents(form_selector)[0]);
form.find(input_selector).click();
});
//提交表单
_body.on('click', submit_selector, function (e) {
var _this = $(this);
if (_this.attr('disabled')) {
return false;
}
if (e.preventDefault) e.preventDefault();
else e.returnValue = false;
var _text = _this.html();
var form = $(_this.parents(form_selector)[0]);
var _input = form.find(input_selector);
var formData = new FormData();
//循环插入文件
var is_files = _this.attr('aksrtupload-nomust');
_input.each(function () {
var _this = $(this);
var upload_id = _this.attr('upload_id');
if (upload_id && mini_file[upload_id]) {
var ii = 0;
var tag = _this.attr('data-tag') || 'file';
$.each(mini_file[upload_id], function (key, val) {
var append_tag = ii ? tag + '_' + ii : tag;
formData.append(append_tag, val, val.name);
ii++;
});
if (ii > 1) {
formData.append(tag + '_file_count', ii);
}
is_files = ii;
}
});
//必须选择图片判断
if (!is_files) return notyf(aksrt__('upload_select_first'), 'danger');
//添加其它数据
var serializeObject = form.serializeObject();
$.each(serializeObject, function (key, val) {
formData.append(key, val);
});
//循环插入_POST内容
form.find('[data-name]').each(function () {
var _th = $(this);
var n = _th.attr('data-name');
var v = _th.val() || _th.attr('data-value');
if (v === undefined) {
v = '';
}
if (formData.get(n) === null) {
formData.append(n, v);
}
});
//人机验证
if (formData.get('captcha_mode') && is_captcha(formData.get('captcha_mode'))) {
tbquire(['captcha'], function () {
CaptchaOpen(_this, formData.get('captcha_mode'));
});
return !1;
}
if (window.captcha) {
if (window.captcha._this) {
delete window.captcha._this;
}
formData.append('captcha', JSON.stringify(window.captcha));
window.captcha = {}; //只能使用一次
}
/**
for (var [a, b] of formData.entries()) {
console.log(a, b);
} */
var miniuploaded = function (no_preview_reset) {
_this.attr('disabled', false).html(_text);
_input
.attr('disabled', false)
.val('')
.each(function () {
var _this = $(this);
var upload_id = _this.attr('upload_id');
if (upload_id && mini_file[upload_id]) {
mini_file[upload_id] = [];
}
});
if (!no_preview_reset && pre_html) {
form.find('.preview').html(pre_html);
}
};
var notyf_id = 'miniupload_ajax';
notyf(aksrt__('processing_wait'), 'load', '', notyf_id);
_this.attr('disabled', true).html('<span class="miniupload-ing"><i class="loading mr3 c-white"></i><span class="loading-text c-white">' + aksrt__('uploading') + '<count class="px12 ml3"></count></span><div class="progress progress-striped active"><div class="progress-bar progress-bar-success" role="progressbar" style="width:0;"></div></div></span>');
_input.attr('disabled', true);
$.ajax({
url: _win.ajax_url,
type: 'POST',
data: formData,
// 告诉jQuery不要去处理发送的数据
processData: false,
cache: false,
// 告诉jQuery不要去设置Content-Type请求头
contentType: false,
dataType: 'json',
error: function (n) {
var _msg = aksrt_sprintf('ajax_error', n.status, n.statusText);
if (aksrt_is_fatal_error_response(n.responseText)) {
_msg = aksrt__('ajax_fatal_error');
}
notyf(_msg, 'danger', '', notyf_id);
miniuploaded();
},
xhr: jqXhr(function (e) {
var percent = Math.round((e.loaded / e.total) * 100);
_this.find('count').html(percent + '%');
percent >= 100 && _this.find('.loading-text').html(aksrt__('upload_processing') + ' ...');
form.find('.progress .progress-bar').css('width', percent + '%');
}),
success: function (n) {
if (n.error) {
_win.slidercaptcha = false;
}
var ys = n.ys ? n.ys : n.error ? 'danger' : '';
notyf(n.msg || aksrt__('operation_success'), 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);
},
});
});
//图片转Base64
function ToB64(e, n) {
if ('undefined' == typeof FileReader) return notyf(aksrt__('upload_unsupported'), 'danger');
var r = new FileReader();
r.readAsDataURL(e),
(r.onload = function (e) {
n && n(e.target.result);
});
}
//绑定上传进度
function jqXhr(fun) {
jqXhr.onprogress = fun;
//使用闭包实现监听绑
return function () {
//通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
var xhr = $.ajaxSettings.xhr();
//判断监听函数是否为函数
if (typeof jqXhr.onprogress !== 'function') return xhr;
//如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
if (jqXhr.onprogress && xhr.upload) {
xhr.upload.onprogress = jqXhr.onprogress;
}
return xhr;
};
}
}
if (!_win.is_miniupload) {
miniupload();
_win.is_miniupload = true;
}