惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Engineering at Meta
Engineering at Meta
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
博客园_首页
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
博客园 - Franky
Cyberwarzone
Cyberwarzone
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
T
Tailwind CSS Blog
Project Zero
Project Zero
博客园 - 叶小钗
S
SegmentFault 最新的问题
K
Kaspersky official blog
B
Blog
T
The Exploit Database - CXSecurity.com
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
G
Google Developers Blog
Security Latest
Security Latest
T
Tenable Blog
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Help Net Security
T
Threat Research - Cisco Blogs
美团技术团队
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
F
Fortinet All Blogs
NISL@THU
NISL@THU
大猫的无限游戏
大猫的无限游戏
The Last Watchdog
The Last Watchdog
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
D
DataBreaches.Net

博客园 - 兵

C#异常处理的方式 CryptoAPI与.NET数字签名类的交互问题 .NET中几种基本的线程同步方法 为什么说WinForm的控件只能在主线程中创建和调用 C#与Native C++互相访问 PHP5中的引用 Windows版的PDO太衰了 Framework里某些类型成员方法的一点疑惑 发现一个FireFox的问题 C#中COM操作(二)---接口查询 C#中COM操作(一)---实例化 非弹出式的模态对话框的背景遮罩 DOTNET事件拾遗 CSS开发辅助工具:Internet Explorer Developer Toolbar 另外一种高效地判断奇数和偶数的方法 如何利用客户端缓存对网站进行优化? 一个多表查询引出的问题(2) 类的成员初始化顺序 一个多表查询引出的问题(1)
Firefox中Iframe的blur与focus事件问题
· 2009-01-08 · via 博客园 - 兵

  最近在做一个网站的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元素。

事情到这里还算是比较满意了,可是想想就因为一个浏览器不兼容的问题导致我花了老半天时间,真的很窝火。