- 浏览: 399685 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (309)
- xaml C# wpf (0)
- scala java inner clas (1)
- Tools UML Eclipse UML2 (1)
- Timer .NET Framework (1)
- perl (6)
- python function paramter (1)
- Python Docstring (1)
- Python how to compare types (1)
- Python (8)
- java (5)
- C# (76)
- C# WPF (0)
- p4 (0)
- WPF (46)
- .net (6)
- xaml (1)
- javascript (40)
- windows (10)
- scala (4)
- winform (1)
- c++ (48)
- tools (12)
- cmd (1)
- os (0)
- CI (0)
- shell (0)
- C (2)
- haskell (49)
- functional (1)
- tool (1)
- gnu (1)
- linux (1)
- kaskell (0)
- svn (0)
- wcf (3)
- android (1)
最新评论
We have discussed "javascript - trick to fix event object" and "javascript - trick to centralized store". with this two, we can build from and create a new set of addEvent and removeEvent methods (also some other methods inlcude triggerEvent and etc..) which are essential set of methods that we can have for handlers management.
Since we cannot include one js file from another js file, (there are methods, however, it does not worth that complication in order to achieve that ).
first, let see the code that levergage event fixing and centralized store and then provided the method of addEvent and removeEvent .
/************************************** *@Name: addremoveevents.js * the code of the centralobjectsstore.js, which has the central data store, together with the fixevents.js ,which contains the method that simulat the DOM events. * with the data store we can create new set of addEvent and removeEvent methods that work closer to our desired outcome in all browsers, as seen in List 13 - 4 *@Summary * * @todo: * Test ***************************************/ /** * below is the code of centralizedatastore.js */ (function () { var cache = {}, guid = 1, expando = "data" + (new Date).getTime(); this.getData = function (elem) { var id = elem[expando]; if (!id) { id = elem[expando] = guid++; cache[id] = {}; } return cache[id]; }; this.removeData = function (elem) { var id = elem[expando]; if (!id) { return; } // Remove all stored data delete cache[id]; // Remove the expando property from the DOM node try { delete elem[expando]; } catch (e) { if (elem.removeAttribute) { elem.removeAttribute(expando); } } }; })(); /** * below is the code of fixEvent.js */ function fixEvent(event) { if (!event || !event.stopPropagation) { alert("inside fixing event"); var old = event || window.event; // Clone the old object so that we can modify the values event = {}; for (var prop in old) { event[prop] = old[prop]; } // The event occurred on this element if (!event.target) { event.target = event.srcElement || document; } // Handle which other element the event is related to event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; // Stop the default browser action event.preventDefault = function () { event.returnValue = false; event.isDefaultPrevented = returnTrue; }; event.isDefaultPrevented = returnFalse; // Stop the event from bubbling event.stopPropagation = function () { event.cancelBubble = true; event.isPropagationStopped = returnTrue; }; event.isPropagationStopped = returnFalse; // Stop the event from bubbling and executing other handlers event.stopImmediatePropagation = function () { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }; event.isImmediatePropagationStopped = returnFalse; // Handle mouse position if (event.clientX != null) { var doc = document.documentElement, body = document.body; event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); } // Handle key presses event.which = event.charCode || event.keyCode; // Fix button for mouse clicks: // 0 == left; 1 == middle; 2 == right if (event.button != null) { event.button = (event.button & 1 ? 0 : (event.button & 4 ? 1 : (event.button & 2 ? 2 : 0))); } } return event; // move the following code from the end of function // fixEvent(event) function returnTrue() { return true; } function returnFalse() { return false; } } (function () { var guid = 1; this.addEvent = function (elem, type, fn) { var data = getData(elem), handlers; // We only need to generate one handler per element if (!data.handler) { // Our new meta-handler that fixes // the event object and the context data.handler = function (event) { // - the event is given the value when the actual event is fired. event = fixEvent(event); var handlers = getData(elem).events[event.type]; // Go through and call all the real bound handlers for (var i = 0, l = handlers.length; i < l; i++) { handlers[i].call(elem, event); // Stop executing handlers since the user requested it if (event.isImmediatePropagationStopped()) { break; } } }; } // We need a place to store all our event data if (!data.events) { data.events = {}; } // And a place to store the handlers for this event type handlers = data.events[type]; if (!handlers) { handlers = data.events[type] = []; // Attach our meta-handler to the element, // since one doesn't exist if (document.addEventListener) { elem.addEventListener(type, data.handler, false); } else if (document.attachEvent) { elem.attachEvent("on" + type, data.handler); } } if (!fn.guid) { fn.guid = guid++; } handlers.push(fn); }; this.removeEvent = function (elem, type, fn) { var data = getData(elem), handlers; // If no events exist, nothing to unbind if (!data.events) { return } // Are we removing all bound events? if (!type) { for (type in data.events) { cleanUpEvents(elem, type); } return; } // And a place to store the handlers for this event type handlers = data.events[type]; // If nohandlers exist, nothing to unbind if (!handlers) { return; } // See if we're only removing a single handler if (fn && fn.guid) { for (var i = 0; i < handlers.length; i++) { // We found a match // (don't stop here, there could be a couple bound) if (handlers[i].guid === fn.guid) { // Remove the handler from the array of handlers handlers.splice(i--, 1); } } } cleanUpEvents(elem, type); }; // A simple method for changing the context of a function this.proxy = function (context, fn) { // Make sure the function has a unique ID if (!fn.guid) { fn.guid = guid++; } // Create the new function that changes the context var ret = function () { return fn.apply(context, arguments); }; // Give the new function the same ID // (so that they are equivalent and can be easily removed) ret.guid = fn.guid; return ret; }; function cleanUpEvents(elem, type) { var data = getData(elem); // Remove the events of a particular type if there are none left if (data.events[type].length === 0) { delete data.events[type]; // Remove the meta-handler from the element if (document.removeEventListener) { elem.removeEventListener(type, data.handler, false); } else if (document.detachEvent) { elem.detachEvent("on" + type, data.handler); } } // Remove the events object if there are no types left if (isEmpty(data.events)) { delete data.events; delete data.handler; } // Finally remove the expando if there is no data left if (isEmpty(data)) { removeData(elem); } } function isEmpty(object) { for (var prop in object) { return false; } return true; } })(); function triggerEvent(elem, event) { var handler = getData(elem).handler, parent = elem.parentNode || elem.ownerDocument; if (typeof event === 'string') { event = { type: event, target: elem }; } if (handler) { handler.call(elem, event); } // Bubble the event up the tree to the document, // Unless it's been explicitly stopped if (parent && !event.isPropagationStopped()) { triggerEvent(parent, event); // We're at the top document so trigger the default action } else if (!parent && !event.isDefaultPrevented()) { var targetData = getData(event.target), targetHandler = targetData.handler; // so if there is handler to the defalt handler , we execute it if (event.target[event.type]) { // I Suppose that it is the event.type rather than just the type // Temporarily disable the bound handler, // don't want to execute it twice if (targetHandler) { targetData.handler = function () { }; } // Trigger the native event (click, focus, blur) event.target[event.type](); // I suppose that it is the event.type rather than the type // restore the handler if (targetHandler) { targetData.handler = targetHandler; } } } }
the code above also has a triggerEvent method, which we might come back later.
so some of the comment.
we are storing all incoming handlers in a central data store (the event types are within the 'event' property and each event type stores an array of all the handlers that are bound), instead of binding directly the handler to the element. we use array because it allows to bind more than one handler and also it it will allow execution in the order.
the method stopImmediatePropagation provide a means for one handler to stop the handlers that follows it.
we then bind a generic handler to the element, the handler will then execute the bound handlers in the array in order . We only need to generate one of these handlers per element (since we capture the element via a closure which then use to look up the event data and correct the handler contexts -- this is about the fixEvent call).
While the handler comes in we also give it a unique ID. This isn't explicitly required in order to be able to remove the handler later. though we can compare the function, the id way has one advantage in that you can create a nice proxy function for chaning the context of the handler.
Below show you how to use the proxy method. (need further verify)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript" src="addremoveevents.js"></script> <script type="text/javascript"> var obj = { count: 0, method: function () { this.count++; } }; addEvent(window, "load", function () { // Attach the handler while enforcing the context to 'obj' addEvent(document.body, "click", proxy(obj, obj.method)); // Remove on right click addEvent(document.body, "click", function (e) { if (e.button === 3) { // Note that we can remove the obj.method handler no problem removeEvent(document.body, "click", obj.method); } }); }); </script> </head> <body> Hello world </body> </html>
about the remove method. It is capable of removing a single event handler, but it is also possible to remove all handlers of a particular type or even all events bound to the element.
// Remove all bound events from the body removeEvent( document.body ); // Remove all click events from the body removeEvent( document.body, "click" ); // Remove a single function from the body removeEvent( document.body, "click", someFn );
The important aspect behind removeEvent is in making sure that we clean up all our event handlers,
data store, and meta-handler properly.
Most of the logic for handling that is contained within the cleanUpEvents function. This function makes sure to systematically go through the element's data store and clean up any loose ends - eventually removing the meta-handler from the element itself if all handlers of a particular type have been removed from the element.
Below is the code that I used to test the handlers management.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript" src="addremoveevents.js"></script> <script type="text/javascript"> addEvent(window, "load", function () { var li = document.getElementsByTagName("li"); for (var i = 0; i < li.length; i++) { (function (elem) { // joe's note, it is the same if you have the 'function handlers' // or you simply have the 'function' addEvent(elem, "click", function (e) { // only do this on left click if (e.button === 0) { // the book has the value of e.button === 1 this.style.backgroundColor = "green"; removeEvent(elem, "click", handler); } }); })(li[i]); } } ); </script> </head> <body> <ul> <li>Click</li> <li>me</li> <li>once.</li> </ul> </body> </html>
There are three elements, if you click on one of them, the background of the element will turns green.
发表评论
-
javascript - trick to cross browser DOM ready event
2012-08-24 08:23 927the "ready" event ... -
javascript - trick to simulate mouseenter and mouseleave
2012-08-23 08:31 2253Previously we discussed javasc ... -
javascript - trick to simulate the change event
2012-08-22 08:51 1659In the previous discussion a ... -
javascript - trick to simulate bubbling submit event
2012-08-22 08:03 905In the previous discussion abou ... -
javascript - trick to implement bubbling submit event
2012-08-23 07:55 700Following up to the javascrip ... -
javascript - trick to detect bubbling supportability
2012-08-20 22:22 971Event delegation is oe of the b ... -
javascript - trigger event and custom events
2012-08-20 21:58 2077In the previous post - javascri ... -
javascript - trick to centralized store
2012-08-20 07:52 818For a number of reasons it's ... -
javascript - trick to fix the event object
2012-08-20 07:47 880Many browsers, especially In ... -
javascript - tricks to deal with colors
2012-08-15 08:34 765There are a couple of ways to r ... -
javascript - trick to manipulate the opacity
2012-08-15 08:26 765All other browsre may have supp ... -
javascript - trick to test visibility of an element
2012-08-15 08:15 521though there is a visible prope ... -
javascript - trick to get and set height and width
2012-08-15 08:05 548when looking at properties t ... -
javascript - trick to set/get attributes that expects px values
2012-08-16 11:00 516When setting a number into a ... -
javascript - trick to get and set CSS style
2012-08-16 11:00 747while it will not be so much tr ... -
javascript - trick to normalize href for IE
2012-08-16 10:59 532IE is again the only browser th ... -
javascript - trick IE form and its expando attribute
2012-08-16 10:59 1041there is a known issue that if ... -
javascript expando and attributes
2012-08-14 08:15 1038expando is something like this ... -
javascript - trick to getText and setText
2012-08-14 07:40 1143it is not as simple as you thin ... -
javascript - trick/guideline to remove DOM element
2012-08-14 07:00 1176remove an element is not as sim ...
相关推荐
Pandas-and-NumPy-Tips-Trick-and-Techniques-master
在VB6(Visual Basic 6)中,"S-a-D-trick.rar_Join In" 这个主题涉及到的是文件分割与合并的技术。在处理大文件时,为了方便传输或者存储,我们可能会选择将其分割成多个小文件,而在需要使用整个文件时,则需要将...
Python-trick,上传的事pdf文档
在规定的时间内,使用鼠标控制帽子接住落下的保龄球,躲避炸弹。_Hat-Trick
【HLP-Trick-crx插件】是一款专为解决特定网页限制而设计的浏览器扩展程序,主要用于恢复用户在浏览网页时被禁用的复制、粘贴功能,以及上下文菜单和本地高亮显示功能。这款插件特别适用于那些因为版权保护或者安全...
语言:python 内容包括:源码、数据集、数据集描述、论文 目的:使用CNN算法在橄榄球比赛中目标检测。 带数据集很好运行,主页有搭建环境过程。主页有更多源码。 数据集描述如下: 在这场比赛中,你的任务是预测球员...
gtg-grind-trick-generator PWA Web应用程序(Node.js,JS,HTML,CSS) Chrome,Safari,Firefox,Edge(Android,iOS,MacOS,Windows) 离线工作Android应用程式使用Google Workbox,Webpack制作
Python 提示和技巧 ... git clone https://github.com/plasmashadow/py-trick-book.git 我假设您安装了 ipython 导航到目录并执行 ipython notebook 笔记: 退出间谍活动并自己阅读 或者 保持冷静,加入草帽海贼团
...DOCTYPE>声明、元素、元素和元素。<!...包含元数据,如标题()、字符集(<meta charset="UTF-8">)和链接外部资源(如CSS文件)。则包含网页的可见内容,如文本、图像、链接等。...例如,使用和来定义页面头部和底部,...
React 21 卡技巧一个演示卡片技巧的React应用程序。动机该项目旨在学习如何使用 React 钩子和进行嵌套的 api 调用。 该项目不再进行。怎么玩记住 21 张卡片中的 1 张后,单击完成。 选择您的卡片所在的 3 堆中的哪一...
1. 下载最新版本的源代码,例如压缩包内的hattrick-0.1.6。 2. 在VDR环境中编译和安装插件。这可能需要熟悉Linux环境和基本的编译命令。 3. 配置VDR以启用Hattrick插件,并设置与Hattrick账户的连接信息。 4. 更新...
Trick-CMCC 利用CMCC公共热点的小漏洞免费上网~~ :) sudo ./conn.sh Notice: 目前只知道我工CMCC有这特色, 其他地区尚不明确 Notice: 脚本适用于使用NetWorkManager网络sds管理工具的系统 Notice: 不必惊讶原理, ...
该扩展程序重新启用网页上的复制/粘贴功能,上下文菜单和本机突出显示功能。 支持语言:English (United States)
"Trick"这一主题似乎与一套特别的字体资源相关,其中包括多种不同风格的图像文件(.gif)和TrueType字体文件(.TTF)。让我们深入探讨一下这个话题。 首先,.gif 文件是一种常见的图像格式,支持透明度和动画,常...
Use the [removed] tag to tell the browser you’re writing JavaScript 11 Your web browser can handle HTML, CSS, AND JavaScript 12 Man’s virtual best friend... needs YOUR help 15 Making iRock ...
Hattrick球场上座率概算 Hattrick球场上座率概算
### 重修 Slope Trick 技术解析 #### 一、引言 Slope Trick,作为一项优化动态规划(DP)问题的技术手段,在算法竞赛领域里占有重要地位。该技术的核心在于利用函数斜率的变化来简化计算过程,尤其是在面对那些代价...
ChromePastelFluoWebTheme(((和)))意味着我们从时尚到手写笔或其他任何方式,除非您是专业人士? 信息 这是深色网页的主题,chrome协议UI和URL前缀不能很好地完成(例如:chrome://),只有扩展页面配置部分...
【手掌(TRICK-ARM)血管成像扫描技术】 手掌(TRICK-ARM)血管成像扫描技术是一种基于磁共振成像(MRI)的血管造影技术,特别针对手掌区域的血管疾病进行诊断。这项技术在临床中具有显著的应用价值,尤其在识别手掌血管...
Trick-Rpc-Framework 是一个简单的RPC框架实现,旨在帮助开发者理解和实践RPC的基本原理。本文将深入探讨RPC框架的核心概念、设计模式以及Trick-Rpc-Framework的实现细节。 1. RPC的基本概念 RPC使得服务间的通信变...