这段时间写了很多基于js和jquery的前端控件,每一个的功能都很复杂,事件也很多。

因为都是单独封装的,单独使用没有问题,但把他们放到一个页面使用,就经常发生事件冲突的问题。

这几天一直在考虑用一个什么比较好的方法解决,今天把其中一个解决方案实验了一下,感觉很不错,现在发出来,大家一起探讨下。

    window.UE_EVENT = window.UE_EVENT || {
Key: 1,
ClipBoard: null,
CurrElement: null,
CurrKey: 0,
Events: { 'mousemove': [], 'mousedown': [], 'keypress': [], 'dblclick': [], 'mouseup': [], 'keydown': [], 'keyup': [], 'click': [], 'resize': [], 'copy': [], 'paste': [] },
Delete: function (event, key) {
if (!event || !key) return false;
var e = event.toLowerCase(),l = this.Events[e];
for (var i in l) {
if (l[i].KEY == key) {
l.splice(i, 1);
break;
}
}
},
Add: function (dom, event, callback) {
if (!dom || !event || !callback) return false;
UE_EVENT.IsRun || UE_EVENT.Run();
var key = UE_EVENT.SetEventKey(dom), isExists = false, e = event.toLowerCase(), l = this.Events[e];
for (var i in l) {
if (l[i].KEY == key) {
l[i].FUN = callback;
isExists = true;
}
}
if (!isExists) {
l.push({ 'KEY': key, 'EVENT': e, 'DOM': dom[0] || dom, 'FUN': callback });
}
},
Excute: function (event, e) {
var l = this.Events[event];
if (event == 'resize') {
for (var i in l) {
var t = l[i], d = t.DOM;
if (t.width != $(d).width() || t.height != $(d).height()) {
t.width = $(d).width();
t.height = $(d).height();
l[i].FUN(t.width, t.height, null, d);
}
}
} else {
e = e || window.event;
var t = e.srcElement || e.target,
k = parseInt($(t).attr('eventkey'), 10);
for (var i in l) {
if (l[i].KEY == k || l[i].KEY == this.CurrKey) {
l[i].FUN(e, t, l[i].KEY, l[i].DOM);
}
}
}
},
Download: function (url, json) {
var form = $('<form style="display:none" target="ue_download_iframe" method="post" action="' + url + '"><iframe id="ue_download_iframe" name="ue_download_iframe" onload=""></iframe><input name="JsonData" value="' + JSON.stringify(json).replace(/"/g, "'") + '" /></form>').appendTo('body');
var iframe = document.getElementById('ue_download_iframe');
if (document.readyState) {
iframe.onreadystatechange = function () {
if (this.readyState && this.readyState == 'complete') {
form.remove();
}
}
} else {
iframe.onload = function () {
form.remove();
}
}
form.submit();
},
SetEventKey: function (obj) {
if (!obj) return;
var dom = obj[0] || obj,
isDOM = (typeof HTMLElement === 'object') ? (dom instanceof HTMLElement) : dom && typeof dom === 'object' && dom.nodeType === 1,
key = isDOM ? parseInt($(dom).attr('eventkey'), 10) : dom.eventKey;
key = key || UE_EVENT.Key++;
if (isDOM) {
$(dom).attr('eventkey', key)
} else {
dom.eventKey = key;
}
return key;
},
Run: function (obj) {
if (!this.IsRun) {
$(document).on('mousemove', function (e) {
UE_EVENT.Excute('mousemove', e);
}).on('mousedown', function (e) {
UE_EVENT.Excute('mousedown', e);
}).on('keypress', function (e) {
UE_EVENT.Excute('keypress', e);
}).on('dblclick', function (e) {
UE_EVENT.Excute('dblclick', e);
}).on('mouseup', function (e) {
UE_EVENT.Excute('mouseup', e);
}).on('keydown', function (e) {
UE_EVENT.Excute('keydown', e);
}).on('keyup', function (e) {
UE_EVENT.Excute('keyup', e);
}).on('click', function (e) {
UE_EVENT.CurrKey = 0;
UE_EVENT.Excute('click', e);
});
setInterval(function () { UE_EVENT.Excute('resize', null); }, 200);
//$(window).on('resize', function (e) {
// UE_EVENT.Excute('resize', e);
//});
$('body').on({
copy: function (e) {
var d = window.clipboardData || e.originalEvent.clipboardData;
var txt = "";
UE_EVENT.Excute('copy', txt);
d.setData('Text', txt);
return false;
},
paste: function (e) {
var d = window.clipboardData || e.originalEvent.clipboardData;
UE_EVENT.Excute('paste', d.getData('Text'));
}
});
}
UE_EVENT.IsRun = true;
return true;
}
};
$.fn.SetEvent = function (event, callback) {
return UE_EVENT.Add(this, event, callback);
};
$.fn.ActiveEvent = function () {
UE_EVENT.CurrKey = UE_EVENT.SetEventKey(this);
};

这个方案的思路就是用单例模式,建立一个事件方法列表,就像系统的注册表一样(事实上灵感也是来自注册表),

然后所有的插件控件的文档事件,都向这个列表集合里注册,这样需要用的时候,就能统一调度,互不冲突。

今天做了一点调整,就是添加了dom对象的保存,同时注册的事件改为保存事件名称,这样可能比较灵活

一改:添加了resize事件

二改:这次改为每添加一个事件,都指定一个key值

三改:修改resize事件为实时监控标签size变化,取消绑定body的resize事件

添加copy和poaste事件

Web页面多对象多文档事件冲突的解决方案的更多相关文章

  1. 前端(十五)—— JavaScript事件:绑定事件方式、事件的冒泡和默认事件、鼠标事件、键盘事件、表单 事件、文档事件、图片事件、页面事件

    JS事件:绑定事件方式.事件的冒泡和默认事件.鼠标事件.键盘事件.表单 事件.文档事件.图片事件.页面事件 一.事件的两种绑定方式 1.on事件绑定方式 document.onclick = func ...

  2. WEB前端开发规范文档(转)

    http://codeguide.bootcss.com/  编写灵活.稳定.高质量的 HTML 和 CSS 代码的规范上面的文档 再结合下面的规范: 无论是从技术角度还是开发视角,对于web前端开发 ...

  3. 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  4. Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  5. WEB前端开发规范文档[转]

    为新项目写的一份规范文档, 分享给大家. 我想前端开发过程中, 无论是团队开发, 还是单兵做站, 有一份开发文档做规范, 对开发工作都是很有益的. 本文档由本人编写, 部分意见来源于网络, 以此感谢, ...

  6. ASP.NET Core 中文文档 第二章 指南 (09) 使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档

    原文:ASP.NET Web API Help Pages using Swagger 作者:Shayne Boyer 翻译:谢炀(kiler) 翻译:许登洋(Seay) 对于开发人员来说,构建一个消 ...

  7. WEB文档在线预览解决方案

    web页面无法支持预览office文档,但是却可以预览PDF.flash文档,所以大多数解决方案都是在服务端将office文档转换为pdf,然后再通过js的pdf预览插件(谷歌浏览器等已经原生支持嵌入 ...

  8. 关于ASP.NET Web Api的HelpPage文档注释问题

    关于ASP.NET Web Api的HelpPage文档注释问题 以前我用微软的HelpPage来自动生成的webAPI帮助文档.在使用了一段时间后发现只能显示Controller上面写的注释文档内容 ...

  9. web通信之跨文档通信 postMessage

    index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...

随机推荐

  1. webStorm破解说明

    在idea里转一个 -> 注册时选择License server,填http://idea.lanyus.com

  2. IAR for msp430 MDK中 warning: #223-D: function "xxx" declared implicitly 解决方法

    今天在EINT的范例里添加了一个函数,即eint.c中添加了一个datawrite()的函数,并在主函数main.c中调用,编译便警告 warning: #223-D: function " ...

  3. C/C++的四大内存分区 分类: C/C++ 2015-05-09 01:36 163人阅读 评论(0) 收藏

    导读 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内存分区,分别为: 1. 五大内存分区:堆.栈.全局/静态存储区.自由存储区和常量存储区. 2. 五大内存分区:堆 ...

  4. UIButton的使用

    使用UIButton时需要注意的是: 1.UIButton的创建有专门的类方法(buttonWithType:,UILabel没有): 2.UIButton常用的属性包括:frame.titile.t ...

  5. SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法

    SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...

  6. 【AT91SAM3S】串口UART初始化及收发数据

    SAM3S中的UART串口是一个两线异步收发器.这个串口能用来通信或者跟踪.有两个DMA通道与UART串口关联,可通过使用DMA处理串口传输以节省CPU时间. SAM3S4C中有两个UART.与外设引 ...

  7. c#数据类型之值类型和引用类型

    C#数据类型分隔为值类型和引用类型.而所用数据类型都继承自Object. 1. 值类型继承自System.ValueType,引用类型继承自System.Object.ValueType也直接继承自O ...

  8. XE6移动开发环境搭建之IOS篇(3):配置虚拟机,设置Mac安装环境(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.创建新的虚拟机 ...

  9. JS-改变页面的颜色(二)

    需求:点击页面的按钮,改变页面的颜色 思路:一先画出最简单的页面,二想办法获取页面的body节点,三想办法修改body节点的背景颜色属性,四通过一个方法获取随机的颜色值           和第一个例 ...

  10. VS2013使用winsock.h和winsock2.h发生冲突后的终极解决方法

    问题:彻底无语了,不小心某个文件包含了windows.h头文件,而windows.h文件里面包含着winsock.h文件, 如果你下次使用winsock2.h文件时,位置不对,然后编译器会给你一大堆重 ...