这里的问题是,Firefox 需要的图像加载通常在继续下一步之前已经具有正确的大小。并且模式需要存在才能将画布附加到该模式。
https://jsfiddle.net/a0e5dt98/
$(document).on("change", "#photograph", function() {
$(this).replaceWith('<input id="photograph" type="file" class="form-control">');
$("#picCrop").modal('show');
loadImage(this);
});
$('#picCrop').on('shown.bs.modal', function(e) {
validateImage();
})
然后它从图像的选择中调用 loadImage。然后在加载模态框时验证该图像,该模态框会将其附加到现在存在的 div 上。这确实假设 imageLoad 比模态加载花费的时间更少。从理论上讲,您可能能够在本地加载足够大的图像,从而无法验证卸载的图像。
然后再把 validate 和 affix 分开,这样 firefox 就可以正确获取大小了。
function validateImage() {
console.log("validateimage.")
if (canvas != null) {
image = new Image();
image.onload = affixJcrop;
image.src = canvas.toDataURL('image/png');
} else affixJcrop();
}
function affixJcrop() {
console.log("affixJcrop")
if (jcrop_api != null) {
jcrop_api.destroy();
}
$("#views").empty();
$("#views").append("<canvas id=\"canvas\">");
canvas = $("#canvas")[0];
context = canvas.getContext("2d");
console.log(image.width);
console.log(image.height);
canvas.width = image.width;
canvas.height = image.height;
context.drawImage(image, 0, 0);
$("#canvas").Jcrop({
onSelect: selectcanvas,
onRelease: clearcanvas,
boxWidth: crop_max_width,
boxHeight: crop_max_height,
minSize: [100, 100],
setSelect: [0, 0, 100, 100]
}, function() {
jcrop_api = this;
});
clearcanvas();
}