详解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 关闭IE6、IE7
Jun 01 Javascript
犀利的js 函数集合
Jun 11 Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
Apr 25 Javascript
js显示动态时间的方法详解
Aug 20 Javascript
jQuery Validate设置onkeyup验证的实例代码
Dec 09 Javascript
jQuery扩展+xml实现表单验证功能的方法
Dec 25 Javascript
JS实现搜索框文字可删除功能
Dec 28 Javascript
JS日程管理插件FullCalendar中文说明文档
Feb 06 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
Apr 01 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
Jan 16 Javascript
Node.js API详解之 util模块用法实例分析
May 09 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
基于jquery的3d效果实现代码
2011/03/23 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
Vue实现6位数密码效果
2018/08/18 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
跟老齐学Python之list和str比较
2014/09/20 Python
详解Python当中的字符串和编码
2015/04/25 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
简单了解Python3里的一些新特性
2019/07/13 Python
Django实现文件上传下载
2019/10/06 Python
Python flask框架端口失效解决方案
2020/06/04 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
外企C语言笔试题
2013/11/10 面试题
银行开业庆典方案
2014/02/06 职场文书
客运企业隐患排查工作方案
2014/06/06 职场文书
庆六一活动总结
2014/08/29 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS