Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 6999

Show
Ignore:
Timestamp:
06/11/07 07:58:40 (1 year ago)
Author:
tobie
Message:

Adds support for mouseenter and mouseleave. Tests to follow.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • spinoffs/prototype/branches/event/src/event.js

    r6629 r6999  
    2626    var element; 
    2727    switch(event.type) { 
    28       case 'mouseover': element = event.fromElement; 
    29       case 'mouseout':  element = event.toElement; 
     28      case 'mouseover': element = event.fromElement; break; 
     29      case 'mouseout':  element = event.toElement; break; 
    3030      default: return null; 
    3131    } 
     
    5252  // find the first node with the given tagName, starting from the 
    5353  // node the event was triggered on; traverses the DOM upwards 
    54   findElement: function(event, tagName) { 
     54  findElement: function(event, expression) { 
    5555    var element = Event.element(event); 
    56     return element.tagName.toUpperCase() == tagName.toUpperCase() ? 
    57       element : element.up(tagName); 
     56    return element.match(expression) ? element : element.up(expression); 
    5857  } 
    5958}; 
     
    6665    initialize: function(element, type, observer, useCapture) { 
    6766      this.element = $(element); 
    68       if (type == 'keypress' && (B.IE || B.WebKit)) type = 'keydown'; 
     67      switch(type) { 
     68        case 'keypress': 
     69          if (B.IE || B.WebKit) type = 'keydown'; 
     70          break; 
     71        case 'mouseenter': 
     72        case 'mouseleave': 
     73          if (B.IE) break; 
     74          type = type == 'mouseenter' ? 'mouseover' : 'mouseout' 
     75          var originalObserver = this.originalObserver = observer; 
     76          observer = function(event) { 
     77            var rel = event.relatedTarget, cur = event.currentTarget; 
     78            if (rel && rel !== cur && !rel.descendantOf(cur)) 
     79              return originalObserver(event);  
     80          }; 
     81      } 
    6982      this.type = type; 
    7083      this.observer = observer; 
     
    224237    stopObserving: function(element, type, observer, useCapture) { 
    225238      if (applyToCollection(arguments)) return; 
     239      if (!Prototype.Browser.IE && (type == 'mouseenter' || type == 'mouseleave')) { 
     240        type = type == 'mouseenter' ? 'mouseover' : 'mouseout'; 
     241        var cachedObserver = $H(element._observers[type]).find(function(obs) { 
     242          return obs.value.originalObserver === observer; 
     243        }); 
     244        if(cachedObserver) observer = cachedObserver.observer; 
     245      } 
    226246      new Observer(element, type, observer, useCapture).remove(); 
    227247    }, 
  • spinoffs/prototype/branches/event/test/functional/event.html

    r6629 r6999  
    55  <title>Prototype functional test file</title> 
    66  <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
    7  
    8   <!-- I hate doing "rake dist" while testing --> 
    9   <script type="text/javascript"> 
    10     var Prototype = { 
    11     Version: 'inline', 
    12      
    13     Browser: { 
    14       IE:     !!(window.attachEvent && !window.opera), 
    15       Opera:  !!window.opera, 
    16       WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, 
    17       Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1 
    18     }, 
    19     BrowserFeatures: { 
    20       XPath: !!document.evaluate, 
    21       ElementExtensions: !!window.HTMLElement, 
    22       SpecificElementExtensions:  
    23         (document.createElement('div').__proto__ !==  
    24          document.createElement('form').__proto__) 
    25     }, 
    26      
    27     ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 
    28     emptyFunction: function() {}, 
    29     K: function(x) { return x } 
    30   } 
    31   </script> 
    32   <script src="../../src/base.js"       type="text/javascript"></script> 
    33   <script src="../../src/string.js"     type="text/javascript"></script> 
    34   <script src="../../src/enumerable.js" type="text/javascript"></script> 
    35   <script src="../../src/array.js"      type="text/javascript"></script> 
    36   <script src="../../src/hash.js"       type="text/javascript"></script> 
    37   <script src="../../src/range.js"      type="text/javascript"></script> 
    38   <script src="../../src/ajax.js"       type="text/javascript"></script> 
    39   <script src="../../src/dom.js"        type="text/javascript"></script> 
    40   <script src="../../src/selector.js"   type="text/javascript"></script> 
    41   <script src="../../src/form.js"       type="text/javascript"></script> 
    42   <script src="../../src/event.js"      type="text/javascript"></script> 
    43   <script src="../../src/position.js"   type="text/javascript"></script> 
    44   <script type="text/javascript"> Element.addMethods(); </script> 
     7  <script src="../../dist/prototype.js"       type="text/javascript"></script> 
    458   
    469  <style type="text/css" media="screen"> 
     
    9053<body> 
    9154  <h1>Prototype functional tests for the Event module</h1> 
    92   <h2><em>Killer feat:</em> with this page <a href="#" 
    93     onclick='alert("It&apos;s true! Don&apos;t you hate doing that too?\n\nJust edit src files and fire away!"); return false'> 
    94     you don't have to "rake dist"</a></h2> 
    9555   
    9656  <div id="log">log empty</div>