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

Changeset 7042

Show
Ignore:
Timestamp:
06/17/07 02:25:20 (1 year ago)
Author:
andrew
Message:

* Added functional tests for mouseenter and mouseleave.
* Ensure mouseenter and mouseleave fire in the proper scope.
* Various formatting nitpicks.

Files:

Legend:

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

    r7032 r7042  
    2727    switch(event.type) { 
    2828      case 'mouseover': element = event.fromElement; break; 
    29       case 'mouseout':  element = event.toElement; break; 
     29      case 'mouseout':  element = event.toElement;   break; 
    3030      default: return null; 
    3131    } 
     
    7373          if (B.IE || B.WebKit) this._type = 'keydown'; 
    7474          break; 
    75         case 'mouseenter': 
    76         case 'mouseleave': 
     75        case 'mouseenter': case 'mouseleave': 
    7776          if (B.IE) break; 
    7877          this._type = type == 'mouseenter' ? 'mouseover' : 'mouseout'; 
    7978          this._callback = function(event) { 
    8079            var rel = event.relatedTarget, cur = event.currentTarget; 
    81             rel = rel.nodeType == Node.TEXT_NODE ? rel.parentNode : rel; 
     80            rel = (rel.nodeType == Node.TEXT_NODE) ? rel.parentNode : rel; 
    8281            if (rel && rel !== cur && !rel.descendantOf(cur)) 
    83               return callback(event);  
     82              return callback.call(this, event);  
    8483          }; 
    8584      } 
    8685    }, 
     86     
    8787    add: function() { 
    8888      if (this.type == 'DOMContentLoaded' && this.element == document) { 
    89         Event.onReady(this.callback); 
    90         return; 
     89        Event.onReady(this.callback); return; 
    9190      } 
    9291      this._add(); 
    9392      this.cache(); 
    9493    }, 
     94     
    9595    cache: function() { 
    9696      if (!this.element._observers) this.element._observers = {}; 
    97       var local = this.element._observers[this.type]; 
    98       if (!local) local = this.element._observers[this.type] = {}; 
     97      if (!this.element._observers[this.type]) 
     98      this.element._observers[this.type] = {}; 
    9999      if (!this.callback.$$guid) this.callback.$$guid = Observer.guid++; 
    100       local[this.callback.$$guid] = this; 
    101     }, 
     100      this.element._observers[this.type][this.callback.$$guid] = this; 
     101    }, 
     102     
    102103    remove: function() { 
    103104      this._remove(); 
     
    108109  // mouse button detection is terribly inconsistent 
    109110  if (B.IE) { 
    110     var buttonTranslations = { 0:1, 1:4, 2:2 }; 
    111111    var isButton = function(event, code) { 
    112       return event.button == buttonTranslations[code]; 
    113     }; 
    114   } 
    115   else if (B.WebKit) { 
     112      return event.button == ({ 0:1, 1:4, 2:2 })[code]; 
     113    }; 
     114  } else if (B.WebKit) { 
    116115    var isButton = function(event, code) { 
    117116      switch (code) { 
     
    121120      } 
    122121    }; 
     122  } else { 
     123    var isButton = function(event, code) { 
     124      return event.which ? (event.which === code + 1) : (event.button === code); 
     125    }; 
    123126  } 
    124   else var isButton = function(event, code) { 
    125     return event.which ? event.which === code+1 : event.button === code; 
    126   }; 
    127127 
    128128  Object.extend(Event.Methods, { 
     
    148148     
    149149    Event.prototype = Event.prototype || document.createEvent("UIEvents").__proto__; 
    150     Object.extend(Event.prototype, instanceMethods); 
    151      
     150    Object.extend(Event.prototype, instanceMethods);     
    152151  } else if (B.IE) { 
    153152    Object.extend(Observer.prototype, { 
     
    160159      }, 
    161160      _remove: function() { 
    162         if (!this.wrapper) this.wrapper = this.element._observers[this.type][this.callback.$$guid].wrapper; 
     161        if (!this.wrapper)  
     162          this.wrapper = this.element._observers[this.type][this.callback.$$guid].wrapper; 
    163163        this.element.detachEvent('on' + this._type, this.wrapper); 
    164164      } 
     
    196196 
    197197  // applies the calling method to an array of elements 
    198   function applyToCollection(args) { 
     198  var applyToCollection = function(args) { 
    199199    if (args[0].constructor != Array) return false; 
    200200    var method = args.callee; 
     
    205205 
    206206  // onReady helper stuff 
    207   var readyCallbacks, timer, domReady = function() { 
     207  var readyCallbacks, timer; 
     208  var domReady = function() { 
    208209    if (arguments.callee.done) return; 
    209210    arguments.callee.done = true; 
    210211    if (timer) clearInterval(timer); 
    211212     
    212     readyCallbacks.each(function(f) { f() }); 
     213    readyCallbacks.each(function(f) { f(); }); 
    213214    readyCallbacks = null; 
    214215  }; 
     
    244245    }, 
    245246     
    246     // based on work by Dan Webb, Matthias Miller, Dean Edwards and John Resig 
     247    // based on work by Dan Webb, Matthias Miller, Dean Edwards, and John Resig 
    247248    onReady: function(f) { 
    248249      if (!readyCallbacks) { 
     250        // call the handler immediately if domReady has already occurred 
    249251        if (domReady.done) return f(); 
    250252         
  • spinoffs/prototype/branches/event/test/functional/event.html

    r7032 r7042  
    3030        el = $(el); 
    3131        el.className = 'passed'; 
    32         el.update(message || 'Test passed!'); 
     32        (el.down('span') || el).update(message || 'Test passed!'); 
    3333      }, 
    3434       
     
    3636        el = $(el); 
    3737        el.className = 'failed'; 
    38         el.update(message || 'Test failed'); 
     38        (el.down('span') || el).update(message || 'Test failed'); 
    3939      } 
    4040    }); 
     
    6161  <script type="text/javascript"> 
    6262    var basic_callback = function(e){ 
    63       $('basic').passed() 
     63      $('basic').passed(); 
    6464      if ($('basic_remove')) $('basic_remove').show() 
    6565      else $('basic').failed() 
    66       log(e) 
     66      log(e); 
    6767    } 
    6868    $('basic').observe('click', basic_callback) 
     
    7272      el.stopObserving('click') 
    7373      $('basic_remove').remove() 
    74       log(e) 
     74      log(e); 
    7575    }).hide() 
    7676  </script> 
     
    7979   
    8080  <script type="text/javascript"> 
    81     $('basic2').observe('click', function(e)
    82       if(this === window) $('basic2').failed('Window scope! (needs scope correction)') 
    83       else this.passed() 
    84       log(e) 
    85     }) 
     81    $('basic2').observe('click', function(e)
     82      if(this === window) $('basic2').failed('Window scope! (needs scope correction)'); 
     83      else this.passed(); 
     84      log(e); 
     85    }); 
    8686  </script> 
    8787   
     
    8989   
    9090  <script type="text/javascript"> 
    91     $('basic3').observe('click', function(evt)
    92       el = $('basic3') 
    93       if(typeof evt != 'object') this.failed('Expected event object for first argument') 
    94       else this.passed('Good first argument') 
    95       log(evt) 
    96     }) 
     91    $('basic3').observe('click', function(evt)
     92      el = $('basic3'); 
     93      if (typeof evt != 'object') this.failed('Expected event object for first argument'); 
     94      else this.passed('Good first argument'); 
     95      log(evt); 
     96    }); 
    9797  </script> 
    9898   
     
    101101  <script type="text/javascript"> 
    102102    $('hijack').observe('click', function(e){ 
    103       el = $(this.parentNode) 
    104       e.preventDefault() 
    105       // log(e) // this makes it fail?!? 
     103      el = $(this.parentNode); 
     104      log(e); // this makes it fail?!? 
     105      e.preventDefault(); 
    106106 
    107107      setTimeout(function() { 
    108108        if (window.location.hash == '#wrong') el.failed('Hijack failed (<a href="' + 
    109109            window.location.toString().replace(/#.+$/, '') + '">remove the fragment</a>)') 
    110         else el.passed() 
     110        else el.passed(); 
    111111      }, 50) 
    112112    }) 
     
    115115  <hr /> 
    116116   
     117  <p id="mouseenter"><span>mouseenter test: mouse over empty space, then over text</span></p> 
     118   
     119  <script type="text/javascript" charset="utf-8"> 
     120    $('mouseenter').observe('mouseenter', function(e) { 
     121      if (e.target == $('mouseenter')) this.passed(); 
     122      else this.failed(); 
     123      log(e); 
     124    }); 
     125  </script> 
     126   
     127  <p id="mouseleave"><span>mouseleave test: move over text, then over empty space</span></p> 
     128   
     129  <script type="text/javascript" charset="utf-8"> 
     130    $('mouseleave').observe('mouseleave', function(e) { 
     131      if (e.target == $('mouseleave')) this.passed(); 
     132      else this.failed(); 
     133      log(e); 
     134    }); 
     135  </script> 
     136     
    117137  <p id="target">Event.element() test</p> 
    118138   
    119139  <script type="text/javascript"> 
    120     $('target').observe('click', function(e)
    121       if(e.element() == this && e.target == this) this.passed() 
    122       else this.failed() 
    123       log(e) 
    124     }) 
     140    $('target').observe('click', function(e)
     141      if (e.element() == this && e.target == this) this.passed(); 
     142      else this.failed(); 
     143      log(e); 
     144    }); 
    125145  </script> 
    126146 
     
    129149  <script type="text/javascript"> 
    130150    $('currentTarget').observe('click', function(e){ 
    131       if(e.currentTarget !== this) this.failed() 
    132       else this.passed() 
    133       log(e) 
     151      if(e.currentTarget !== this) this.failed(); 
     152      else this.passed(); 
     153      log(e); 
    134154    }) 
    135155  </script> 
     
    140160    $('findElement').observe('click', function(e){ 
    141161      if(e.findElement('p') == this && e.findElement('body') == document.body && 
    142          e.findElement('foo') == null) this.passed() 
    143       else this.failed() 
    144       log(e) 
     162         e.findElement('foo') == null) this.passed(); 
     163      else this.failed(); 
     164      log(e); 
    145165    }) 
    146166  </script> 
     
    152172    Event.observe($('left', 'middle', 'right'), 'mousedown', function(e){ 
    153173      if (Event['is' + this.id.capitalize() + 'Click'](e)) this.passed('Squeak!') 
    154       else this.failed('OH NO!') 
    155       log(e) 
     174      else this.failed('OH NO!'); 
     175      log(e); 
    156176    }) 
    157177  </script> 
     
    161181  <script type="text/javascript"> 
    162182    $('context').observe('contextmenu', function(e){ 
    163       this.passed() 
    164       Event.stop(e) 
    165       log(e) 
     183      this.passed(); 
     184      Event.stop(e); 
     185      log(e); 
    166186    }) 
    167187  </script> 
     
    171191  <script type="text/javascript"> 
    172192    $('stop').observe('click', function(e){ 
    173       e.stop() 
    174       this.passed() 
    175       log(e) 
     193      e.stop(); 
     194      this.passed(); 
     195      log(e); 
    176196    }) 
    177197    $('container').observe('click', function(e){ 
    178       $('stop').failed() 
    179       log(e) 
     198      $('stop').failed(); 
     199      log(e); 
    180200    }) 
    181201  </script> 
     
    185205  <script type="text/javascript"> 
    186206    $('capture1').observe('click', function(e){ 
    187       $('capture2').failed('Event capture failed') 
    188       log(e) 
     207      $('capture2').failed('Event capture failed'); 
     208      log(e); 
    189209    }, true) 
    190210    $('capture2').observe('click', function(e){ 
    191211      el = $('capture2') 
    192       if (el.className) el.passed() 
    193       else el.failed('Event capture failed') 
    194       log(e) 
     212      if (el.className) el.passed(); 
     213      else el.failed('Event capture failed'); 
     214      log(e); 
    195215    }) 
    196216  </script> 
     
    203223  <script type="text/javascript"> 
    204224    $('keyup').observe('keyup', function(e){ 
    205       el = $('keyup_log') 
    206       el.passed('Key captured: the length is ' + $('keyup').value.length) 
    207       log(e) 
     225      el = $('keyup_log'); 
     226      el.passed('Key captured: the length is ' + $('keyup').value.length); 
     227      log(e); 
    208228    }) 
    209229  </script> 
     
    219239      var list = item.parentNode 
    220240      $(item).remove() // wow, this stops propagation (except in Opera) 
    221       if(!list.childNodes.length) $('each').passed() 
     241      if(!list.childNodes.length) $('each').passed(); 
    222242      Event.stop(e) // for Opera :) 
    223       log(e) 
     243      log(e); 
    224244    }) 
    225245    $('list').observe('click', function(e){ 
    226246      $('each').failed() 
    227       log(e) 
     247      log(e); 
    228248    }) 
    229249  </script> 
     
    239259      e.stopPropagation() 
    240260      $('each2').failed() 
    241       log(e) 
     261      log(e); 
    242262    }) 
    243263    Event.stopObserving($A($('list2').childNodes)) 
    244264    $('list2').observe('click', function(e){ 
    245       $('each2').passed() 
    246       log(e) 
     265      $('each2').passed(); 
     266      log(e); 
    247267    }) 
    248268  </script> 
     
    259279        if (str != 'foo') throw 'wrong string: ' + str 
    260280        if (arr.constructor != Array) throw '3rd parameter is not an array' 
    261         el.passed() 
     281        el.passed(); 
    262282      } 
    263283      catch (err) { el.failed(err.toString()) } 
    264       log(e) 
     284      log(e); 
    265285    }.bindAsEventListener(document.body, 'foo', [1,2,3])) 
    266286  </script> 
     
    273293      try { el.passed(Object.inspect(e)) } 
    274294      catch (err) { el.failed('Failed! Error thrown') } 
    275       log(e) 
     295      log(e); 
    276296    }) 
    277297  </script> 
     
    288308      this.update('Registered two unload events, one inline ("onunload") and one regular - try to refresh, both should fire') 
    289309      this._done = true 
    290       log(e) 
    291     }) 
    292   </script> 
     310      log(e); 
     311    }) 
     312  </script> 
     313   
     314  <p id="custom_events">Custom events test</p> 
     315   
     316  <p id="custom_events_target">Lorem ipsum dolor sit amet.</p> 
     317   
     318  <script type="text/javascript"> 
     319    $('custom_events').observe('click', function(e) { 
     320      var c = $('custom_events_target'); 
     321      Event.Custom.observe(c, 'update', function(e) {  
     322        console.log(e.target); 
     323        alert('update event fired!'); 
     324         
     325        e.target.style.border = '1px solid #090'; 
     326      }); 
     327       
     328      setTimeout(function() { c.update('The quick brown fox.'); }, 1000); 
     329       
     330    }); 
     331  </script> 
     332   
    293333</body> 
    294334</html>