• HTML5事件


    • Html5事件
    1. contextmenu事件

    用以表示何时应该显示上下文菜单,以便开发人员取消默认的上下文菜单而提供自定义的菜单。

    由于此事件时冒泡的,因此可以为document指定一个事件处理程序,用以处理页面中发生的所有此类事件。这个事件的目标是发生用户操作的元素,在浏览器中都可以取消这个事件在兼容DOM的浏览器中,使用event.preventDefaluet()。在ie中,将event.returnValue的值设置为false,因为contextmenu事件属于鼠标事件,所以其事件对象中包含与光标位置有关的所有事项,通常使用contextmenu事件来显示自定义的上下文菜单,而使用onclick事件处理程序来隐藏该菜单。例如:

    <!DOCTYPE html>
    
    <html>
    
    <head>
    
    <body>
    
       <div id=”myDiv”>Right click or Ctrl+click me to get a custom context menu.
    
           Click anywhere else to get the default context menu.</div>
    
       <ul id=”myMenu” style=”position:absolute;visibility:hidden;background-color:silver”>
    
          <li><a href=”http://www.nczonline.net”>Nicholas’ site</a></li>
    
          <li><a href=”http://www.wrox.com”>Wrox site</a></li>
    
          <li><a href=”http://www.yahoo.com”>Yahoo!</a></li>
    
       </ul>
    
    </body>
    
    </html>

    这里的div元素包含一个自定义的上下文菜单,其中ul元素作为自定义上下文菜单,并且在初始化时隐藏的,js代码如下:

    EventUtil.addHandler(window,”load”,function(event){
    
         var div=document.getElementById(“myDiv”);
    
         EventUtil.addHandler(div,”contextmenu”,function(event){
    
              Event=EventUtil.getEvent(event);
    
              EventUtil.preventDefault(event);
    
              var menu=document.getElementById(“myMenu”);
    
              menu.style.left=event.clientX+”px”;
    
              menu.style.top=event.clientY+”px”;
    
              menu.style.visibility=”visible”;
    
    });
    
    EventUtil.addHandler(document,”click”,function(event){
    
       Document.getElementById(“myMenu”).style.visibility=”hidden”;
    
    })
    
    });

          2. beforeunload事件

    之所以有发生在window对象上的beforeunload事件,是为了让开发人员有可能在页面卸载前阻止这一操作。这个事件会在浏览器卸载之前触发,可以通过它来取消卸载并继续使用原有页面。

          3. DOMContentLoaded事件

    window的load事件会在页面中的一切都加载完毕时触发,但这个过程可能会因为要加载的外部资源过多而费时间,而DOMContentLoaded事件则在形成完整的DOM树之后就会触发,不理会图像、JavaScript文件、css文件或其他资源是否已经下载完毕,与load事件不同。

    对于不支持DOMContentLoaded的浏览器,我们建议在页面加载期间设置一个时间为0毫秒的定时器,如:

    setTimeout(function(){
    
       //在此添加事件处理程序
    
    },0);

    这段代码的实际意思就是:“在当前JavaScript处理完成后立即运行这个函数”,在页面下载和构建期间,只有一个JavaScript处理过程,因此定时器会在该过程结束时立即触发,至于这个事件与DOMContentLoaded被触发的时间能否同步,主要还是取决于用户使用的浏览器和页面中的其他代码,为了确保这个方法有效,必须将其作为页面中的第一个超时调用;即便如此,也还是无法保证在所有环境中该超时调用一定会遭遇load事件被触发。

         4. readystatechange事件

    IE为DOM文档中的某些部分提供了readystatechange事件,这个事件的目的是提供与文档或元素的加载状态有关的信息,但这个事件的行为有时候也是很难预料,支持readystatechange事件的每个对象都有一个readyState属性。

         uninitialized(未初始化):对象存在但未初始化。

         loading(正在加载):对象正在加载数据。

         loaded(加载完毕):对象加载数据完成。

         interactive(交互):可以操作对象了,但还没有完全加载。

         complete(完成):对象已经加载完毕。

    这些状态看起来很直观,但并非所有对象都会经历readyState的这几个阶段,如果某个阶段不适用某个对象,则该对象完全可能跳过该阶段,并没有规定哪个阶段适用哪个对象,显然,这意味着readystatechange事件经常会少于4次,而readyState属性的值也不总是连续的。

    对应document而言,值为“interactive”的readyState会在于DOMContentLoaded大致相同的时刻触发readystatechange事件,此时,DOM树已经加载完毕,可以安全地操作它,因此就会进入交互阶段。但与此同时,图像及其他外部文件不一定可用。下面来看一段处理readystatechange事件的代码。

    EventUtil.addHandler(document,”readystatechange”,function(event){
    
         If(document.readyState==”interactive”){
    
           alert(“Content loaded”);
    
    }
    
    })

          5. pageshow和pagehide事件

    Firefox和Opera有一个特性,名叫“往返缓存”,可以在用户使用浏览器的“后退”和“前进”按钮时加快页面的转换速度,这个缓存中不仅保存着页面的数据,还保存了DOM和JavaScript的状态;实际上是将整个页面都保存在了内存里,如果页面位于bfcache中,那么再次打开该页面时不会触发load事件,尽管由于内存中保存了整个页面的状态,不触发load事件也不应该会导致失明问题。

    第一个事件是pageshow,这个事件在页面显示时触发,无论该页面是否来着bfcache,在重新加载的页面中,pageshow会在load事件触发后触发,而对于bfcache中的页面,pageshow会在页面状态完全恢复的那一刻触发。看下面例子:

    (function(){
    
       var showCount=0;
    
       EventUtil.addHandler(window,”load”,function(){
    
       alert(“Load fired”);
    
    });
    
    EventUtil.addHandler(window,”pageshow”,function(){
    
      showCount++;
    
      alert(“Show has been fired ”+showCount+”times.”)
    
    })
    
    })();

    除了通常的属性之外,pageshow事件的event对象还包含一个名为persisted的布尔值属性。如果页面被保存在了bfcache中,则这个属性的值为true;否则,这个属性的值为false,可以像下面这样在事件处理程序中检测这个属性。

    (function(){
    
       var showCount=0;
    
       EventUtil.addHandler(window,”load”,function(){
    
       alert(“Load fired”);
    
    });
    
    EventUtil.addHandler(window,”pageshow”,function(){
    
      showCount++;
    
      alert(“Show has been fired ”+showCount+” time. Persisted? ”+event.persisted);
    
    });
    
    })();

    通过检测persisted属性,就可以根据页面在bfcache中的状态来确定是否需要采取其他操作。

    与pageshow事件对应的是pagehide事件,该事件会在浏览器卸载页面的时候触发,而且是在unload事件之前触发,与pageshow事件一样,pagehide在document上触发,但其事件处理程序必须要添加到window对象。这个事件的wvent对象也包含persisted属性,不过其用途稍有不同,例如:

    EventUtil.addHandler(window.”pagehide”,function(event){
    
       alert(“Hiding. Persisted?”+event.persisted);
    
    });

    有时候,可能需要在pagehide事件触发时根据persisted的值采取不同的操作,对应pageshow事件,如果页面是从bfcache中加载的,那么persisted的值就是true;对于pagehide事件,如果页面在卸载之后会被保存在bfcache中,那么persisted的值也会被设置为true,因此,当一次触发pageshow时,persisted的值一定是false,而在第一次触发pagehide时,persisted就会变成true。

    1. hashchange事件

    HTML5新增了haschange事件,以便在URL的参数列表(及URL中“#”号后面的所有字符串)发生变化时通知开发人员,之所以新增这个事件,是因为在ajax应用中,开发人员经常要利用URL参数列来保存状态或导航信息。

    必须要把hashchange事件处理程序添加给window对象,然后URL参数列表只要变化就会调用它,此时的event对象应该额外包含两个属性:oldURL和newURL,这两个属性分别保存着参数列表变化前后的完整URL。例如:

    EventUtil.addHandler(window,”hashchange”,function(event){
    
      alert(“Old URL:”+event.oldURL+”
    New URL:”+event.newURL);
    
    });
    
     

    支持haschange事件的浏览器有ie8+、firefox3.6+、safari5+、chrome和opera10.6+。在这些浏览器中,只有Firefox 6+、Chrome和Opera支持oldURL和newURL属性,为此最后是使用location对象确定当前参数列表。

    EventUtil.addHandler(window,”hashchange”,function(event){
    
       alert(“Current hash:”+loacation.hash);
    
    });

    使用以下代码可以检测浏览器是否支持haschange事件:

    var isSupported=(“onhashchange” in window);

    如果IE8是在IE7文档模式下运行,即使功能无效它也会返回true,为解决这个问题,可以使用一下这个更稳妥的检测方式:

    var isSupported=(“onhashchange” in window)&&(document.documentMode===undefined||document.documentMode>7);
  • 相关阅读:
    actionscript3.0 图片裁剪及保存jpg详解
    AS3 JPEG Encoder应用:从Flash中保存图片
    Kata 架构
    docker 学习笔记
    processon
    学习容器技术的思考
    cp -f 还是提示是否覆盖
    CentOS下安装桌面环境
    [PYTHON 实作] 算100
    <转>CentOS 7 安装配置 NFS
  • 原文地址:https://www.cnblogs.com/hetaojs/p/6737418.html
Copyright © 2020-2023  润新知