diff options
Diffstat (limited to 'lib/dojo/_base/event.js')
-rw-r--r-- | lib/dojo/_base/event.js | 124 |
1 files changed, 64 insertions, 60 deletions
diff --git a/lib/dojo/_base/event.js b/lib/dojo/_base/event.js index 5268c6cff..65239bf50 100644 --- a/lib/dojo/_base/event.js +++ b/lib/dojo/_base/event.js @@ -1,5 +1,5 @@ /* - Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved. + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. Available via Academic Free License >= 2.1 OR the modified BSD license. see: http://dojotoolkit.org/license for details */ @@ -10,27 +10,26 @@ dojo._hasResource["dojo._base.event"] = true; dojo.provide("dojo._base.event"); dojo.require("dojo._base.connect"); + // this file courtesy of the TurboAjax Group, licensed under a Dojo CLA (function(){ // DOM event listener machinery var del = (dojo._event_listener = { add: function(/*DOMNode*/ node, /*String*/ name, /*Function*/ fp){ - if(!node){return;} + if(!node){return;} name = del._normalizeEventName(name); fp = del._fixCallback(name, fp); - var oname = name; if( - !dojo.isIE && + !dojo.isIE && (name == "mouseenter" || name == "mouseleave") ){ var ofp = fp; - //oname = name; name = (name == "mouseenter") ? "mouseover" : "mouseout"; fp = function(e){ if(!dojo.isDescendant(e.relatedTarget, node)){ // e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable. - return ofp.call(this, e); + return ofp.call(this, e); } } } @@ -71,7 +70,7 @@ dojo.require("dojo._base.connect"); }, _fixEvent: function(evt, sender){ // _fixCallback only attaches us to keypress. - // Switch on evt.type anyway because we might + // Switch on evt.type anyway because we might // be called directly from dojo.fixEvent. switch(evt.type){ case "keypress": @@ -81,26 +80,26 @@ dojo.require("dojo._base.connect"); return evt; }, _setKeyChar: function(evt){ - evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : ''; + evt.keyChar = evt.charCode >= 32 ? String.fromCharCode(evt.charCode) : ''; evt.charOrCode = evt.keyChar || evt.keyCode; }, // For IE and Safari: some ctrl-key combinations (mostly w/punctuation) do not emit a char code in IE // we map those virtual key codes to ascii here // not valid for all (non-US) keyboards, so maybe we shouldn't bother - _punctMap: { - 106:42, - 111:47, - 186:59, - 187:43, - 188:44, - 189:45, - 190:46, - 191:47, - 192:96, - 219:91, - 220:92, - 221:93, - 222:39 + _punctMap: { + 106:42, + 111:47, + 186:59, + 187:43, + 188:44, + 189:45, + 190:46, + 191:47, + 192:96, + 219:91, + 220:92, + 221:93, + 222:39 } }); @@ -115,7 +114,7 @@ dojo.require("dojo._base.connect"); // sender: DOMNode // node to treat as "currentTarget" return del._fixEvent(evt, sender); - } + }; dojo.stopEvent = function(/*Event*/ evt){ // summary: @@ -126,7 +125,7 @@ dojo.require("dojo._base.connect"); evt.preventDefault(); evt.stopPropagation(); // NOTE: below, this method is overridden for IE - } + }; // the default listener to use on dontFix nodes, overriden for IE var node_listener = dojo._listener; @@ -141,16 +140,16 @@ dojo.require("dojo._base.connect"); // create a listener var h = l.add(obj, event, dojo.hitch(context, method)); // formerly, the disconnect package contained "l" directly, but if client code - // leaks the disconnect package (by connecting it to a node), referencing "l" + // leaks the disconnect package (by connecting it to a node), referencing "l" // compounds the problem. // instead we return a listener id, which requires custom _disconnect below. // return disconnect package return [ obj, event, h, lid ]; - } + }; dojo._disconnect = function(obj, event, handle, listener){ ([dojo._listener, del, node_listener][listener]).remove(obj, event, handle); - } + }; // Constants @@ -280,7 +279,7 @@ dojo.require("dojo._base.connect"); }; =====*/ - if(dojo.isIE){ + if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ dojo.mouseButtons = { LEFT: 1, MIDDLE: 4, @@ -305,7 +304,7 @@ dojo.require("dojo._base.connect"); } // IE event normalization - if(dojo.isIE){ + if(dojo.isIE){ var _trySetKeyCode = function(e, code){ try{ // squelch errors when keyCode is read-only @@ -314,7 +313,7 @@ dojo.require("dojo._base.connect"); }catch(e){ return 0; } - } + }; // by default, use the standard listener var iel = dojo._listener; @@ -323,7 +322,7 @@ dojo.require("dojo._base.connect"); if(!dojo.config._allow_leaks){ // custom listener that handles leak protection for DOM events node_listener = iel = dojo._ie_listener = { - // support handler indirection: event handler functions are + // support handler indirection: event handler functions are // referenced here. Event dispatchers hold only indices. handlers: [], // add a listener to an object @@ -376,7 +375,7 @@ dojo.require("dojo._base.connect"); }, remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){ event = del._normalizeEventName(event); - iel.remove(node, event, handle); + iel.remove(node, event, handle); if(event=="onkeypress"){ var kd = node.onkeydown; if(--kd._stealthKeydownRefs <= 0){ @@ -402,11 +401,11 @@ dojo.require("dojo._base.connect"); // node to treat as "currentTarget" if(!evt){ var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window; - evt = w.event; + evt = w.event; } if(!evt){return(evt);} - evt.target = evt.srcElement; - evt.currentTarget = (sender || evt.srcElement); + evt.target = evt.srcElement; + evt.currentTarget = (sender || evt.srcElement); evt.layerX = evt.offsetX; evt.layerY = evt.offsetY; // FIXME: scroll position query is duped from dojo.html to @@ -419,14 +418,16 @@ dojo.require("dojo._base.connect"); var offset = dojo._getIeDocumentElementOffset(); evt.pageX = evt.clientX + dojo._fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x; evt.pageY = evt.clientY + (docBody.scrollTop || 0) - offset.y; - if(evt.type == "mouseover"){ + if(evt.type == "mouseover"){ evt.relatedTarget = evt.fromElement; } - if(evt.type == "mouseout"){ + if(evt.type == "mouseout"){ evt.relatedTarget = evt.toElement; } - evt.stopPropagation = del._stopPropagation; - evt.preventDefault = del._preventDefault; + if (dojo.isIE < 9 || dojo.isQuirks) { + evt.stopPropagation = del._stopPropagation; + evt.preventDefault = del._preventDefault; + } return del._fixKeys(evt); }, _fixKeys: function(evt){ @@ -460,38 +461,41 @@ dojo.require("dojo._base.connect"); var k=evt.keyCode; // These are Windows Virtual Key Codes // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp - var unprintable = k!=13 && k!=32 && k!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222); + var unprintable = (k!=13 || (dojo.isIE >= 9 && !dojo.isQuirks)) && k!=32 && k!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222); + // synthesize keypress for most unprintables and CTRL-keys if(unprintable||evt.ctrlKey){ var c = unprintable ? 0 : k; if(evt.ctrlKey){ if(k==3 || k==13){ - return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively - }else if(c>95 && c<106){ + return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively + }else if(c>95 && c<106){ c -= 48; // map CTRL-[numpad 0-9] to ASCII - }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ + }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ c += 32; // map CTRL-[A-Z] to lowercase - }else{ + }else{ c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII } } // simulate a keypress event var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c}); kp.call(evt.currentTarget, faux); - evt.cancelBubble = faux.cancelBubble; + if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ + evt.cancelBubble = faux.cancelBubble; + } evt.returnValue = faux.returnValue; _trySetKeyCode(evt, faux.keyCode); } }, // Called in Event scope _stopPropagation: function(){ - this.cancelBubble = true; + this.cancelBubble = true; }, _preventDefault: function(){ // Setting keyCode to 0 is the only way to prevent certain keypresses (namely // ctrl-combinations that correspond to menu accelerator keys). // Otoh, it prevents upstream listeners from getting this information - // Try to split the difference here by clobbering keyCode only for ctrl + // Try to split the difference here by clobbering keyCode only for ctrl // combinations. If you still need to access the key upstream, bubbledKeyCode is // provided as a workaround. this.bubbledKeyCode = this.keyCode; @@ -501,23 +505,23 @@ dojo.require("dojo._base.connect"); }); // override stopEvent for IE - dojo.stopEvent = function(evt){ + dojo.stopEvent = (dojo.isIE < 9 || dojo.isQuirks) ? function(evt){ evt = evt || window.event; del._stopPropagation.call(evt); del._preventDefault.call(evt); - } + } : dojo.stopEvent; } del._synthesizeEvent = function(evt, props){ var faux = dojo.mixin({}, evt, props); del._setKeyChar(faux); - // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault); + // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault); // but it throws an error when preventDefault is invoked on Safari // does Event.preventDefault not support "apply" on Safari? - faux.preventDefault = function(){ evt.preventDefault(); }; - faux.stopPropagation = function(){ evt.stopPropagation(); }; + faux.preventDefault = function(){ evt.preventDefault(); }; + faux.stopPropagation = function(){ evt.stopPropagation(); }; return faux; - } + }; // Opera event normalization if(dojo.isOpera){ @@ -568,12 +572,12 @@ dojo.require("dojo._base.connect"); var c = unprintable ? 0 : k; if(evt.ctrlKey){ if(k==3 || k==13){ - return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively - }else if(c>95 && c<106){ + return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively + }else if(c>95 && c<106){ c -= 48; // map CTRL-[numpad 0-9] to ASCII - }else if(!evt.shiftKey && c>=65 && c<=90){ + }else if(!evt.shiftKey && c>=65 && c<=90){ c += 32; // map CTRL-[A-Z] to lowercase - }else{ + }else{ c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII } } @@ -630,16 +634,16 @@ if(dojo.isIE){ } } return r; - } + }; dojo._getIeDispatcher = function(){ // ensure the returned function closes over nothing ("new Function" apparently doesn't close) return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function - } + }; // keep this out of the closure to reduce RAM allocation dojo._event_listener._fixCallback = function(fp){ var f = dojo._event_listener._fixEvent; return function(e){ return fp.call(this, f(e, this)); }; - } + }; } } |