详解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 相关文章推荐
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
Dec 07 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 Javascript
jQuery把表单元素变为json对象
Nov 06 Javascript
JS实现根据出生年月计算年龄
Jan 10 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
Mar 23 Javascript
正则表达式,替换所有HTML标签的简单实例
Nov 28 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
手把手教你使用TypeScript开发Node.js应用
May 06 Javascript
JQuery省市联动效果实现过程详解
May 08 jQuery
quickjs 封装 JavaScript 沙箱详情
Nov 02 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
做个自己站内搜索引擎
2006/10/09 PHP
php 将excel导入mysql
2009/11/09 PHP
php简单判断文本编码的方法
2015/07/30 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
Python学习小技巧之列表项的拼接
2017/05/20 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
网上开店必备创业计划书
2014/01/26 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
双方协议书
2014/04/22 职场文书
物理教育专业求职信
2014/06/25 职场文书
2014年幼师工作总结
2014/11/22 职场文书
工作失误检讨书
2015/01/26 职场文书
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL