在popup窗口中俘获事件的缺陷&修复

简介:
  我们在处理HTML元素的事件时,通常可以使用两种方法来添加其处理函数。一是直接向HTML元素的 事件处理回调(如:onclick、onlond等)赋值;一是使用元素的attachEvent()方法来添加处理函数。这两种方法对于普通的页面表现出来的效果是完全相同的,而对于popup它们却有很大的差别。

    先看下面的popup中事件处理示例,再来说是什么问题:
< script  language ="javascript" >
function  NormalEventListener(elmt)
{
    alert(event);
}

function  AttachEventListener(evt)
{
    alert(evt);
}

var  popwin  =  window.createPopup();
var  popdoc  =  popwin.document;
var  div  =  popdoc.createElement('DIV');
div.style.width 
=  ' 100 % ';
div.style.height 
=  ' 100 % ';
div.style.border 
=  'dotted 1px blue';
div.innerText 
=  'click me.';
div.onclick 
=   function  Click()
{
    NormalEventListener(
this );
}
;
div.attachEvent('onclick', AttachEventListener);
popwin.document.body.appendChild(div);
popwin.show(
100 100 200 200 );
</ script >

    这个示例中,分别使用了两种方法来添加事件处理函数。对于attachEvent这种方式,我在' 使用Popup窗口创建无限级Web页菜单(3)'一文中介绍过它的用法,而且说明了怎么在其处理函数中获取全局事件变量 event。就是被attach的处理函数的第一个参数即是默认的 event变量。

    今天我无意中使用了另一种方法,向 事件处理回调赋值的方法附加事件处理函数,div.onclick = function()。却发现了一个popup窗口中响应时间处理函数的缺陷。执行上面的代码,我们会发现NormalEventListener()方法的elmt参数是引发事件的元素本身的引用,而此时调用 event属性,却发现 event这厮居然是:null 。这可咋怎呐?! 

    原来NoramlEventListener()中的 event是window. event,因为这个函数定义在IE的window的作用域内,它的引用也可以写成window.NormalEventListener(),而我们触发的事件是在popup窗口中的window中。就是说IE的window和popwin.document.parentWindow是两个不同的域,当然这个时候window. event就是null了。解决这个问题的办法有两个,一可以去取popwin.document.parentWindow的 event,不过这个方法比较麻烦,需要专门去记录那个popwin变量。另外还有一个最简单的方法可以取到正确的 event属性。因为每个事件触发的源元素(srcElement)和触发它的事件属性总是在同一个域中,所以我们就可以使用如下办法将其取到:
  function NormalEventListener(elmt)
 {
     var evt =  elmt.document.parentWindow.event;
    alert(evt);
 }

    这个elmt参数是从Click函数中传递过来的触发事件的元素本身,即:event.srcElement。


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
Element ui dialog弹窗最大化最小化关闭组件封装
封装一个最大化最小化关闭的dialog弹窗组件
2675 1
|
前端开发
element-ui图标偶现乱码问题的原因和修复方法
之前很老的一个 webpack3 前端项目,用 vue-cli5 重构了一下,根据 vue-cli 文档安装的 sass 版本 ^1.32.7,sass-loader 版本 ^12.0.0,各种自测感觉没问题了就部署到线上了
279 0
如果没有选中任何线型, CAcUiLineTypeComboBox 崩溃的原因
如果没有选中任何线型, CAcUiLineTypeComboBox 崩溃的原因
日常开发遇到的坑click && focus事件 运行2次函数的解决方法
click && focus事件 运行2次函数的解决方法
1241 0
|
C# Windows
C#代码像QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法
你QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法:   要么重写需要弹出的窗体的事件: protected override CreateParams CreateParams     {     get     {         const ...
1209 0
|
Java Shell Android开发
监听自身卸载,弹出用户反馈调查
1,情景分析         在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底。这篇博客,我将讲述一下一个各大应用中很常见的一个功能,同样也是基于JNI开发的Android应用小Demo,看完这个之后,不仅可以加深对NDK开发的理解,而且该Demo也可以使用在实际的开发中。不知
1174 0
easyui 1.4.3 窗口创建或拖动超过父元素 边界 BUG 解决方法
使用EASYUI 窗口时,创建或者移动 会超过父元素边界,不能关闭,非常别扭。 风来了.fox 标记:主要这边 就是要注意的地方 /** * * @param title * @param href * @param width * @param height * @param modal * @param minimizable * @param maximiz
1141 0
|
容器
duilib 修复 容器控件 rightbordersize和bottombordersize属性显示错误的bug
转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/45560943         DuiLib的容器控件可以用bordersize统一指定边框宽度,也可以用rightbordersize、bottombordersize等属性单独指定某一个边框的宽度。
1233 0