详解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 相关文章推荐
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
Dec 23 Javascript
JQuery里选择超链接的实现代码
May 22 Javascript
jQuery固定浮动侧边栏实现思路及代码
Sep 28 Javascript
javascript 中__proto__和prototype详解
Nov 25 Javascript
jQuery过滤选择器用法分析
Feb 10 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 Javascript
js cookie实现记住密码功能
Jan 17 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
js获取浏览器的各种属性
Apr 27 Javascript
vue+elementUI实现图片上传功能
Aug 20 Javascript
jquery插件实现搜索历史
Apr 24 jQuery
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开发环境配置记录
2011/01/14 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
8个必备的PHP功能实例代码
2013/10/27 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
定制FileField中的上传文件名称实例
2017/08/23 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
numpy.random模块用法总结
2019/05/27 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
汽车专业人才自我鉴定范文
2013/12/29 职场文书
房屋转让协议书
2014/04/11 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
golang slice元素去重操作
2021/04/30 Golang
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL
Oracle使用别名的好处
2022/04/19 Oracle