存在不同浏览器间的JS兼容总结
2016年2月19日个人博客文章--迁移到segmentfault
当我们在编写JS用于处理事件时,由于考虑到不同浏览器间Js代码兼容不同,代码不易记忆,于是做出如下整理。(当然以后还会增加更新的。。。)
示例代码如下:
(1)阻止默认事件
obj.onclick=function(ev){
var event=ev||window.event;
if(event.preventDefault){
event.preventDefault(); /*W3C标准*/
}else{
event.returnValue=false; /*兼容IE*/
}
}
小提示:return false; 也能阻止默认事件 但是要注意位置。
(2)获取下(上)一个兄弟节点
function nextnode(obj){ /*获取下一个兄弟节点*/
if (obj.nextElementSibling) {
return obj.nextElementSibling;
} else{
return obj.nextSibling;
}
}
function prenode(obj){ /*获取上一个兄弟节点*/
if (obj.previousElementSibling) {
return obj.previousElementSibling;
} else{
return obj.previousSibling;
}
}
(3)获取第一个子(最后一个)节点
function firstnode(obj){/*获取第一个子节点*/
if (obj.firstElementChild) {
return obj.firstElementChild;/*非IE678支持*/
} else{
return obj.firstChild;/*IE678支持*/
}
}
function lastnode(obj){/*获取最后一个子节点*/
if (obj.lastElementChild) {
return obj.lastElementChild;/*非IE678支持*/
} else{
return obj.lastChild;/*IE678支持*/
}
}
(4)添加(移除)事件监听
function addEvent(obj,type,fn){ /*添加事件*/
if(obj.addEventListener){
obj.addEventListener(type,fn,false); //非IE添加事件监听
}else{
obj.attachEvent('on'+type,fn); //IE添加事件绑定
stopEvent();
}
}
function removeEvent(obj,type,fn){ //移除事件
if(obj.removeEventListener){
obj.removeEventListener(type,fn,false); //非IE移除事件,移除事件,第三个参数必须是函数名
}else{
obj.detachEvent('on'+type,fn); //IE移除事件
}
}
(5)举例click事件阻止事件传播
obj.onclick=function(ev){
var event=ev||window.event;
alert('aa');
if(event.stopPropagation){
event.stopPropagation(); //非IE阻止事件传播
}else{
event.cancelBubble=true; //IE阻止事件传播
}
}
(6)mouseover与mouseover的事件委托(经常用到,用于去除当 鼠标浮动到元素容器中不同子元素间出现闪动问题。只需在函数function(ev){} 头部添加以下代码即可)
// mouseover委托事件
var event=ev||window.event;
// var from=event.fromElement||event.relatedTarget;
//在mouseover事件中from,表示鼠标来自哪个元素,也是事件委托类型,和target与srcElement相反
// alert(from);
var from=event.fromElement||event.relatedTarget;
while(from){
if (this==from) {
return false;
};
from=from.parentNode;
}
//mouseout委托事件
var event=ev||window.event;
var to=event.toElement||event.relatedTarget;
//在mouseout事件中to,表示鼠标指向那个元素,也是事件委托类型,和target与srcElement相反
// alert(to)
while(to){
if (this==to) {
return false;
};
to=to.parentNode;
}
(7)滚轮事件
box.onmousewheel=function (ev){
var event=ev||window.event;
// box.innerHTML='鼠标滚动'+event.wheelDelta;
if (event.wheelDelta>0) {
alert('鼠标前滚');//非火狐 前滚120
} else{
alert('鼠标后滚')//非火狐 后滚-120
};
}*/
box.addEventListener('DOMMouseScroll',function (ev){
var event=ev||window.event;
alert(event.detail);//火狐前滚:-3 ,后滚:3
},false)//IE678不支持
8.js按需加载 异步加载
demo.js如下
function test() {
console.log('hello');
}
index.html如下
function loadScript(url,callback){
var script=document.createElement('script');
script.type='text/javascript';
if(script.readyState){ //ie
script.onreadystatechange=function(){
if(script.readyState=='complete'||script.readyState=='loaded'){
callback()
}
}
}else{
script.onload=function(){ //Safari chrome firefox opera ----Ie script不具备onload方法
callback();
}
}
script.src=url; //写在这里是为了防止onreadystatechange状态不改变
document.head.appendChild(script)
}
loadScript('demo.js',function(){test()})
存在不同浏览器间的JS兼容总结的更多相关文章
- 浏览器间CSS样式兼容问题
1.display:table居中显示 在chrome和safari浏览器上兼容问题 2.滤镜 在chrome浏览器中能正常显示,在360浏览器中不能正常显示 3.省略号问题 对于一行显示,基本上对所 ...
- 关于页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
需求 最近在做博客的目录功能,发现一个在现代浏览器间的一个bug,或是称之为差异,即页面滚动值(scrollTop)的获取与设定. 在此之前先说一下关于页面元素的坐标获取,这张图的经典性不必再提. 实 ...
- JS兼容各个浏览器的本地图片上传即时预览效果
JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...
- css js 兼容问题
js 兼容问题 1. document.form.item 问题问题:代码中存在 document.formName.item("itemName") 这样的语句,不能在FF下运 ...
- Safari浏览器中对js Date对象的支持
看了一下自己上一次写博客还是3月份,那是还没有毕业,实习也没那么多事情,毕业设计也才刚开始做,那时天天晚上都把电脑带回家继续学习,而现在一工作忙为借口已经不怎么进行什么知识总结了,只是在印象笔记里做做 ...
- 【js】IE、FF、Chrome浏览器中的JS差异介绍
如何判断浏览器类型 转:http://www.cnblogs.com/carekee/articles/1854674.html 1.通过浏览器特有的对象 如ie 的ActiveXObject ff ...
- 浏览器检测(BrowserDetect.js)
浏览器检测是在工作中经常用到的,如果只是简单判断当前是什么浏览器的话可以通过window.navigator.useragent这样的js来直接判断就可以了! 但是针对浏览器版本要求比较高的时候,如果 ...
- 谷歌、火狐浏览器下实现JS跨域iframe高度自适应的完美解决方法,跨域调用JS不再是难题!
谷歌.火狐浏览器下实现JS跨域iframe高度自适应的解决方法 导读:今天开发的时候遇到个iframe自适应高度的问题,相信大家对这个不陌生,但是一般我们都是在同一个项目使用iframe嵌套页面,这个 ...
- 浏览器检测(BrowserDetect.js)使用
浏览器检测是在工作中经常用到的,如果只是简单判断当前是什么浏览器的话可以通过window.navigator.useragent这样的js来直接判断就可以了! 但是针对浏览器版本要求比较高的时候,如果 ...
随机推荐
- 工具使用--Tomcat
一.Tomcat 服务搭建 1.进入apache官网下载tomcat 8.在左手边的菜单区,选择download下的tomcat8 版本: PS:操作系统,文件类型 2.将zip文件下载,解压到本地: ...
- Java数据结构之栈(Stack)
1.栈(Stack)的介绍 栈是一个先入后出(FILO:First In Last Out)的有序列表. 栈(Stack)是限制线性表中元素的插入和删除只能在同一端进行的一种特殊线性表. 允许插入和删 ...
- 利用Flot作基于时间段的曲线图
Flot是一个可以用于绘制多种图表的开源的JS库,Flot本身的功能已经是基本可以满足日常的需要啦,更可喜的是Flot还有很多的插件可以使用,从而为我们提供更加强大的定制功能,本文在作图中使用的显示坐 ...
- Windows node.js安装运行npm显示类似"ENOENT, stat 'C:\Users\XXXX\AppData\Roaming\npm'错误
这个错误是在玩一个小的博客的时候,使用到node.js,正好使用的是windows系统就安装了一个windows32的node.js版本 结果一运行npm就出现如上的错误,后来发现,只要在上面提到的目 ...
- Linux命令学习(0)
作为一名前端,可能接触到linux的机会并不多,但这不代表就不需要学.对我而言,学习linux主要是为了方便部署我的项目到服务器,我并没有花时间去学这些,只是上网查怎么部署项目,然后按教程一步一步来, ...
- 【错误】jsp查询字符串中空格导致的异常问题!
jsp中查询字符串中空格问题 jsp中查询字符串中参数名的等号右边最好不要出现空格,因为编译器会把他当做是参数值得一部分. 例如: <a href="adjust.jsp?number ...
- laravel框架之增刪改查
<?php namespace App\Http\Controllers\admin; use Illuminate\Http\Request as request; use App\Http\ ...
- shopnc如何配置微信支付和支付宝支付
步骤一,支付宝账号申请 申请支付宝商家账号 ,填写好公司名称,资质,审核过了,然后填写下面这些参数 步骤二 微信支付申请 登陆微信公众平台-企业微信支付,得到商户号,再申请密钥 注意:支付宝加密方式 ...
- idea无法使用注解@Data解决方法
@Data相关依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...
- empty()、isset()、is_null()的区别
总结:1. 变量有二种状态: 已声明, 未声明2. 已声明的变量也有二种状态: 已赋值(初始化), 未赋值(未初始化)3. 变量可能会被赋值类型: null, 空值, 非空值 3.1: null值: ...