详解js几个绕不开的事件兼容写法


Posted in Javascript onAugust 30, 2017

本文介绍了详解js几个绕不开的事件兼容写法,分享给大家,具体如下:

1、键盘事件 keyCode 兼容性写法

var inp = document.getElementById('inp')
var result = document.getElementById('result')

function getKeyCode(e) {
 e = e ? e : (window.event ? window.event : "")
 return e.keyCode ? e.keyCode : e.which
}

inp.onkeypress = function(e) {
 result.innerHTML = getKeyCode(e)
}

2、求窗口大小的兼容写法

当我们获取滚动条滚动距离时:

IE,Chrome: document.body.scrollTop

FF: document.documentElement.scrollTop

// 浏览器窗口可视区域大小(不包括工具栏和滚动条等边线)
// 1600 * 525
var client_w = document.documentElement.clientWidth || document.body.clientWidth;
var client_h = document.documentElement.clientHeight || document.body.clientHeight;

// 网页内容实际宽高(包括工具栏和滚动条等边线)
// 1600 * 8
var scroll_w = document.documentElement.scrollWidth || document.body.scrollWidth;
var scroll_h = document.documentElement.scrollHeight || document.body.scrollHeight;

// 网页内容实际宽高 (不包括工具栏和滚动条等边线)
// 1600 * 8
var offset_w = document.documentElement.offsetWidth || document.body.offsetWidth;
var offset_h = document.documentElement.offsetHeight || document.body.offsetHeight;

// 滚动的高度
var scroll_Top = document.documentElement.scrollTop||document.body.scrollTop;

3、DOM 事件处理程序的兼容写法(能力检测)

var eventshiv = {
  // event兼容
  getEvent: function(event) {
    return event ? event : window.event;
  },

  // type兼容
  getType: function(event) {
    return event.type;
  },

  // target兼容
  getTarget: function(event) {
    return event.target ? event.target : event.srcelem;
  },

  // 添加事件句柄
  addHandler: function(elem, type, listener) {
    if (elem.addEventListener) {
      elem.addEventListener(type, listener, false);
    } else if (elem.attachEvent) {
      elem.attachEvent('on' + type, listener);
    } else {
      // 在这里由于.与'on'字符串不能链接,只能用 []
      elem['on' + type] = listener;
    }
  },

  // 移除事件句柄
  removeHandler: function(elem, type, listener) {
    if (elem.removeEventListener) {
      elem.removeEventListener(type, listener, false);
    } else if (elem.detachEvent) {
      elem.detachEvent('on' + type, listener);
    } else {
      elem['on' + type] = null;
    }
  },

  // 添加事件代理
  addAgent: function (elem, type, agent, listener) {
    elem.addEventListener(type, function (e) {
      if (e.target.matches(agent)) {
        listener.call(e.target, e); // this 指向 e.target
      }
    });
  },

  // 取消默认行为
  preventDefault: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
    } else {
      event.returnValue = false;
    }
  },

  // 阻止事件冒泡
  stopPropagation: function(event) {
    if (event.stopPropagation) {
      event.stopPropagation();
    } else {
      event.cancelBubble = true;
    }
  }
};

4、解决 IE9 以下浏览器不能使用 opacity

opacity: 0.5;
filter: alpha(opacity = 50);
filter: progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50);

5、为一个元素绑定两个相同事件:attachEvent/attachEventLister 出现的兼容问题

事件绑定:(不兼容需要两个结合做兼容if..else..)

IE8以下用: attachEvent('事件名',fn);

FF,Chrome,IE9-10用: attachEventLister('事件名',fn,false);

function myAddEvent(obj,ev,fn){
   if(obj.attachEvent){
    //IE8以下
    obj.attachEvent('on'+ev,fn);
   }else{
    //FF,Chrome,IE9-10
    obj.attachEventLister(ev,fn,false);
   }
  }

6、获取元素的非行间样式值

function getStyle(object,oCss) {
    if (object.currentStyle) {
     return object.currentStyle[oCss];//IE
    }else{
     return getComputedStyle(object,null)[oCss];//除了IE
    }
  }

7、节点加载

//火狐下特有的节点加载事件,就是节点加载完才执行,和onload不同
//感觉用到的不多,直接把js代码放在页面结构后面一样能实现。。
document.addEventListener('DOMContentLoaded',function ( ){},false);//DOM加载完成。好像除IE6-8都可以.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery autocomplete插件修改
Apr 17 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
Dec 14 Javascript
jquery ajax同步异步的执行最终解决方案
Apr 26 Javascript
JS和函数式语言的三特性
Mar 05 Javascript
Bootstrap中的Panel和Table全面解析
Jun 13 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
Nov 08 Javascript
将JSON字符串转换成Map对象的方法
Nov 30 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
Feb 14 Javascript
webpack处理 css\less\sass 样式的方法
Aug 21 Javascript
angular 内存溢出的问题解决
Jul 12 Javascript
JavaScript中的几种继承方法示例
Dec 06 Javascript
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
JavaScript实现滑动导航栏效果
Aug 30 #Javascript
详解vue-cli 构建Vue项目遇到的坑
Aug 30 #Javascript
前端开发不得不知的10个最佳ES6特性
Aug 30 #Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 #Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 #Javascript
详解使用nvm管理多版本node的方法
Aug 30 #Javascript
jquery插件开发之选项卡制作详解
Aug 30 #jQuery
You might like
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
如何在PHP中使用数组
2020/06/09 PHP
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
python字符串连接方式汇总
2014/08/21 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
使用python实现多维数据降维操作
2020/02/24 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
教育专业个人求职信
2013/12/02 职场文书
大学军训自我鉴定
2013/12/15 职场文书
物流合作计划书
2014/01/10 职场文书
安全生产先进个人材料
2014/02/06 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
地方课程教学计划
2015/01/19 职场文书
自主招生专家推荐信
2015/03/26 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
病房管理制度范本
2015/08/06 职场文书
Python中requests做接口测试的方法
2021/05/30 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电