Firefox中Iframe的blur与focus事件问题

本文探讨了HTML编辑器中使用iframe时,在Firefox浏览器下无法触发onblur和onfocus事件的问题。通过对比IE与Firefox的不同处理方式,提出了一种兼容两者的解决方案。

  最近在做一个网站的HTML文章发布功能,用到了HTML编辑器,这个是以Iframe为基础的编辑器(貌似网上大多的都是用iframe 的)。却发现一个问题,IE下运行得好好的,在Firefox里却始终不能提交更新后的数据到服务器上,找了半天原因才发现原来是在iframe的 onblur事件里面调了更新数据内容的方法,但firefox下却没有执行。

  于是立马开始google了一把,发现遇到问题的不是我一个人,大量的人都是在问怎么解决firefox中触发blur和focus事件的问题。答案到是给了一大堆,却没一个靠谱的。有一种答案说是放到setInterval里去执行。
  1. <iframe src="about:blank" onfocus="alert('onfocus');" onblur="alert('onblur');" id="AA"> 
  2.             </iframe>
  3.  
  4.             <script>
  5.             window.setTimeout( function(){alert(1); document.getElementById("AA").focus(); }, 0);
  6.             </script>

看了半天也没明白这到底是怎么回事,调试了一把发现在是在第一次运行的时候在setTimeout触发了后,确实触发了blur事件和focus事 件,可是之后再通过鼠标点击想触发这两个事件也不行,看样子这两个事件是有机会触发的,也许是采用一般的方式不能吧。不过用setTimeout这种方式 太鸡肋了,总不至于每次去调用setTimeout去触发吧,我要是知道什么时候去调setTimeout了还不如直接去调用事件处理函数更好点。这种方 法也是被毙了。

  再次深度GOOGLE,发现了一个老外写的如下代码:

  1.  <script>
  2.   function setit(){
  3.   if(document.all){
  4.   document.getElementById("myframe").attachEvent("onblur",dothis);
  5.   }else{
  6.   document.getElementById("myframe").contentWindow.addEventListener("blur",dothis,false);
  7.   }
  8.   }
  9.   
  10.  function dothis(){
  11.  alert("blurred");
  12.  }
  13.  </script>
  14.  
  15.  <body onload="setit()">
  16.  <iframe  width="155" height="144" id="myframe"></iframe>
  17.  <input />
  18.  </body>
试了一下果真可以直接触发,效果跟在IE下的一样。回过头去分析了一下代码,发现firefox中原来iframe上的事件挂到了iframe中的 contentWindow中去了,与真接在html元素里面写事件属性相比,IE可能把iframe上的事件关联到了contentWindow上了, 可firefox却不是这样的,还是各是各的。这样带来的问题是firefox想要给iframe加事件只能够用脚本去加了。
  本来以为IE和firefox中对iframe的事件这部分定义不一样,回头去再去看看了HTML4.0中关于iframe的定义,果真是 iframe上面就没有任何事件的定义,看来是IE顺手给加上的。firefox号称最符合html标准,那么写在iframe上的“事件”没有任何响 应,自然也是合情合理的。DHTML手册上有一句话,由于没有“window”元素,body 元素将作为下列 window 对象事件的宿主:onblur, onbeforeunload, onfocus, onload 和 onunload。可HTML4.0里面body是有这两个事件的,所以也就不难解释为什么用脚本给iframe的contentWindow挂上事件就 可以触发了,实际上这个事件是来自于contentWindow里面的body元素。

事情到这里还算是比较满意了,可是想想就因为一个浏览器不兼容的问题导致我花了老半天时间,真的很窝火。
/* user-login/0.0.21 login.username.js Date:2025-11-13 11:01:01 */ define("//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.username.js",["//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.reg.js","//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.status.js","//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.iframe.js","//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.pubSub.js"],function(require,a,b){var c=require("//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.reg.js");var d=require("//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.status.js");var e=require("//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.iframe.js");var f=require("//storage.jd.com/retail-mall/jdc_user_login/pc/user/login/0.0.21/js/login.pubSub.js");var g=function(a){var b=["qq.com","163.com","126.com","sina.com","hotmail.com","gmail.com","sohu.com","139.com","189.cn"];var c=["<ul>"];var d=$("input[name=loginname]").parent();if(!/^.+@/.test(a))return j.modal.remove(),d.find(".sugcontent").remove();if(a.length<1)return j.modal.remove(),d.find(".sugcontent").remove();var e=a.match(/.+@([^@]+$)/)||[];if(e.length>1){/@+([^@]+$)/.test(a)&&(e=a.match(/@+([^@]+$)/));var f=new RegExp("^"+e[1].replace(/\\/g,"\\\\"));b=$.grep(b,function(a){return f.test(a)})}for(var g=0,h=b.length;h>g;g++){var i="<li "+(0==g?'class="hover"':"")+">"+a.match(/^.+@/)+b[g]+"</li>";c.push(i)}c.push("</ul>"),d.find(".sugcontent").remove(),h>0?(d.append('<div class="sugcontent">'+c.join("")+"</div>"),j.modal.create()):j.modal.remove()};var h={"username.focus":function(){f.subscribe("username.focus",function(){d.onEvent({ele:j.ele.parent(),addClass:"item-focus",callback:function(){var a=j.ele.val();c.isEmpty(a)||j.ele.siblings(".clear-btn").show(),$("#entry").removeClass("item-focus")}})})},"username.blur":function(){f.subscribe("username.blur",function(){d.onEvent({ele:j.ele.parent(),removeClass:"item-focus",callback:function(){var a=j.ele.val();$("#o-authcode").is(":visible");c.isEmpty(a)||f.publish("login.autologin"),$(".sugcontent li.hover").click()}})})},"username.keyup":function(){f.subscribe("username.keyup",function(a){38==a.keyCode||40==a.keyCode?$(".sugcontent li").size()&&f.publish("suggest.selectByKey",a):d.onEvent({callback:function(){var a=j.ele.val();c.isEmpty(a)?j.ele.siblings(".clear-btn").hide():j.ele.siblings(".clear-btn").show(),g(a)}})})},"login.autologin":function(){f.subscribe("login.autologin",function(){})},"suggest.selectByKey":function(){f.subscribe("suggest.selectByKey",function(a){var b=$(".sugcontent ul");var c=b.find("li.hover").index();var d=b.find("li").size()-1;var e;38==a.keyCode&&-1==--c&&(c=d),40==a.keyCode&&++c>d&&(c=0),e=b.find("li:eq("+c+")").addClass("hover"),e.siblings().removeClass("hover"),j.ele.val(e.text())})},"form.init":function(){f.subscribe("form.init",function(){f.publish("username.autologinInfo");var a=j.ele.val();c.isEmpty(a)||j.ele.siblings(".clear-btn").show()})},"username.autologinInfo":function(){f.subscribe("username.autologinInfo",function(){var a=$("#autoLogin").prop("checked");var b='<div class="msg-warn"><b></b>\u516c\u5171\u573a\u6240\u4e0d\u5efa\u8bae\u81ea\u52a8\u767b\u5f55\uff0c\u4ee5\u9632\u8d26\u53f7\u4e22\u5931</div>';a&&($(".msg-wrap .msg-error").hide(),$(".msg-wrap .msg-warn").replaceWith(b))})},"username.clear":function(){f.subscribe("username.clear",function(a){d.onClear(function(){g(""),f.publish("iframe.remove")})})},"suggest.click":function(){f.subscribe("suggest.click",function(a){$(".form").delegate(".sugcontent li","click",function(){var a=$(this).text();var b=document.getElementById("_ocx_password");var c=document.getElementById("loginname");j.ele.val(a),f.publish("iframe.remove"),f.publish("passwordField.focus"),c&&c.blur(),setTimeout(function(){b&&b.focus()},300),g("")})})},"suggest.hover":function(){f.subscribe("suggest.click",function(a){$(".form").delegate(".sugcontent li","mouseover",function(){var a=$(this).addClass("hover");a.siblings().removeClass("hover")})})},"iframe.create":function(){f.subscribe("iframe.create",function(a){j.modal=new e({coverEle:".sugcontent",callback:function(a){$(".sugcontent").after(a)}})})},"iframe.remove":function(){f.subscribe("iframe.remove",function(a){j.modal&&j.modal.remove()})},"suggest.enterClick":function(){f.subscribe("suggest.enterClick",function(){$(".sugcontent li.hover").click()})}};for(var i in h)h.hasOwnProperty(i)&&h[i]();var j={ele:$("#loginname"),checkBoxEle:$("#autoLogin, #chkOpenCtrl"),init:function(){this.ele.bind("focus",function(a){f.publish("username.focus")}),this.ele.bind("blur",function(a){clearTimeout(j.timerBlurid),j.timerBlurid=setTimeout(function(){f.publish("username.blur")},1)}),this.ele.bind("keyup",function(a){return 13==a.keyCode?f.publish("suggest.enterClick"):void f.publish("username.keyup",a)}),this.checkBoxEle.bind("keyup",function(a){13==a.keyCode&&($("#loginsubmit").click(),$(this).blur())}),f.publish("login.autologin"),f.publish("form.init"),f.publish("suggest.click"),f.publish("suggest.hover"),f.publish("username.clear"),f.publish("iframe.create")}};return j}); 什么意思
最新发布
11-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值