详解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 相关文章推荐
Dom在ajax技术中的作用说明
Oct 25 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
Feb 23 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
May 25 Javascript
移动端JQ插件hammer使用详解
Jul 03 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
Dec 14 Javascript
javascript实现保留两位小数的多种方法
Dec 18 Javascript
用node和express连接mysql实现登录注册的实现代码
Jul 05 Javascript
axios中cookie跨域及相关配置示例详解
Dec 20 Javascript
vue+webpack中配置ESLint
Nov 07 Javascript
理理Vue细节(推荐)
Apr 16 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
Jul 10 jQuery
浅谈实现在线预览PDF的几种解决办法
Aug 10 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/12/06 PHP
php 中文和编码判断代码
2010/05/16 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
php定时执行任务设置详解
2015/02/06 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
python分析作业提交情况
2017/11/22 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
了解一下python内建模块collections
2020/09/07 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
有关环保的标语
2014/06/13 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
给老师的感谢信
2015/01/20 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
手写实现JS中的new
2021/11/07 Javascript
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python