Ruby's Louvre

每天学习一点点算法

导航

我的事件系统的例子

最普通的mousemove支持:

<!doctype html>
<html lang="zh-ch">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>
    <title>我的事件系统 by 司徒正美</title>

    <%= javascript_include_tag "dom.1.0.1.js"  %>

    <script type="text/javascript">

      dom.ready(function(){
        dom("#outer").mousemove(function(e) {
          dom(this).html(e.pageX+"  "+e.pageY)
        });
        dom("h1").click(function(e) {
          alert(e.type+e.target.innerHTML)
        });
      });
      /*
   说到anti pattern,我最喜欢这几条:
    * 引擎室里的船长(Captain in the engine room):团队带头人把时间和精力全花在技术问题上,没有人开船
    * 死亡征途(Death march):除了CEO,每个人都知道这个项目会完蛋。但是真相却被隐瞒下来,直到大限来临
    * 海鸥管理(Seagull management):飞进来,弄得鸡飞狗跳、一片儿狼藉,然后就拍拍屁股走人
    * 大泥球(Big ball of mud):系统的结构不清晰

    一头宅熊、开源支持者、P2P拥护者;
    Google粉,FF粉,桂林米粉;FQ运动爱好者,以及アナキズム;马勒戈壁驻华事处干事;最近添加眼镜属性(据说原因是很萌)。
    “做成一件事里面有偶然的因素也有必然的因素,我们所要做的就是提取这些必然的因素,增加我们以后成功的概率。 ”

    var ns = { xhtml: "http://www.w3.org/1999/xhtml" },
    prefix = (document.documentElement.namespaceURI === ns.xhtml)? "xhtml:" : ""
    */
    </script>
    <style title="text/css">
      #outer {
        width:150px;
        height:150px;
        background:red;
        padding:20px;
      }
      #inner {
        width:100px;
        height:100px;
        background:green;
      }

    </style>

  </head>
  <body>
    <h1>司徒正美:mousemove事件 </h1>
    <div id="outer">
      <div id="inner"></div>

    </div>

</html>

实现在标准浏览器下fire mouseenter

<!doctype html>
<html lang="zh-ch">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>
    <title>我的事件系统 by 司徒正美</title>
    <%= javascript_include_tag "dom.1.0.1.js"  %>

    <script type="text/javascript">

      dom.ready(function(){
        dom("#inner").mouseenter(function(e){
          alert(e.type+"这是mouseenter")
        });
        dom("#inner").mouseover(function(e){
          alert(e.type+"这是mouseover")
        });
        dom("#inner").fire("mouseenter");


      });
    </script>
    <style title="text/css">
      #outer {
        width:150px;
        height:150px;
        background:red;
        padding:20px;
      }
      #inner {
        width:100px;
        height:100px;
        background:green;
      }

    </style>

  </head>
  <body>
    <h1>司徒正美:实现在标准浏览器下fire mouseenter </h1>
    <div id="outer">
      <div id="inner"></div>

    </div>
    
</html>

实现在标准浏览器下unbind mouseenter

<!doctype html>
<html lang="zh-ch">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>
    <title>我的事件系统 by 司徒正美</title>
    <%= javascript_include_tag "dom.1.0.1.js"  %>

    <script type="text/javascript">

      dom.ready(function(){
        dom("#inner").mouseenter(function(e){
          alert(e.type+"这是mouseenter")
        });
        dom("#inner").mouseover(function(e){
          alert(e.type+"这是mouseover")
        });
        dom("#inner").unbind("mouseenter");

      });
    </script>
    <style title="text/css">
      #outer {
        width:150px;
        height:150px;
        background:red;
        padding:20px;
      }
      #inner {
        width:100px;
        height:100px;
        background:green;
      }

    </style>

  </head>
  <body>
    <h1>司徒正美:实现在标准浏览器下unbind mouseenter</h1>
    <div id="outer">
      <div id="inner"></div>

    </div>
    
</html>

主要处理代码:

                    //选取可用的处理体(安装器,卸载器,包装器)
                    special = dom.events.special[ type ] || {};
                    //选取可用的事件类型,如mouseenter在标准浏览器下就不能用,需要用mouseover冒充
                    origType = type;
                    type = special.mirror || type;
                    if ( !events[ type ] ) continue//如果不为数组跳过
                    //如果没有指定handler,则移除所有的,直接赋为[]
                    //如果没有指定handler并且使用冒充事件,则通过origType !== handleObj.type排除
                    //如果指定handler,则通过handler.uuid !== handleObj.uuid排除
                    events[type] = handler ? events[type].filter(function(h) {
                        return  handler.uuid !== h.uuid
                    }) : (origType !== type) ? events[type].filter(function(h) {
                        return  origType !== h.type
                    }) : [];

实现fire unbind 自定义事件,并在文档树中冒泡或阻止冒泡。

<!doctype html>
<html lang="zh-ch">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>
    <title>我的事件系统 by 司徒正美</title>

    <%= javascript_include_tag "dom.1.0.1.js"  %>

    <script type="text/javascript">
      dom.ready(function(){
        dom("#inner").bind("myEvent.a",function(e,message1,message2) {
          // e.stopPropagation();
          alert(message1 + ' inner1 ' + message2);
        });
        dom("#inner").bind("myEvent.a",function(e,message1,message2) {
          alert(message1 + ' inner2 ' + message2);
        });
        dom("#outer").bind("myEvent.a",function(e,message1,message2) {
          alert(message1 + ' outer ' + message2);
        });
        //    dom("#inner").unbind("myEvent.a");
        dom("#inner").fire("myEvent.a","hello","world");
        //   dom("#outer").fire("myEvent.a","hello","world");

      });
    </script>
    <style title="text/css">
      #outer {
        width:150px;
        height:150px;
        background:red;
        padding:20px;
      }
      #inner {
        width:100px;
        height:100px;
        background:green;
      }

    </style>

  </head>
  <body>
    <h1>司徒正美:实现fire unbind 自定义事件,并在文档树中冒泡或阻止冒泡 </h1>
    <div id="outer">
      <div id="inner"></div>

    </div>

</html>

主要处理代码:

                    if ( type.indexOf(".") !== -1 ) {
                        type = type.split(".").shift();
                    }
                    event = dom.Event(type);
                    args = [event].concat(args);
                    //判定对应的回调函数列队是否存在
                    if(!(dom.store(obj, "events") || {})[ event.type ]) return
                    while(!event.isPropagationStopped() && obj){
                        dom.events.handle.apply( obj,args);
                        obj = obj.parentNode || (obj != window) && window
                    }

实现fire unbind mousewheel。

<!doctype html>
<html lang="zh-ch">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>
    <title>mousewheel的事件分派 by 司徒正美</title>

    <%= javascript_include_tag "dom.1.0.1.js"  %>

    <script type="text/javascript">

      dom.ready(function(){

        var counterDelta = 0;
        dom(document).mousewheel(function(e){
          
          counterDelta += e.wheelDelta
          dom("#wheelDelta").html(counterDelta+ (e.wheelDelta > 0? " up":" down"))
        });
        // dom(document).unbind("mousewheel")
        //  dom(document).fire("mousewheel")
      });


    </script>
    <style title="text/css">

    </style>

  </head>
  <body>
    <h1>司徒正美:mousewheel事件 </h1>
    <div id="wheelDelta">滚轮事件</div>

  </body>
</html>

主要处理代码:

        if(!eventSupported("mousewheel")){
            dom.events.special.mousewheel = {
                mirror:"DOMMouseScroll"
            }
        }

实现事件代理与反代理。

<!doctype html>
<html lang="zh-ch">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>
    <title>实现事件代理与反代理 by 司徒正美</title>
    <%= javascript_include_tag "dom.1.0.1.js"  %>

    <script type="text/javascript">

      dom.ready(function(){
        var a = function(e){
          e.stopImmediatePropagation();
          alert("111"+e.target+e.type)
        }
        dom("input,select,textarea").delegate("change",a);
        dom("input,select,textarea").delegate("change",function(e){
          alert("222"+e.type)
        });
        //  dom("input,select,textarea").undelegate("change",a);
      });
    
  
    </script>

  </head>
  <body>
    <h1>司徒正美:实现事件代理与反代理</h1>
    <form action="">
      <fieldset><legend>实验2</legend>
        <select name="sweets" multiple="multiple" id="bbb" >
          <option>Chocolate</option>
          <option selected="selected">Candy</option>
          <option>Taffy</option>
          <option selected="selected">Caramel</option>
          <option>Fudge</option>
          <option>Cookie</option>
        </select><br>
        <input type="file"/><br/>
        <input type="radio" name="r" >
        <input type="radio" name="r" >
        <input type="radio" name="r" ><br>
        <input type="checkbox" name="ddd" >
        <input type="checkbox" name="ddd" ><br>
        <input value="文本域" id="eee" ><br>
        <textarea>文本区</textarea>
      </fieldset>
    </form>
  </body>
</html>
<!doctype html>
<html lang="zh-ch">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>
    <title>mousewheel的事件分派 by 司徒正美</title>

    <%= javascript_include_tag "dom.1.0.1.js"  %>
    <%= javascript_include_tag "jQuery1.42.js"  %>
    <script type="text/javascript">

      dom.ready(function(){

        dom("h1").delegate("click",function(e){
          alert(e.currentTarget)
          alert(e.target)
        });

        dom("h2").click(function(e){
          alert(e.currentTarget)
          alert(e.target)
        });
        dom("#outer").delegate("mousemove",function(e) {
          dom(this).html(e.pageX+"  "+e.pageY)
        });
        dom("#focus").delegate("focus",function(e) {
          alert(e.target.innerHTML)
        });
        //   dom("#focus").undelegate("focus")
        // dom("#outer").undelegate("mousemove")
        // $(document).delegate("#outer", "mousemove", function(e){
        //   $(this).html(e.pageX+"  "+e.pageY)
        // });
      });


    </script>
    <style type="text/css">
      #outer {
        width:150px;
        height:150px;
        background:red;
        padding:20px;
      }
      #inner {
        width:100px;
        height:100px;
        background:green;
      }
      #focus {
        width:400px;
        height:50px;
        background:pink;
      }
    </style>



  </head>
  <body>
    <h1>司徒正美:事件代理 </h1>
    <h2>司徒正美:事件绑定 </h2>
    <div id="outer">
      <div id="inner"></div>

    </div>
    <div id="focus">获得焦点</div>
  </body>
</html>

posted on 2010-04-30 01:19  司徒正美  阅读(564)  评论(0编辑  收藏  举报