| 281 | | fix: function(event) { |
| 282 | | // store a copy of the original event object |
| 283 | | // and clone to set read-only properties |
| 284 | | var originalEvent = event; |
| 285 | | event = jQuery.extend({}, originalEvent); |
| 286 | | |
| 287 | | // add preventDefault and stopPropagation since |
| 288 | | // they will not work on the clone |
| 289 | | event.preventDefault = function() { |
| 290 | | // if preventDefault exists run it on the original event |
| 291 | | if (originalEvent.preventDefault) |
| 292 | | originalEvent.preventDefault(); |
| 293 | | // otherwise set the returnValue property of the original event to false (IE) |
| 294 | | originalEvent.returnValue = false; |
| 295 | | }; |
| 296 | | event.stopPropagation = function() { |
| 297 | | // if stopPropagation exists run it on the original event |
| 298 | | if (originalEvent.stopPropagation) |
| 299 | | originalEvent.stopPropagation(); |
| 300 | | // otherwise set the cancelBubble property of the original event to true (IE) |
| 301 | | originalEvent.cancelBubble = true; |
| 302 | | }; |
| 303 | | |
| 304 | | // Fix target property, if necessary |
| 305 | | if ( !event.target ) |
| 306 | | event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either |
| 307 | | |
| 308 | | // check if target is a textnode (safari) |
| 309 | | if ( event.target.nodeType == 3 ) |
| 310 | | event.target = originalEvent.target.parentNode; |
| 311 | | |
| 312 | | // Add relatedTarget, if necessary |
| 313 | | if ( !event.relatedTarget && event.fromElement ) |
| 314 | | event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; |
| 315 | | |
| 316 | | // Calculate pageX/Y if missing and clientX/Y available |
| 317 | | if ( event.pageX == null && event.clientX != null ) { |
| 318 | | var doc = document.documentElement, body = document.body; |
| 319 | | event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); |
| 320 | | event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); |
| 321 | | } |
| 322 | | |
| 323 | | // Add which for key events |
| 324 | | if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) |
| 325 | | event.which = event.charCode || event.keyCode; |
| 326 | | |
| 327 | | // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) |
| 328 | | if ( !event.metaKey && event.ctrlKey ) |
| 329 | | event.metaKey = event.ctrlKey; |
| 330 | | |
| 331 | | // Add which for click: 1 == left; 2 == middle; 3 == right |
| 332 | | // Note: button is not normalized, so don't use it |
| 333 | | if ( !event.which && event.button ) |
| 334 | | event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); |
| 335 | | |
| 336 | | return event; |
| 337 | | }, |
| 338 | | |
| | 281 | // create a new event object to be able to set |
| | 282 | // properties that normally are just read-only |
| | 283 | create: function(e, target, source) { |
| | 284 | |
| | 285 | // need to set defult values |
| | 286 | return e.originalEvent ? e : { |
| | 287 | |
| | 288 | type: e.type, |
| | 289 | |
| | 290 | pageX: e.pageX || 0, |
| | 291 | pageY: e.pageY || 0, |
| | 292 | |
| | 293 | clientX: e.clientX || 0, |
| | 294 | clientY: e.clientY || 0, |
| | 295 | |
| | 296 | screenX: e.screenX || 0, |
| | 297 | screenY: e.screenY || 0, |
| | 298 | |
| | 299 | // target is a parameter |
| | 300 | target: target || window, |
| | 301 | |
| | 302 | altKey: e.altKey || false, |
| | 303 | button: e.button || false, |
| | 304 | ctrlKey: e.ctrlKey || false, |
| | 305 | metaKey: e.metaKey || false, |
| | 306 | shiftKey: e.shiftKey || false, |
| | 307 | |
| | 308 | details: e.details || null, |
| | 309 | wheelDelta: e.wheelDelta || 0, |
| | 310 | |
| | 311 | bubbles: e.bubbles || true, |
| | 312 | cancelable: e.cancelable || true, |
| | 313 | |
| | 314 | eventPhase: e.eventPhase || 0, |
| | 315 | timeStamp: e.timeStamp || (new Date()).getTime(), |
| | 316 | |
| | 317 | // target and source are parameters |
| | 318 | relatedTarget: e.relatedTarget || target || null, |
| | 319 | currentTarget: e.currentTarget || source || null, |
| | 320 | |
| | 321 | view: e.view || window, |
| | 322 | |
| | 323 | relatedNode: e.relatedNode || null, |
| | 324 | |
| | 325 | prevValue: e.prevValue || null, |
| | 326 | newValue: e.newValue || null, |
| | 327 | |
| | 328 | attrName: e.attrName || '', |
| | 329 | attrChange: e.attrChange || false, |
| | 330 | |
| | 331 | data: e.data || null, |
| | 332 | handler: e.handler || null, |
| | 333 | exclusive: e.exclusive || false, |
| | 334 | |
| | 335 | // reference to the original event |
| | 336 | originalEvent: e |
| | 337 | |
| | 338 | }; |
| | 339 | |
| | 340 | }, |
| | 341 | |
| | 342 | fix: function(e, o) { |
| | 343 | |
| | 344 | // cache this |
| | 345 | var root = document.documentElement, body = document.body; |
| | 346 | |
| | 347 | // optimized using lazy function definition |
| | 348 | // and recreating a new event object template |
| | 349 | |
| | 350 | if ( document.createEventObject ) { |
| | 351 | |
| | 352 | jQuery.event.fix = function(e, o) { |
| | 353 | |
| | 354 | var ev = e; |
| | 355 | |
| | 356 | ev.target = ev.target || ev.srcElement || window; |
| | 357 | |
| | 358 | // prevent the execution of the default action |
| | 359 | ev.preventDefault = ev.preventDefault || function() { |
| | 360 | // set the returnValue property of |
| | 361 | // the original event to false (IE) |
| | 362 | e.returnValue = false; |
| | 363 | }; |
| | 364 | |
| | 365 | // stop the event bubbling up to other elements |
| | 366 | ev.stopPropagation = ev.stopPropagation || function() { |
| | 367 | // set the cancelBubble property of |
| | 368 | // the original event to true (IE) |
| | 369 | e.cancelBubble = true; |
| | 370 | }; |
| | 371 | |
| | 372 | // check if target is a textnode (safari) |
| | 373 | if ( ev.target.nodeType == 3 ) { |
| | 374 | ev.target = ev.target.parentNode; |
| | 375 | } |
| | 376 | |
| | 377 | // Add relatedTarget, if necessary |
| | 378 | ev.relatedTarget = ev.relatedTarget || (ev.fromElement == ev.target ? ev.toElement : ev.fromElement); |
| | 379 | |
| | 380 | // Calculate pageX/Y if missing and clientX/Y available |
| | 381 | ev.pageX = ev.pageX || (ev.clientX + (root && root.scrollLeft || body && body.scrollLeft || 0) - (root.clientLeft || 0)); |
| | 382 | ev.pageY = ev.pageY || (ev.clientY + (root && root.scrollTop || body && body.scrollTop || 0) - (root.clientTop || 0)); |
| | 383 | |
| | 384 | // Add which for key events |
| | 385 | ev.which = ev.which || ev.charCode || ev.keyCode; |
| | 386 | |
| | 387 | // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) |
| | 388 | ev.metaKey = ev.metaKey || ev.ctrlKey; |
| | 389 | |
| | 390 | // Add which for click: 1 == left; 2 == middle; 3 == right |
| | 391 | // Note: button is not normalized, so don't use it |
| | 392 | ev.which = ev.which || (ev.button & 1 ? 1 : ( ev.button & 2 ? 3 : ( ev.button & 4 ? 2 : 0 ) )); |
| | 393 | |
| | 394 | // return the writable cloned event |
| | 395 | return ev; |
| | 396 | } |
| | 397 | |
| | 398 | } else { |
| | 399 | |
| | 400 | jQuery.event.fix = function(e, o) { |
| | 401 | |
| | 402 | var ev = e; |
| | 403 | |
| | 404 | // is it a custom event |
| | 405 | if ( !ev.initEvent ) { |
| | 406 | |
| | 407 | // create a mirror event |
| | 408 | ev = jQuery.event.create(e, e.target, o); |
| | 409 | |
| | 410 | // add preventDefault and stopPropagation since |
| | 411 | // they will not work on the clone event object |
| | 412 | |
| | 413 | // prevent the execution of the default action |
| | 414 | ev.preventDefault = ev.preventDefault || function() { |
| | 415 | // if preventDefault exists run it on the original event |
| | 416 | if (e.preventDefault) |
| | 417 | e.preventDefault(); |
| | 418 | }; |
| | 419 | |
| | 420 | // stop the event bubbling up to other elements |
| | 421 | ev.stopPropagation = ev.stopPropagation || function() { |
| | 422 | // if stopPropagation exists run it on the original event |
| | 423 | if (e.stopPropagation) |
| | 424 | e.stopPropagation(); |
| | 425 | }; |
| | 426 | |
| | 427 | // check if target is a textnode |
| | 428 | if ( ev.target.nodeType == 3 ) { |
| | 429 | ev.target = ev.target.parentNode; |
| | 430 | } |
| | 431 | |
| | 432 | } |
| | 433 | |
| | 434 | return ev; |
| | 435 | } |
| | 436 | } |
| | 437 | |
| | 438 | return jQuery.event.fix(e, o); |
| | 439 | }, |
| | 440 | |