详解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 相关文章推荐
利用WebBrowser彻底解决Web打印问题(包括后台打印)
Jun 22 Javascript
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
javascript一些实用技巧小结
Mar 18 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
May 31 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
用jquery写的菜单从左往右滑动出现
Apr 11 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
May 20 Javascript
jquery实现简单的banner轮播效果【实例】
Mar 30 Javascript
jQuery版AJAX简易封装代码
Sep 14 Javascript
String字符串截取的四种方式总结
Nov 28 Javascript
浅谈Javascript事件对象
Feb 05 Javascript
详解Vue使用命令行搭建单页面应用
May 24 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
Python制作数据导入导出工具
2015/07/31 Python
详解Django中间件执行顺序
2018/07/16 Python
python 读取二进制 显示图片案例
2020/04/24 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
优秀应届生推荐信
2013/11/09 职场文书
鸿星尔克广告词
2014/03/21 职场文书
考核工作实施方案
2014/03/30 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书