详解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 相关文章推荐
深入理解JavaScript作用域和作用域链
Oct 21 Javascript
Javascript实现返回上一页面并刷新的小例子
Dec 11 Javascript
JavaScript中的getMilliseconds()方法使用详解
Jun 10 Javascript
jQuery改变form表单的action,并进行提交的实现代码
May 25 Javascript
关于js原型的面试题讲解
Sep 25 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 Javascript
javaScript语法总结
Nov 25 Javascript
JavaScript基于面向对象实现的猜拳游戏
Jan 03 Javascript
vue-router中scrollBehavior的巧妙用法
Jul 09 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
在Vuex中Mutations修改状态操作
Jul 24 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
Jquery中getJSON在asp.net中的使用说明
2011/03/10 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
从零开始搭建一个react项目开发
2018/02/09 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
详解Python中的路径问题
2020/09/02 Python
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
青春无悔演讲稿
2014/05/08 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书