onmousemove を監視して。onmouseover だけのイベントにする! なんのこっちゃ!?

@IE = +@_jscript +(@_jscript_version<5.9) に、してみた。

initMouseEvent の一番最後の null の使い方が、結局判りませんでした。

<!DOCTYPE html>
<title></title>
<style type="text/css">
* { margin : 0; }
ul { padding: 0; list-style : none; }
li { padding: 0; border:1px red solid; }
</style>

<body>
<ul>
 <li>a
 <li>b
 <li>c
 <li>d
 <li>e
 <li>f
 <li>g
</ul>
 
<script type="text/javascript">
//@cc_on @set @IE = +@_jscript + ( @_jscript_version < 5.9 );

document./*@if( @IE == 1 ) attachEvent( 'on' + @else@*/ addEventListener( /*@end@*/
  'mousemove', (function( ) {
    var w = /*@if(@IE) 'clientWidth'  @else@*/ 'innerWidth' /*@end@*/;
    var h = /*@if(@IE) 'clientHeight' @else@*/ 'innerHeight' /*@end@*/;

    var mx = 0, my = 0, f = false, doc;
    
    var check = function ( ) {
      if( f ) {
        /*@if(@IE)
          doc.fireEvent( "onmouseover" );
        @else@*/
          var e = doc.createEvent( 'MouseEvents' );
          var win = doc.defaultView;
          e.initMouseEvent( "mouseover", true, true, win, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
          doc.dispatchEvent( e );
        /*@end@*/
      }
    };

    return function ( e ) {
      var n = e./*@if(@IE) srcElement @else@*/ target /*@end@*/;
      var c = ( doc = n.ownerDocument ) /*@if(@IE) [ doc.compatMode == 'CSS1Compat' ?
        'documentElement' : 'body' ] /*@else@*/ .defaultView /*@end@*/;

      var x = e.clientX, y = e.clientY;
      var ex = x + x - mx, ey = y + y - my;
      f = false;

      if( ex < 0 || ey < 0 || c[w] < ex || c[h] < ey ) {
        f = true;
        setTimeout( check, 60 );
      }
      mx = x, my = y;
    };
  })(), false);


document./*@if(@IE==1) attachEvent( 'on' + @else@*/ addEventListener( /*@end@*/
  'mouseover', (function ( ) {
    var m = null;
    return function( e ) {
      var n = e./*@if(@IE) srcElement @else@*/ target /*@end@*/;
      if( m ) m.style.backgroundColor ="#fff", m = null;
      if( 'LI' == n.nodeName ) {
        n.style.backgroundColor="#f00";
        m = n;
      }
    };
  })(), false);


</script>
</body>
</html>
  • 「遊び心」かぁ〜、最近余裕がないためか、盛り込めてないなぁ。

(年初めに1発書いたきり)