| 2093 | | fix: function(event) { |
| 2094 | | // store a copy of the original event object |
| 2095 | | // and clone to set read-only properties |
| 2096 | | var originalEvent = event; |
| 2097 | | event = jQuery.extend({}, originalEvent); |
| 2098 | | |
| 2099 | | // add preventDefault and stopPropagation since |
| 2100 | | // they will not work on the clone |
| 2101 | | event.preventDefault = function() { |
| 2102 | | // if preventDefault exists run it on the original event |
| 2103 | | if (originalEvent.preventDefault) |
| 2104 | | originalEvent.preventDefault(); |
| 2105 | | // otherwise set the returnValue property of the original event to false (IE) |
| 2106 | | originalEvent.returnValue = false; |
| 2107 | | }; |
| 2108 | | event.stopPropagation = function() { |
| 2109 | | // if stopPropagation exists run it on the original event |
| 2110 | | if (originalEvent.stopPropagation) |
| 2111 | | originalEvent.stopPropagation(); |
| 2112 | | // otherwise set the cancelBubble property of the original event to true (IE) |
| 2113 | | originalEvent.cancelBubble = true; |
| 2114 | | }; |
| 2115 | | |
| 2116 | | // Fix target property, if necessary |
| 2117 | | if ( !event.target ) |
| 2118 | | event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either |
| 2119 | | |
| 2120 | | // check if target is a textnode (safari) |
| 2121 | | if ( event.target.nodeType == 3 ) |
| 2122 | | event.target = originalEvent.target.parentNode; |
| 2123 | | |
| 2124 | | // Add relatedTarget, if necessary |
| 2125 | | if ( !event.relatedTarget && event.fromElement ) |
| 2126 | | event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; |
| 2127 | | |
| 2128 | | // Calculate pageX/Y if missing and clientX/Y available |
| 2129 | | if ( event.pageX == null && event.clientX != null ) { |
| 2130 | | var doc = document.documentElement, body = document.body; |
| 2131 | | event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); |
| 2132 | | event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); |
| 2133 | | } |
| 2134 | | |
| 2135 | | // Add which for key events |
| 2136 | | if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) |
| 2137 | | event.which = event.charCode || event.keyCode; |
| 2138 | | |
| 2139 | | // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) |
| 2140 | | if ( !event.metaKey && event.ctrlKey ) |
| 2141 | | event.metaKey = event.ctrlKey; |
| 2142 | | |
| 2143 | | // Add which for click: 1 == left; 2 == middle; 3 == right |
| 2144 | | // Note: button is not normalized, so don't use it |
| 2145 | | if ( !event.which && event.button ) |
| 2146 | | event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); |
| 2147 | | |
| 2148 | | return event; |
| 2149 | | }, |
| 2150 | | |
| | 2094 | // create a new event object to be able to set |
| | 2095 | // properties that normally are just read-only |
| | 2096 | create: function(e, target, source) { |
| | 2097 | |
| | 2098 | // need to set defult values |
| | 2099 | return e.originalEvent ? e : { |
| | 2100 | |
| | 2101 | type: e.type, |
| | 2102 | |
| | 2103 | pageX: e.pageX || 0, |
| | 2104 | pageY: e.pageY || 0, |
| | 2105 | |
| | 2106 | clientX: e.clientX || 0, |
| | 2107 | clientY: e.clientY || 0, |
| | 2108 | |
| | 2109 | screenX: e.screenX || 0, |
| | 2110 | screenY: e.screenY || 0, |
| | 2111 | |
| | 2112 | // target is a parameter |
| | 2113 | target: target || window, |
| | 2114 | |
| | 2115 | altKey: e.altKey || false, |
| | 2116 | button: e.button || false, |
| | 2117 | ctrlKey: e.ctrlKey || false, |
| | 2118 | metaKey: e.metaKey || false, |
| | 2119 | shiftKey: e.shiftKey || false, |
| | 2120 | |
| | 2121 | details: e.details || null, |
| | 2122 | wheelDelta: e.wheelDelta || 0, |
| | 2123 | |
| | 2124 | bubbles: e.bubbles || true, |
| | 2125 | cancelable: e.cancelable || true, |
| | 2126 | |
| | 2127 | eventPhase: e.eventPhase || 0, |
| | 2128 | timeStamp: e.timeStamp || (new Date()).getTime(), |
| | 2129 | |
| | 2130 | // target and source are parameters |
| | 2131 | relatedTarget: e.relatedTarget || target || null, |
| | 2132 | currentTarget: e.currentTarget || source || null, |
| | 2133 | |
| | 2134 | view: e.view || window, |
| | 2135 | |
| | 2136 | relatedNode: e.relatedNode || null, |
| | 2137 | |
| | 2138 | prevValue: e.prevValue || null, |
| | 2139 | newValue: e.newValue || null, |
| | 2140 | |
| | 2141 | attrName: e.attrName || '', |
| | 2142 | attrChange: e.attrChange || false, |
| | 2143 | |
| | 2144 | data: e.data || null, |
| | 2145 | handler: e.handler || null, |
| | 2146 | exclusive: e.exclusive || false, |
| | 2147 | |
| | 2148 | // reference to the original event |
| | 2149 | originalEvent: e |
| | 2150 | |
| | 2151 | }; |
| | 2152 | |
| | 2153 | }, |
| | 2154 | |
| | 2155 | fix: function(e, o) { |
| | 2156 | |
| | 2157 | // cache this |
| | 2158 | var root = document.documentElement, body = document.body; |
| | 2159 | |
| | 2160 | // optimized using lazy function definition |
| | 2161 | // and recreating a new event object template |
| | 2162 | |
| | 2163 | if ( document.createEventObject ) { |
| | 2164 | |
| | 2165 | jQuery.event.fix = function(e, o) { |
| | 2166 | |
| | 2167 | var ev = e; |
| | 2168 | |
| | 2169 | ev.target = ev.target || ev.srcElement || window; |
| | 2170 | |
| | 2171 | // prevent the execution of the default action |
| | 2172 | ev.preventDefault = ev.preventDefault || function() { |
| | 2173 | // set the returnValue property of |
| | 2174 | // the original event to false (IE) |
| | 2175 | e.returnValue = false; |
| | 2176 | }; |
| | 2177 | |
| | 2178 | // stop the event bubbling up to other elements |
| | 2179 | ev.stopPropagation = ev.stopPropagation || function() { |
| | 2180 | // set the cancelBubble property of |
| | 2181 | // the original event to true (IE) |
| | 2182 | e.cancelBubble = true; |
| | 2183 | }; |
| | 2184 | |
| | 2185 | // check if target is a textnode (safari) |
| | 2186 | if ( ev.target.nodeType == 3 ) { |
| | 2187 | ev.target = ev.target.parentNode; |
| | 2188 | } |
| | 2189 | |
| | 2190 | // Add relatedTarget, if necessary |
| | 2191 | ev.relatedTarget = ev.relatedTarget || (ev.fromElement == ev.target ? ev.toElement : ev.fromElement); |
| | 2192 | |
| | 2193 | // Calculate pageX/Y if missing and clientX/Y available |
| | 2194 | ev.pageX = ev.pageX || (ev.clientX + (root && root.scrollLeft || body && body.scrollLeft || 0) - (root.clientLeft || 0)); |
| | 2195 | ev.pageY = ev.pageY || (ev.clientY + (root && root.scrollTop || body && body.scrollTop || 0) - (root.clientTop || 0)); |
| | 2196 | |
| | 2197 | // Add which for key events |
| | 2198 | ev.which = ev.which || ev.charCode || ev.keyCode; |
| | 2199 | |
| | 2200 | // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) |
| | 2201 | ev.metaKey = ev.metaKey || ev.ctrlKey; |
| | 2202 | |
| | 2203 | // Add which for click: 1 == left; 2 == middle; 3 == right |
| | 2204 | // Note: button is not normalized, so don't use it |
| | 2205 | ev.which = ev.which || (ev.button & 1 ? 1 : ( ev.button & 2 ? 3 : ( ev.button & 4 ? 2 : 0 ) )); |
| | 2206 | |
| | 2207 | // return the writable cloned event |
| | 2208 | return ev; |
| | 2209 | } |
| | 2210 | |
| | 2211 | } else { |
| | 2212 | |
| | 2213 | jQuery.event.fix = function(e, o) { |
| | 2214 | |
| | 2215 | var ev = e; |
| | 2216 | |
| | 2217 | // is it a custom event |
| | 2218 | if ( !ev.initEvent ) { |
| | 2219 | |
| | 2220 | // create a mirror event |
| | 2221 | ev = jQuery.event.create(e, e.target, o); |
| | 2222 | |
| | 2223 | // add preventDefault and stopPropagation since |
| | 2224 | // they will not work on the clone event object |
| | 2225 | |
| | 2226 | // prevent the execution of the default action |
| | 2227 | ev.preventDefault = ev.preventDefault || function() { |
| | 2228 | // if preventDefault exists run it on the original event |
| | 2229 | if (e.preventDefault) |
| | 2230 | e.preventDefault(); |
| | 2231 | }; |
| | 2232 | |
| | 2233 | // stop the event bubbling up to other elements |
| | 2234 | ev.stopPropagation = ev.stopPropagation || function() { |
| | 2235 | // if stopPropagation exists run it on the original event |
| | 2236 | if (e.stopPropagation) |
| | 2237 | e.stopPropagation(); |
| | 2238 | }; |
| | 2239 | |
| | 2240 | // check if target is a textnode |
| | 2241 | if ( ev.target.nodeType == 3 ) { |
| | 2242 | ev.target = ev.target.parentNode; |
| | 2243 | } |
| | 2244 | |
| | 2245 | } |
| | 2246 | |
| | 2247 | return ev; |
| | 2248 | } |
| | 2249 | } |
| | 2250 | |
| | 2251 | return jQuery.event.fix(e, o); |
| | 2252 | }, |
| | 2253 | |