aboutsummaryrefslogtreecommitdiffstats
path: root/src/event
diff options
context:
space:
mode:
authorJohn Resig <jeresig@gmail.com>2007-09-08 12:42:32 +0000
committerJohn Resig <jeresig@gmail.com>2007-09-08 12:42:32 +0000
commitb4e23b5af0820a66c2e275051f613f3df9a4444d (patch)
tree8045667211e4aa393ee1b6e006dd0c953e77c963 /src/event
parent13b66c8ba9618242df2c1cc352a2b1d879c36188 (diff)
downloadjquery-b4e23b5af0820a66c2e275051f613f3df9a4444d.tar.gz
jquery-b4e23b5af0820a66c2e275051f613f3df9a4444d.zip
Reorganzing the jQuery source (first phase).
Diffstat (limited to 'src/event')
-rw-r--r--src/event/event.js472
-rw-r--r--src/event/eventTest.js194
2 files changed, 0 insertions, 666 deletions
diff --git a/src/event/event.js b/src/event/event.js
deleted file mode 100644
index 205b510a1..000000000
--- a/src/event/event.js
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code orignated from
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
- // Bind an event to an element
- // Original by Dean Edwards
- add: function(element, type, handler, data) {
- // For whatever reason, IE has trouble passing the window object
- // around, causing it to be cloned in the process
- if ( jQuery.browser.msie && element.setInterval != undefined )
- element = window;
-
- // Make sure that the function being executed has a unique ID
- if ( !handler.guid )
- handler.guid = this.guid++;
-
- // if data is passed, bind to handler
- if( data != undefined ) {
- // Create temporary function pointer to original handler
- var fn = handler;
-
- // Create unique handler function, wrapped around original handler
- handler = function() {
- // Pass arguments and context to original handler
- return fn.apply(this, arguments);
- };
-
- // Store data in unique handler
- handler.data = data;
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- handler.guid = fn.guid;
- }
-
- // Namespaced event handlers
- var parts = type.split(".");
- type = parts[0];
- handler.type = parts[1];
-
- // Init the element's event structure
- if (!element.$events)
- element.$events = {};
-
- if (!element.$handle)
- element.$handle = function() {
- // returned undefined or false
- var val;
-
- // Handle the second event of a trigger and when
- // an event is called after a page has unloaded
- if ( typeof jQuery == "undefined" || jQuery.event.triggered )
- return val;
-
- val = jQuery.event.handle.apply(element, arguments);
-
- return val;
- };
-
- // Get the current list of functions bound to this event
- var handlers = element.$events[type];
-
- // Init the event handler queue
- if (!handlers) {
- handlers = element.$events[type] = {};
-
- // And bind the global event handler to the element
- if (element.addEventListener)
- element.addEventListener(type, element.$handle, false);
- else
- element.attachEvent("on" + type, element.$handle);
- }
-
- // Add the function to the element's handler list
- handlers[handler.guid] = handler;
-
- // Keep track of which events have been used, for global triggering
- this.global[type] = true;
- },
-
- guid: 1,
- global: {},
-
- // Detach an event or set of events from an element
- remove: function(element, type, handler) {
- var events = element.$events, ret, index;
-
- // Namespaced event handlers
- if ( typeof type == "string" ) {
- var parts = type.split(".");
- type = parts[0];
- }
-
- if ( events ) {
- // type is actually an event object here
- if ( type && type.type ) {
- handler = type.handler;
- type = type.type;
- }
-
- if ( !type ) {
- for ( type in events )
- this.remove( element, type );
-
- } else if ( events[type] ) {
- // remove the given handler for the given type
- if ( handler )
- delete events[type][handler.guid];
-
- // remove all handlers for the given type
- else
- for ( handler in element.$events[type] )
- // Handle the removal of namespaced events
- if ( !parts[1] || events[type][handler].type == parts[1] )
- delete events[type][handler];
-
- // remove generic event handler if no more handlers exist
- for ( ret in events[type] ) break;
- if ( !ret ) {
- if (element.removeEventListener)
- element.removeEventListener(type, element.$handle, false);
- else
- element.detachEvent("on" + type, element.$handle);
- ret = null;
- delete events[type];
- }
- }
-
- // Remove the expando if it's no longer used
- for ( ret in events ) break;
- if ( !ret )
- element.$handle = element.$events = null;
- }
- },
-
- trigger: function(type, data, element, donative, extra) {
- // Clone the incoming data, if any
- data = jQuery.makeArray(data || []);
-
- // Handle a global trigger
- if ( !element ) {
- // Only trigger if we've ever bound an event for it
- if ( this.global[type] )
- jQuery("*").add([window, document]).trigger(type, data);
-
- // Handle triggering a single element
- } else {
- var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
- // Check to see if we need to provide a fake event, or not
- evt = !data[0] || !data[0].preventDefault;
-
- // Pass along a fake event
- if ( evt )
- data.unshift( this.fix({ type: type, target: element }) );
-
- // Trigger the event
- if ( jQuery.isFunction( element.$handle ) )
- val = element.$handle.apply( element, data );
-
- // Handle triggering native .onfoo handlers
- if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
- val = false;
-
- // Extra functions don't get the custom event object
- if ( evt )
- data.shift();
-
- // Handle triggering of extra function
- if ( extra && extra.apply( element, data ) === false )
- val = false;
-
- // Trigger the native events (except for clicks on links)
- if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
- this.triggered = true;
- element[ type ]();
- }
-
- this.triggered = false;
- }
-
- return val;
- },
-
- handle: function(event) {
- // returned undefined or false
- var val;
-
- // Empty object is for triggered events with no data
- event = jQuery.event.fix( event || window.event || {} );
-
- // Namespaced event handlers
- var parts = event.type.split(".");
- event.type = parts[0];
-
- var c = this.$events && this.$events[event.type], args = Array.prototype.slice.call( arguments, 1 );
- args.unshift( event );
-
- for ( var j in c ) {
- // Pass in a reference to the handler function itself
- // So that we can later remove it
- args[0].handler = c[j];
- args[0].data = c[j].data;
-
- // Filter the functions by class
- if ( !parts[1] || c[j].type == parts[1] ) {
- var tmp = c[j].apply( this, args );
-
- if ( val !== false )
- val = tmp;
-
- if ( tmp === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
-
- // Clean up added properties in IE to prevent memory leak
- if (jQuery.browser.msie)
- event.target = event.preventDefault = event.stopPropagation =
- event.handler = event.data = null;
-
- return val;
- },
-
- fix: function(event) {
- // store a copy of the original event object
- // and clone to set read-only properties
- var originalEvent = event;
- event = jQuery.extend({}, originalEvent);
-
- // add preventDefault and stopPropagation since
- // they will not work on the clone
- event.preventDefault = function() {
- // if preventDefault exists run it on the original event
- if (originalEvent.preventDefault)
- originalEvent.preventDefault();
- // otherwise set the returnValue property of the original event to false (IE)
- originalEvent.returnValue = false;
- };
- event.stopPropagation = function() {
- // if stopPropagation exists run it on the original event
- if (originalEvent.stopPropagation)
- originalEvent.stopPropagation();
- // otherwise set the cancelBubble property of the original event to true (IE)
- originalEvent.cancelBubble = true;
- };
-
- // Fix target property, if necessary
- if ( !event.target && event.srcElement )
- event.target = event.srcElement;
-
- // check if target is a textnode (safari)
- if (jQuery.browser.safari && event.target.nodeType == 3)
- event.target = originalEvent.target.parentNode;
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && event.fromElement )
- event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && event.clientX != null ) {
- var e = document.documentElement, b = document.body;
- event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
- event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
- }
-
- // Add which for key events
- if ( !event.which && (event.charCode || event.keyCode) )
- event.which = event.charCode || event.keyCode;
-
- // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
- if ( !event.metaKey && event.ctrlKey )
- event.metaKey = event.ctrlKey;
-
- // Add which for click: 1 == left; 2 == middle; 3 == right
- // Note: button is not normalized, so don't use it
- if ( !event.which && event.button )
- event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
-
- return event;
- }
-};
-
-jQuery.fn.extend({
- bind: function( type, data, fn ) {
- return type == "unload" ? this.one(type, data, fn) : this.each(function(){
- jQuery.event.add( this, type, fn || data, fn && data );
- });
- },
-
- one: function( type, data, fn ) {
- return this.each(function(){
- jQuery.event.add( this, type, function(event) {
- jQuery(this).unbind(event);
- return (fn || data).apply( this, arguments);
- }, fn && data);
- });
- },
-
- unbind: function( type, fn ) {
- return this.each(function(){
- jQuery.event.remove( this, type, fn );
- });
- },
-
- trigger: function( type, data, fn ) {
- return this.each(function(){
- jQuery.event.trigger( type, data, this, true, fn );
- });
- },
-
- triggerHandler: function( type, data, fn ) {
- if ( this[0] )
- return jQuery.event.trigger( type, data, this[0], false, fn );
- },
-
- toggle: function() {
- // Save reference to arguments for access in closure
- var a = arguments;
-
- return this.click(function(e) {
- // Figure out which function to execute
- this.lastToggle = 0 == this.lastToggle ? 1 : 0;
-
- // Make sure that clicks stop
- e.preventDefault();
-
- // and execute the function
- return a[this.lastToggle].apply( this, [e] ) || false;
- });
- },
-
- hover: function(f,g) {
-
- // A private function for handling mouse 'hovering'
- function handleHover(e) {
- // Check if mouse(over|out) are still within the same parent element
- var p = e.relatedTarget;
-
- // Traverse up the tree
- while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; };
-
- // If we actually just moused on to a sub-element, ignore it
- if ( p == this ) return false;
-
- // Execute the right function
- return (e.type == "mouseover" ? f : g).apply(this, [e]);
- }
-
- // Bind the function to the two event listeners
- return this.mouseover(handleHover).mouseout(handleHover);
- },
-
- ready: function(f) {
- // Attach the listeners
- bindReady();
-
- // If the DOM is already ready
- if ( jQuery.isReady )
- // Execute the function immediately
- f.apply( document, [jQuery] );
-
- // Otherwise, remember the function for later
- else
- // Add the function to the wait list
- jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } );
-
- return this;
- }
-});
-
-jQuery.extend({
- /*
- * All the code that makes DOM Ready work nicely.
- */
- isReady: false,
- readyList: [],
-
- // Handle when the DOM is ready
- ready: function() {
- // Make sure that the DOM is not already loaded
- if ( !jQuery.isReady ) {
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If there are functions bound, to execute
- if ( jQuery.readyList ) {
- // Execute all of them
- jQuery.each( jQuery.readyList, function(){
- this.apply( document );
- });
-
- // Reset the list of functions
- jQuery.readyList = null;
- }
- // Remove event listener to avoid memory leak
- if ( jQuery.browser.mozilla || jQuery.browser.opera )
- document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
-
- // Remove script element used by IE hack
- if( !window.frames.length ) // don't remove if frames are present (#1187)
- jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
- }
- }
-});
-
-
-jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
- "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
- "submit,keydown,keypress,keyup,error").split(","), function(i,o){
-
- // Handle event binding
- jQuery.fn[o] = function(f){
- return f ? this.bind(o, f) : this.trigger(o);
- };
-});
-
-var readyBound = false;
-
-function bindReady(){
- if ( readyBound ) return;
- readyBound = true;
-
- // If Mozilla is used
- if ( jQuery.browser.mozilla || jQuery.browser.opera )
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
-
- // If IE is used, use the excellent hack by Matthias Miller
- // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
- else if ( jQuery.browser.msie ) {
-
- // Only works if you document.write() it
- document.write("<scr" + "ipt id=__ie_init defer=true " +
- "src=//:><\/script>");
-
- // Use the defer script hack
- var script = document.getElementById("__ie_init");
-
- // script does not exist if jQuery is loaded dynamically
- if ( script )
- script.onreadystatechange = function() {
- if ( this.readyState != "complete" ) return;
- jQuery.ready();
- };
-
- // Clear from memory
- script = null;
-
- // If Safari is used
- } else if ( jQuery.browser.safari )
- // Continually check to see if the document.readyState is valid
- jQuery.safariTimer = setInterval(function(){
- // loaded and complete are both valid states
- if ( document.readyState == "loaded" ||
- document.readyState == "complete" ) {
-
- // If either one are found, remove the timer
- clearInterval( jQuery.safariTimer );
- jQuery.safariTimer = null;
-
- // and execute any waiting functions
- jQuery.ready();
- }
- }, 10);
-
- // A fallback to window.onload, that will always work
- jQuery.event.add( window, "load", jQuery.ready );
-}
diff --git a/src/event/eventTest.js b/src/event/eventTest.js
deleted file mode 100644
index 334f286c7..000000000
--- a/src/event/eventTest.js
+++ /dev/null
@@ -1,194 +0,0 @@
-module("event");
-
-test("bind()", function() {
- expect(15);
-
- var handler = function(event) {
- ok( event.data, "bind() with data, check passed data exists" );
- ok( event.data.foo == "bar", "bind() with data, Check value of passed data" );
- };
- $("#firstp").bind("click", {foo: "bar"}, handler).click().unbind("click", handler);
-
- ok( !$("#firstp").get(0).$events, "Event handler unbound when using data." );
-
- reset();
- var handler = function(event, data) {
- ok( event.data, "check passed data exists" );
- ok( event.data.foo == "bar", "Check value of passed data" );
- ok( data, "Check trigger data" );
- ok( data.bar == "foo", "Check value of trigger data" );
- };
- $("#firstp").bind("click", {foo: "bar"}, handler).trigger("click", [{bar: "foo"}]).unbind(handler);
-
- reset();
- var handler = function(event) {
- ok ( !event.data, "Check that no data is added to the event object" );
- };
- $("#firstp").bind("click", handler).trigger("click");
-
-
- // events don't work with iframes, see #939 - this test fails in IE because of contentDocument
- // var doc = document.getElementById("iframe").contentDocument;
- //
- // doc.body.innerHTML = "<input type='text'/>";
- //
- // var input = doc.getElementsByTagName("input")[0];
- //
- // $(input).bind("click",function() {
- // ok( true, "Binding to element inside iframe" );
- // }).click();
-
- var counter = 0;
- function selectOnChange(event) {
- equals( event.data, counter++, "Event.data is not a global event object" );
- };
- $("#form select").each(function(i){
- $(this).bind('change', i, selectOnChange);
- }).trigger('change');
-
- reset();
-
- $("#firstp").bind("click",function(e){
- ok(true, "Normal click triggered");
- });
-
- $("#firstp").bind("click.test",function(e){
- ok(true, "Namespaced click triggered");
- });
-
- // Trigger both bound fn (2)
- $("#firstp").trigger("click");
-
- // Trigger one bound fn (1)
- $("#firstp").trigger("click.test");
-
- // Remove only the one fn
- $("#firstp").unbind("click.test");
-
- // Trigger the remaining fn (1)
- $("#firstp").trigger("click");
-});
-
-test("click()", function() {
- expect(4);
- $('<li><a href="#">Change location</a></li>').prependTo('#firstUL').find('a').bind('click', function() {
- var close = $('spanx', this); // same with $(this).find('span');
- ok( close.length == 0, "Context element does not exist, length must be zero" );
- ok( !close[0], "Context element does not exist, direct access to element must return undefined" );
- return false;
- }).click();
-
- $("#check1").click(function() {
- ok( true, "click event handler for checkbox gets fired twice, see #815" );
- }).click();
-
- var counter = 0;
- $('#firstp')[0].onclick = function(event) {
- counter++;
- };
- $('#firstp').click();
- ok( counter == 1, "Check that click, triggers onclick event handler also" );
-});
-
-test("unbind(event)", function() {
- expect(6);
- var el = $("#firstp");
- el.click(function() {
- ok( true, "Fake normal bind" );
- });
- el.click(function(event) {
- el.unbind(event);
- ok( true, "Fake onebind" );
- });
- el.click().click();
-
- el.click(function() { return; });
- el.unbind('click');
- ok( !el[0].onclick, "Handler is removed" ); // Bug #964
-
- el.click(function() { return; });
- el.unbind('change',function(){ return; });
- for (var ret in el[0].$events['click']) break;
- ok( ret, "Extra handlers weren't accidentally removed." );
-
- el.unbind('click');
- ok( !el[0].$events, "Removed the events expando after all handlers are unbound." );
-});
-
-test("trigger(event, [data], [fn])", function() {
- expect(40);
-
- var handler = function(event, a, b, c) {
- equals( event.type, "click", "check passed data" );
- equals( a, 1, "check passed data" );
- equals( b, "2", "check passed data" );
- equals( c, "abc", "check passed data" );
- return "test";
- };
-
- var handler2 = function(a, b, c) {
- equals( a, 1, "check passed data" );
- equals( b, "2", "check passed data" );
- equals( c, "abc", "check passed data" );
- return "test2";
- };
-
- // Simulate a "native" click
- $("#firstp")[0].click = function(){
- ok( true, "Native call was triggered" );
- };
-
- // Triggers handlrs and native
- // Trigger 5
- $("#firstp").bind("click", handler).trigger("click", [1, "2", "abc"]);
-
- // Triggers handlers, native, and extra fn
- // Triggers 8
- $("#firstp").trigger("click", [1, "2", "abc"], handler2);
-
- // Simulate a "native" click
- $("#firstp")[0].click = function(){
- ok( false, "Native call was triggered" );
- };
-
- // Trigger only the handlers (no native)
- // Triggers 5
- equals( $("#firstp").triggerHandler("click", [1, "2", "abc"]), "test", "Verify handler response" );
-
- // Trigger only the handlers (no native) and extra fn
- // Triggers 8
- equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler2), "test", "Verify handler response" );
-
- // Build fake click event to pass in
- var eventObj = jQuery.event.fix({ type: "click", target: document.body });
-
- // Trigger only the handlers (no native), with external event obj
- // Triggers 5
- equals( $("#firstp").triggerHandler("foo", [eventObj, 1, "2", "abc"]), "test", "Verify handler response" );
-
- // Trigger only the handlers (no native) and extra fn, with external event obj
- // Triggers 9
- equals( $("#firstp").triggerHandler("foo", [eventObj, 1, "2", "abc"], handler), "test", "Verify handler response" );
-});
-
-test("toggle(Function, Function)", function() {
- expect(4);
- var count = 0,
- fn1 = function(e) { count++; },
- fn2 = function(e) { count--; },
- preventDefault = function(e) { e.preventDefault() },
- link = $('#mark');
- link.click(preventDefault).click().toggle(fn1, fn2).click().click().click().click().click();
- ok( count == 1, "Check for toggle(fn, fn)" );
-
- var first = 0;
- $("#simon1").one("click", function() {
- ok( true, "Execute event only once" );
- $(this).toggle(function() {
- ok( first++ == 0, "toggle(Function,Function) assigned from within one('xxx'), see #1054" );
- }, function() {
- ok( first == 1, "toggle(Function,Function) assigned from within one('xxx'), see #1054" );
- });
- return false;
- }).click().click().click();
-});