• 《JavaScript自定义事件》学习摘记


    事情的起因是想开发一个类似博客园标签收藏时打书签的功能,于是解析了博客园的相关页面和JS源码进行了一番研究和学习.

    过程漫漫与曲折,但收获不少.期间

    如在看到博客园弹tag书签窗口的html源码有一处标签 <div id="cover_block"></div> 时,搜索到了《JavaScript自定义事件》 这篇文章,冥冥之中有某些安排与联系。

      1 <body>
      2   <!-- 遮罩层 -->
      3   <div id="pageCover" class="pageCover"></div>
      4 
      5   <input type="button" value="Dialog Test" onclick="openDialog();" />
      6 
      7   <div id="dlgTest" class="dialog">
      8     <img class="close" alt="" src="images/close.png">
      9     <div class="title">Dialog</div>
     10     <div class="content">
     11     </div>
     12   </div>
     13 
     14   <script type="text/javascript">
     15     function EventTarget() {
     16       this.handlers = {};//保存所有的事件处理程序,目的是统一管理
     17     }
     18 
     19     EventTarget.prototype = {
     20       constructor: EventTarget,
     21       addHandler: function (type, handler) {
     22         if (typeof this.handlers[type] == 'undefined') { //read property 'close' 
     23           this.handlers[type] = new Array();
     24         }
     25         this.handlers[type].push(handler);//★学习点与语法:用字面量动态定义对象属性,而这里属性的类型是Array
     26       },
     27       removeHandler: function (type, handler) {
     28         if (this.handlers[type] instanceof Array) {
     29           var handlers = this.handlers[type];
     30           for (var i = 0, len = handlers.length; i < len; i++) {
     31             if (handler[i] == handler) {
     32               handlers.splice(i, 1);
     33               break;
     34             }
     35           }
     36         }
     37       },
     38       trigger: function (event) {
     39         if (!event.target) {
     40           event.target = this;//这里指代Dialog对象
     41         }
     42         if (this.handlers[event.type] instanceof Array) { //判断字面量属性是否存在,如close
     43           var handlers = this.handlers[event.type];
     44           for (var i = 0, len = handlers.length; i < len; i++) {
     45             //handlers[i]();这里2句代码效果一致
     46             handlers[i](event);//★学习点与语法,这里调用94行的方法
     47           }
     48         }
     49       }
     50     }
     51   </script>
     52 
     53   <script type="text/javascript">
     54     //工具方法用于继承
     55     function extend(subType, superType) {
     56       var prototype = Object(superType.prototype);
     57       prototype.constructor = subType;
     58       subType.prototype = prototype;
     59     }
     60   </script>
     61 
     62   <script type="text/javascript">
     63     function Dialog(id) {
     64       EventTarget.call(this) //效果是让子类拥有父类的原生属性,这里this指Dialog对象,当执行150行时,将自定义事件close注册给EventTarget的handlers属性
     65       this.id = id;          //换句话说,让EventTargert的属性放到this上,即this继承了EventTarget的属性
     66       var that = this;
     67       document.getElementById(id).children[0].onclick = function () { //绑定/注册关闭事件处理方法
     68         that.close();
     69       }
     70     }
     71 
     72     extend(Dialog, EventTarget);
     73 
     74     Dialog.prototype.show = function () {
     75       var dlg = document.getElementById(this.id);
     76       dlg.style.display = 'block';
     77       dlg = null;
     78     }
     79 
     80     Dialog.prototype.close = function () {
     81       var dlg = document.getElementById(this.id);
     82       dlg.style.display = 'none';
     83       dlg = null;
     84       this.trigger({ type: 'close' });
     85     }
     86   </script>
     87 
     88   <script type="text/javascript">
     89     //由页面标签直接绑定事件触发
     90     function openDialog() {
     91       var dlg = new Dialog('dlgTest');
     92 
     93       dlg.addHandler('close', function () {
     94         document.getElementById('pageCover').style.display = 'none';
     95       });
     96 
     97       document.getElementById('pageCover').style.display = 'block';
     98       dlg.show();
     99     }
    100   </script>
    101 </body>

    1.为Dialog关闭按钮注册事件67行
    2.设计自己的事件处理器,触发trigger的,同时传入自定义事件对象84行
    3.声明遮罩层pageCover关闭处理逻辑94行
    4.大量的JS面向对象编程的思想,如继承,64行,72行.

  • 相关阅读:
    【网易官方】极客战记(codecombat)攻略-森林-边地僵局backwoods-standoff
    【网易官方】极客战记(codecombat)攻略-森林-Else 之战elseweyr
    【网易官方】极客战记(codecombat)攻略-森林-森林劈斩者woodland-cleaver
    【网易官方】极客战记(codecombat)攻略-森林-食人魔营地-ogre-encampment
    Invalid bound statement (not found) 找不到mapper 映射文件异常
    No compiler is provided in this environment. --Maven build失败
    mysql 无法链接, 输入密码失败
    Failed to read artifact descriptor for org.apache.maven.plugins:maven-install-plugin-JavaWeb(四)
    mysql连接报java.math.BigInteger cannot be cast to java.lang.Long异常
    添加日志(配置spring)---Java_web
  • 原文地址:https://www.cnblogs.com/zhuji/p/14085967.html
Copyright © 2020-2023  润新知