cropper.js上传图片时初始化无报错却未生效,应如何解决?
问题根因
Cropper初始化时机错误。当前代码在设置图片src后立刻执行初始化,但FileReader读取文件、浏览器加载base64格式图片均为异步操作,初始化Cropper时previewHolder元素还未完成图片资源加载,无法识别到有效图片内容,所以初始化失效。按钮点击触发时图片已提前加载完成,因此可以正常运行。
修复方案
将Cropper初始化逻辑放到图片加载完成的回调中,修改后的代码如下:
HTML代码(无需修改)
<input type="file" name="cropableImage" id="cropableImageId" onchange="temp(this)" />
JavaScript代码
function temp(input) { // 先销毁旧实例,避免重复初始化异常 if (window.cropper) { window.cropper.destroy(); window.cropper = null; } if(input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function(e) { const image = document.getElementById('previewHolder'); // 绑定图片加载完成事件,加载完成后再初始化Cropper image.onload = function() { window.cropper = new Cropper(image, { zoomable: true, scalable:true, rotatable:true, autoCropArea:0.5, background:false, modal:true, autoCrop: true, viewMode: 0, cropBoxResizable:true, setDragMode:true, }); // DOM显隐逻辑移到此处,保证Cropper初始化时容器可见 $("#main_image_section").show(); $("#choose_file").hide(); $("#tools_section").show(); } image.src = e.target.result; } reader.readAsDataURL(input.files[0]); } else { alert('select a file to see preview'); $('#previewHolder').attr('src', ''); } }
注意事项
- 每次上传新图片前必须销毁旧的Cropper实例,避免内存泄漏和重复初始化报错
- 不要在图片加载完成前隐藏Cropper的父容器,否则Cropper初始化时无法正常计算宽高导致功能失效
内容的提问来源于stack exchange,提问作者Adnan Nawaz
相关产品推荐
相关产品推荐

