当前位置: 首页 > news >正文

JavaScript 事件——“事件类型”中“HTML5事件”的注意要点

contextmenu事件

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

因为该事件属于鼠标事件,所以其事件对象中包含与光标位置有关的所有属性。如:

<body>
    <ul id="menu" >
        <li>item1</li>
        <li>item2</li>
        <li>item3</li>
    </ul>
    <script type="text/javascript">
    window.addEventListener("contextmenu", function () {
        event.preventDefault();
        var menu = document.getElementById("menu");
        menu.style.top = event.clientY + "px";
        menu.style.left = event.clientX + "px";
        menu.style.visibility = "visible";
    });
    window.addEventListener("click", function () {
        var menu = document.getElementById("menu");
        menu.style.visibility = "hidden";
    })
    </script>
</body>

chrome现在支持该事件,部分浏览器都支持。

beforeunload事件

该事件是为了让开发者有可能在页面卸载前阻止这一操作。event.returnValue设置的值是显示给用户的字符串(对于IE以及Firefox而言),同时作为函数的值返回(对safari和chrome而言),如:

window.addEventListener("beforeunload", function () {
    var message = "do you realy want to leave?";
    event.returnValue = message;
    return message;
}); //当离开时会显示信息和两个按钮;当刷新时也会提示;

DOMContentLoaded事件

该事件在形成完整的DOM树之后就会触发,不理会图像、js文件、css文件等其他资源下载完毕。

readystatechange事件

IE提供的事件,支持该事件的每个对象都有一个readyState属性,可能包含下列5个值中的一个:

  • uninitialized(未初始化):对象存在但尚未初始化;

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

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

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

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

并非每个对象都会经历这些阶段;值为interactive的readyState会在与DOMContentLoaded大致相同的时刻触发readystatechange事件。事件的event对象不会提供任何信息。

switch (document.readyState) {
    case "loading":
        // 正在加载
        console.log("loading");
    case "interactive":
        // 交互阶段 可以操作对象了
        var span = document.createElement("span");
        span.textContent = "A <span> element.";
        document.body.appendChild(span);
        console.log("The document has finished loading. We can now access the DOM elements.")
    case "complete":
        // 完成阶段 完全加载完毕了
        console.log("The first CSS rule is: " + document.styleSheets[0].cssRules[0].cssText);
        console.log("The page is fully loaded.")
        break;
}

如:

document.addEventListener("readystatechange", function () {
    if (document.readyState == "loading") {
        var newP = document.createElement("p");
        newP.appendChild(document.createTextNode("data1"));
        document.body.appendChild(newP);
    }
    if (document.readyState == "interactive") {
        var newP = document.createElement("p");
        newP.appendChild(document.createTextNode("data2"));
        document.body.appendChild(newP);
    }
});
//上述代码的第一段并没有在document.body下创建一个新的p,因为readyState为loading的时候并不能操作对象;

又如:

document.addEventListener("readystatechange", function () {
    if (document.readyState == "loading") {
        var newP = document.createElement("p");
        newP.appendChild(document.createTextNode("data1"));
        document.body.appendChild(newP);

        console.log(document.styleSheets[0].cssRules[0].cssText); //无效,因为loading的时候,对象没有加载完全加载完毕(complete)
    }
    if (document.readyState == "interactive") {
        var newP = document.createElement("p");
        newP.appendChild(document.createTextNode("data2"));
        document.body.appendChild(newP);

        console.log(document.styleSheets[0].cssRules[0].cssText); //可能有效,外部资源少的情况下完成阶段很可能在交互阶段之前出现;而在外部资源较多的情况下完成阶段很可能在交互阶段之后出现。
    }
    
});
//上述代码的第一段并没有在document.body下创建一个新的p,因为readyState为loading的时候并不能操作对象;

