详解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 相关文章推荐
网页常用特效代码整理
Jun 23 Javascript
js+div实现图片滚动效果代码
Feb 10 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
Jan 23 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
极力推荐10个短小实用的JavaScript代码段
Aug 03 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
Jquery 整理元素选取、常用方法一览表
Nov 26 Javascript
Vue中使用sass实现换肤功能
Sep 07 Javascript
node将geojson转shp返回给前端的实现方法
May 29 Javascript
layui关闭层级、简单监听的实例
Sep 06 Javascript
在vue中动态修改css其中一个属性值操作
Dec 07 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中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
php提高网站效率的技巧
2015/09/29 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript表单验证大全
2015/08/12 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
js实现交通灯效果
2017/01/13 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
python实现识别相似图片小结
2016/02/22 Python
Python实现自动发送邮件功能
2021/03/02 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
Python中的Django基本命令实例详解
2018/07/15 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
python 魔法函数实例及解析
2019/09/25 Python
python 检测图片是否有马赛克
2020/12/01 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
华为python面试题
2016/05/03 面试题
大学教师年终总结的自我评价
2013/10/29 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
1亿有多大教学反思
2014/05/01 职场文书
销售会议开幕词
2015/01/28 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
以下牛机,你有几个
2022/04/05 无线电
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL