详解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事件绑定
Jun 02 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
Oct 11 Javascript
D3.js实现拓扑图的示例代码
Jun 30 Javascript
AngularJS 监听变量变化的实现方法
Oct 09 Javascript
深入理解Puppeteer的入门教程和实践
Mar 05 Javascript
微信小程序云开发之使用云存储
May 17 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 Javascript
vue设置导航栏、侧边栏为公共页面的例子
Nov 01 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 Javascript
JavaScript组合模式---引入案例分析
May 23 Javascript
JavaScript实现打字游戏
Feb 19 Javascript
详解JavaScript中Arguments对象用途
Aug 30 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中的串行化变量和序列化对象
2006/09/05 PHP
为PHP初学者的8点有效建议
2010/11/20 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
培养自己的php编码规范
2015/09/28 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Python 40行代码实现人脸识别功能
2017/04/02 Python
python 实现让字典的value 成为列表
2019/12/16 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
python实现的Iou与Giou代码
2020/01/18 Python
python实现快递价格查询系统
2020/03/03 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
python怎么自定义捕获错误
2020/06/29 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
制药工程专业毕业生推荐信
2013/12/24 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
红色影片观后感
2015/06/18 职场文书
校长新学期致辞
2015/07/30 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
海弦WR-800F
2022/04/05 无线电