被 FF and IE 的 image onload onerror 折腾的一天

本文探讨了在不同浏览器中处理IMG标签加载失败的问题,包括Firefox和IE的onerror事件触发机制,并提供了一段JavaScript代码来确保跨浏览器的一致性行为。此外,还介绍了如何实现innerHTML和outerHTML等属性的兼容性。

本来是一个简单的img onload=javascript:this.src='' onerror= 的过程,

但是遇到几个问题:

1、FF的onerror怎么也触发不了,后来查看源码发现,src=""为空时,FF不认为image载入失败,郁闷。

2、onload死活就是调用不到,既然onload 不是标准,那我就用onerror好了,但是问题又出来了

3、onerror后再onerror怎么办:

再次onerror=function{XXXXXX}。

4、最初想法是[onerror="this.src='../../common/skins/default/images/mid_pic_01.jpg'" ],但是其中指定的路径是不存在的,于是一旦img标签的src属性指定的路径不存在时,onerror会被不停调用,形成了无限递归。IE就会报Stack overflow at line: 0:堆溢出的异常。

另附FF IE innerHTML outerHTML 兼容代码

///////////////////////////////////////////////////////////////////////////////////////////

// 主要实现ff和ie的一些属性、方法的兼容

///////////////////////////////////////////////////////////////////////////////////////////

if(window.HTMLElement) {

//兼容 ff ie 的outerHTML 代码 开始

HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){

var r=this.ownerDocument.createRange();

r.setStartBefore(this);

var df=r.createContextualFragment(sHTML);

this.parentNode.replaceChild(df,this);

return sHTML;

});

HTMLElement.prototype.__defineGetter__("outerHTML",function(){

var attr;

var attrs=this.attributes;

var str="<"+this.tagName.toLowerCase();

for(var i=0;i<attrs.length;i++){

attr=attrs[i];

if(attr.specified)

str+=" "+attr.name+'="'+attr.value+'"';

}

if(!this.canHaveChildren)

return str+">";

return str+">"+this.innerHTML+"</"+this.tagName.toLowerCase()+">";

});

HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){

switch(this.tagName.toLowerCase()){

case "area":

case "base":

case "basefont":

case "col":

case "frame":

case "hr":

case "img":

case "br":

case "input":

case "isindex":

case "link":

case "meta":

case "param":

return false;

}

return true;

});

//兼容 ff ie 的outerHTML 代码 结束

//兼容 ff ie 的click 代码 开始

HTMLElement.prototype.click = function()

{

var evt = this.ownerDocument.createEvent('MouseEvents');

evt.initMouseEvent('click', true, true, this.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);

this.dispatchEvent(evt);

}

//兼容 ff ie 的click 代码 结束

/**兼容ie的innerText start added by huwei*/

HTMLElement.prototype.__defineGetter__("innerText",

function(){

return this.textContent.replace(/(^\s*)|(\s*$)/g, "");

}

);

HTMLElement.prototype.__defineSetter__("innerText",

function(sText){

this.textContent=sText;

}

);

/**兼容ie的innerText end*/

/**兼容ie的event等

调用方式:var event = getEvent();

Start added by huwei*/

function getEvent(){

if(document.all) return window.event;

func = getEvent.caller;

while(func!=null){

var arg0=func.arguments[0];

if(arg0 instanceof Event) {

return arg0;

}

func=func.caller;

}

return null;

}

/**兼容ie的event等 end*/

}

``` $('#WSSliderModal').on('shown.bs.modal', function () { let currentFileItem; let cropper; const pond = FilePond.create(document.querySelector('#filepond'), { allowFileTypeValidation:true, allowImageTransform: true, acceptedFileTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/heic'], fileValidateTypeDetectType: (source, type) => new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (e) => { const buffer = new Uint8Array(e.target.result); // JPEG检测:FF D8 FF if (buffer[0] === 0xFF && buffer[1] === 0xD8 && buffer[2] === 0xFF) { resolve('image/jpeg'); } // PNG检测:‰PNG else if (buffer[0] === 0x89 && buffer[1] === 0x50 && buffer[2] === 0x4E && buffer[3] === 0x47) { resolve('image/png'); } // GIF检测:GIF8 else if (buffer[0] === 0x47 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x38) { resolve('image/gif'); } // WEBP检测:RIFF....WEBP else if (buffer[8] === 0x57 && buffer[9] === 0x45 && buffer[10] === 0x42 && buffer[11] === 0x50) { resolve('image/webp'); } else if ( buffer[4] === 0x66 && // f buffer[5] === 0x74 && // t buffer[6] === 0x79 && // y buffer[7] === 0x70 && // p ( (buffer[8] === 0x68 && buffer[9] === 0x65 && buffer[10] === 0x69 && buffer[11] === 0x63) || // heic (buffer[8] === 0x6D && buffer[9] === 0x69 && buffer[10] === 0x66 && buffer[11] === 0x31) // mif1 ) ) { resolve('image/heic'); } else { resolve(type); } }; reader.onerror = reject; reader.readAsArrayBuffer(source.slice(0, 12)); }), allowFileSizeValidation: true, maxFileSize: '5MB', imageCropAspectRatio: 770/1920, // 设置裁剪比例 imageResizeTargetWidth: 1920, // 目标宽度 imageResizeTargetHeight: 770, // 目标高度 imageResizeMode: 'cover', // 覆盖模式 stylePanelLayout: 'integrated', imagePreviewUpscale: true,// 允许放大预览 stylePanelAspectRatio: 770/1920, // 预览面板比例 allowMultiple: false, // 单文件上传 instantUpload: false, // 禁用自动上传 styleLoadIndicatorPosition: 'center bottom', styleProgressIndicatorPosition: 'right bottom', styleButtonRemoveItemPosition: 'left top', server: { url: '/json/wsslider_action.php', process: { url: '/wsslider_action.php?action=uploadWSSlider', onload: (response) => { const data = JSON.parse(response); return data.fileName; } } },```新增preview heic
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值