交互阶段可能早于或晚于完成阶段出现,无法确保顺序。在包含较多外部资源的页面中,交互阶段更有可能出现的早;在包含较少外部资源的页面中,完成阶段更有可能出现的早。因此,为了尽可能抢到先机,有必要同时检测交互和完成阶段,如:

document.addEventListener("readystatechange", function ready () {
    if (document.readyState == "interactive" || document.readyState == "complete") {
        document.removeEventListener("readystatechange", ready;
        console.log("Content loaded");
    }
});

见《js高级程序设计》第十三章事件类型html5事件中readystatechange事件,第二版391页

这样编写的代码,可以达到与使用DOMContentLoaded十分接近的效果。

另外,关于script元素和link元素的加载情况参考:

就绪状态(readystatechange)事件

pageshowpagehide事件

“往返缓存(back-forward cache或bfcache)”——可以在用户使用浏览器的“前进”、“后退”按钮时加快页面的转换速度。如果页面位于bgcache中,那么再次打开该页面时就不会触发load事件。

pageshow事件和event.persisted属性

该事件在页面显示时触发,虽然这个事件的目标是document,但是必须将其事件处理程序添加到window。如:

window.addEventListener('pageshow', function(event) {
    console.log('pageshow:');
    console.log(event); //PageTransitionEvent
});

属性是一个布尔值,如果页面保存在了bfcache中,则这个属性的值为true;否则为false。

hashchange事件

该事件以便在URL的参数列表(及URL中“#”号后面的所有字符串)发生变化时通知开发人员。必须把这个事件的事件处理程序添加给window对象。event对象中有两个属性:oldURLnewURL。这两个属性分别保存着参数列表变化前后的完整URL:

window.addEventListener("hashchange", function () {
    console.log("Old URL:" + event.oldURL + "\nNew URL: " + event.newURL);
});

检测:

如果IE8是在IE7文档模式下运行,即使功能无效也会返回true:

var isSupported = ("onhashchange" in window) && (document.documentMode === undefined || document.documentMode > 7);

相关文章:

  • iOS网络-NSURLSession/AFNetworking发送HTTPS网络请求
  • 打印机连接常见故障
  • -----二叉树的遍历-------
  • Highcharts tooltip显示数量和百分比
  • Listen第二个参数的意义
  • 发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
  • 在Unity中实现一个简单的消息管理器
  • 重要的方法
  • Docker入门最佳实践
  • webpack 4.x 搭建项目脚手架
  • python学习第十二课
  • 用事件修饰符来修改事件
  • PHP慢慢长路之问题与解决方法(2)——用navicat导出数据库出错问题解决
  • DevOps/TestOps概念
  • 高级特性(8)- JavaBean构件
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 2017年终总结、随想
  • Centos6.8 使用rpm安装mysql5.7
  • CSS3 变换
  • JS变量作用域
  • Python_网络编程
  • vue自定义指令实现v-tap插件
  • 程序员最讨厌的9句话,你可有补充?
  • 回顾 Swift 多平台移植进度 #2
  • 前端设计模式
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用API自动生成工具优化前端工作流
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序填坑清单
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (javascript)再说document.body.scrollTop的使用问题
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)VC++中ondraw在什么时候调用的
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .java 9 找不到符号_java找不到符号
  • .NET delegate 委托 、 Event 事件
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET序列化 serializable,反序列化
  • [1525]字符统计2 (哈希)SDUT
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [Bada开发]初步入口函数介绍
  • [CERC2017]Cumulative Code
  • [codevs] 1029 遍历问题
  • [hdu 4552] 怪盗基德的挑战书
  • [RN] React Native 常用命令行
  • [selenium] Handling Untrusted SSL certificate error in firefox
  • [sqlmap]学习笔记#1
  • [Winodows Phone 7控件详解]Map-2
  • [代码]--c#实现屏幕取词源码下载
  • [单片机框架][device层] fuelgauge 电量计
  • [导入]常用Response对象的使用详解