详解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 相关文章推荐
JS、CSS以及img对DOMContentLoaded事件的影响
Aug 12 Javascript
jQuery级联操作绑定事件实例
Sep 02 Javascript
js获取当前时间显示在页面上并每秒刷新
Dec 24 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
js实现精确到毫秒的倒计时效果
Aug 05 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
Sep 28 Javascript
vue watch自动检测数据变化实时渲染的方法
Jan 16 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
angular的输入和输出的使用方法
Sep 22 Javascript
浅谈vue 多个变量同时赋相同值互相影响
Aug 05 Javascript
微信小程序实现锚点跳转
Nov 23 Javascript
一起来了解一下JavaScript的预编译(小结)
Mar 01 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代码优化及php相关问题总结
2006/10/09 PHP
15个小时----从修改程序到自己些程序
2006/10/09 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
python中循环语句while用法实例
2015/05/16 Python
python构建自定义回调函数详解
2017/06/20 Python
Python实现常见的回文字符串算法
2018/11/14 Python
python实现二维插值的三维显示
2018/12/17 Python
Python列表(List)知识点总结
2019/02/18 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
酒店司机岗位职责
2013/12/14 职场文书
小学教师管理制度
2014/01/18 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
企业趣味活动方案
2014/08/21 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript