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

本来是一个简单的img οnlοad=javascript:this.src='' οnerrοr= 的过程,

 

但是遇到几个问题:

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

 

 

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

 

3、onerror后再onerror怎么办:

     再次οnerrοr=function{XXXXXX}。

 

4、最初想法是[οnerrοr="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
export default async function drawBoundingBox(   imageUrl,   originX,   originY,   width,   height,   name,   successRate ) {   // 1. 创建并加载图片   const loadImage = (url) =>     new Promise((resolve, reject) => {       const img = new Image()       img.crossOrigin = 'anonymous' // 处理跨域       img.onload = () => resolve(img)       img.onerror = reject       img.src = url     })   // 2. 创建画布   const img = await loadImage(imageUrl)   const canvas = document.createElement('canvas')   const ctx = canvas.getContext('2d')   // 3. 设置画布尺寸与原始图片一致   canvas.width = img.width   canvas.height = img.height   // 4. 绘制原始图片   ctx.drawImage(img, 0, 0)   // 5. 绘制红色边框   ctx.strokeStyle = '#FF0000'   ctx.lineWidth = 2   ctx.strokeRect(originX, originY, width, height)   // 6. 设置文字样式   const fontSize = 28   ctx.font = `${fontSize}px Arial`   ctx.fillStyle = '#FF0000'   ctx.textBaseline = 'top'   // 7. 组合显示文本   const text = `${name} ${(successRate * 100).toFixed(1)}%`   const textWidth = ctx.measureText(text).width   // 8. 绘制文字背景   ctx.fillStyle = 'rgba(255, 255, 255, 0.8)'   ctx.fillRect(originX - 2, originY - fontSize - 4, textWidth + 4, fontSize + 4)   // 9. 绘制文字   ctx.fillStyle = '#FF0000'   ctx.fillText(text, originX, originY - fontSize - 2)   // 10. 转换canvas为图片   return new Promise((resolve) => {     const resultImg = new Image()     resultImg.onload = () => resolve(resultImg)     resultImg.src = canvas.toDataURL('image/png')   }) } // 在组件setup中使用示例 // export default { //   setup() { //     const processedImage = ref(null) //     onMounted(async () => { //       try { //         const result = await drawBoundingBox( //           '/sample.jpg', // 图片地址 //           100, // 原点X //           50, // 原点Y //           200, // 宽度 //           150, // 高度 //           '物体名称', // name //           0.857 // 成功率(0-1小数) //         ) //         processedImage.value = result.src //       } catch (error) { //         console.error('图片处理失败:', error) //       } //     }) //     return { processedImage } //   } // } 要求,文字大小要根据画布改变,文字框和画框的位置不能超过画布之外,文字框可以在画框的上下左右,但是必须显示在画布内。要求美观清晰,给出代码
最新发布
03-21
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值