详解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 相关文章推荐
IE8 chrome中table隔行换色解决办法
Jul 09 Javascript
web网页按比例显示图片实现原理及js代码
Aug 09 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
Jun 05 Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 Javascript
贴近用户体验的Jquery日期、时间选择插件
Aug 19 Javascript
jquery专业的导航菜单特效代码分享
Aug 29 Javascript
Angularjs手动解析表达式($parse)
Oct 12 Javascript
浅谈React前后端同构防止重复渲染
Jan 05 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
js字符串类型String常用操作实例总结
Jul 05 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
Nov 26 Javascript
JavaScript实现字符串与HTML格式相互转换
Mar 17 Javascript
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读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
php实现mysql封装类示例
2014/05/07 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
js同时按下两个方向键
2007/12/01 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
webpack+react+antd脚手架优化的方法
2018/04/02 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python 日期排序的实例代码
2019/07/11 Python
简单了解python PEP的一些知识
2019/07/13 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
网络事业创业计划书范文
2014/01/09 职场文书
大学班长的职责
2014/01/27 职场文书
优秀经理事迹材料
2014/02/01 职场文书
企业培训简报范文
2015/07/20 职场文书
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