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

来源:互联网 发布:人体透视相机软件 编辑:程序博客网 时间:2024/06/15 08:04

本来是一个简单的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*/

 

 

}