javascript下4个跨浏览器必备的函数


Posted in Javascript onMarch 07, 2010

下面四个函数就是其中的一部分。

首先我们要添加一段浏览器检测脚本:

/************************************ 
* 检测浏览器 
***********************************/ 
var user = navigator.userAgent; 
var browser = {}; 
browser.opera = user.indexOf("Opera") > -1 && typeof window.opera == "object"; 
browser.khtml = (user.indexOf("KHTML") > -1 || user.indexOf("AppleWebKit") > -1 || user.indexOf("Konqueror") > -1) && !browser.opera;browser.ie = user.indexOf("MSIE") > -1 && !browser.opera; 
browser.gecko = user.indexOf("Gecko") > -1 && !browser.khtml; 
if ( browser.ie ) { 
var ie_reg = /MSIE (\d+\.\d+);/; 
ie_reg.test(user); 
var v = parseFloat(RegExp["$1"]); 
browser.ie55 = v <= 5.5; 
browser.ie6 = v <= 6; 
}

一) 添加事件绑定 bind()
这个想必大家都已知道。IE 的事件绑定函数是 attachEvent;而 Firefox, Safari 是 addEventListener;Opera 则两种都支持。下面进行封装。

/************************************ 
* 添加事件绑定 
* @param obj : 要绑定事件的元素 
* @param type : 事件名称。不加 "on". 如 : "click" 而不是 "onclick". 
* @param fn : 事件处理函数 
************************************/ 
function bind( obj, type, fn ) { 
if ( obj.attachEvent ) { 
obj['e'+type+fn] = fn; 
obj[type+fn] = function(){obj['e'+type+fn]( window.event );} 
obj.attachEvent( 'on'+type, obj[type+fn] ); 
} else 
obj.addEventListener( type, fn, false ); 
} 
例如添加一个页面点击事件: bind(document, "click", function() { 
alert("Hello, World!!"); 
});

二) 删除事件绑定 unbind()
和 bind() 函数参数相同,功能相反。
/************************************ 
* 删除事件绑定 
* @param obj : 要删除事件的元素 
* @param type : 事件名称。不加 "on". 如 : "click" 而不是 "onclick" 
* @param fn : 事件处理函数 
************************************/ 
function unbind( obj, type, fn ) { 
if ( obj.detachEvent ) { 
obj.detachEvent( 'on'+type, obj[type+fn] ); 
obj[type+fn] = null; 
} else 
obj.removeEventListener( type, fn, false ); 
}

三) 获取元素的计算样式
计算样式也叫最终样式,也就是元素最终呈现出来的样式。IE 用的是元素的 currentStyle 属性,而其他浏览器则是标准的 document.defaultView.getComputedStyle() 方法。
/************************************ 
* 返回元素的计算样式 
* @param element : 元素 
* @param key : 样式名称(骆驼) 
************************************/ 
function getStyle(element, key) { 
// 参数不正确 
if ( typeof element != "object" || typeof key != "string" || key == "" ) 
return false; // 不透明度 
if( key == "opacity" ) { 
if(browser.ie) { 
var f = element.filters; 
if(f && f.length > 0 && f.alpha) { 
return (f.alpha.opacity / 100); 
} 
return 1.0; 
} 
return document.defaultView.getComputedStyle(element, null)["opacity"]; 
} 
// 浮动 
if ( key == "float" ) { 
key = (browser.ie ? "styleFloat" : "cssFloat"); 
} 
if ( typeof element.currentStyle != "undefined" ){ 
return element.currentStyle[key]; 
} else { 
return document.defaultView.getComputedStyle(element, null)[key]; 
} 
}

IE 和其他浏览器的透明度机制不一样,这里统一用 opacity 表示透明度。还有,由于 float 是 JavaScript 的保留字,所以浏览器对其进行了转义,IE 用的是 styleFloat,其他则为 cssFloat。这里统一为 float。

例如:获取透明度

var a = document.getElementById("test"); 
var opacity = getStyle(a, "opacity");

四) DOM 加载完毕事件绑定 domready()
domready 和 window.onload 有所不同,window.onload 是页面所有元素全部加载完毕,包括图像,视频等一些东西。而一般情况下我们不需要等那么久,而只需要 DOM 可用即可。
/************************************ 
* domready 
* @param fn: 要执行的函数 
************************************/ 
function domready(fn) { 
// 参数不正确 
if(typeof fn != "function") 
return false; 
if(typeof document.addEventListener == "function") { // 非 IE 浏览器 
document.addEventListener("DOMContentLoaded", fn, false); 
return; 
} 
var _this = arguments.callee; 
if(_this.ready) // 如果 DOM 已经加载完毕, 则直接执行 
return fn(); if(!_this.list) // 创建一个待执行函数数组 
_this.list = []; 
_this.list.push(fn); 
if (_this.done) return; // 正在循环检测则返回 
(function() { // 循环检测 
_this.done = true; 
try { 
document.documentElement.doScroll("left"); 
} catch(error) { 
setTimeout(arguments.callee, 0); 
return; 
} 
// DOM 加载完毕, 执行所有待执行函数 
_this.ready = true; 
for (var i=0, l=_this.list.length; i<l; i++) { 
_this.list[i](); 
} 
})(); 
}

例如:
domready(function(){ 
alert("DOM 加载完毕!"); 
});
Javascript 相关文章推荐
优化JavaScript脚本的性能的几个注意事项
Dec 22 Javascript
封装了一个js图片轮换效果的函数
Sep 28 Javascript
Node.js实现在目录中查找某个字符串及所在文件
Sep 03 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
Mar 11 Javascript
纯JS实现可拖拽表单的简单实例
Sep 02 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
Jan 03 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
May 10 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
Dec 05 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
详解js 创建对象的几种方法
Mar 08 Javascript
react基本安装与测试示例
Apr 27 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
Mar 07 #Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
Mar 07 #Javascript
javascript实现面向对象类的功能书写技巧
Mar 07 #Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 #Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
Mar 05 #Javascript
Jquery Validation插件防止重复提交表单的解决方法
Mar 05 #Javascript
javascript下判断一个元素是否存在的代码
Mar 05 #Javascript
You might like
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
JS常见算法详解
2017/02/28 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
对于Python的框架中一些会话程序的管理
2015/04/20 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
Python list运算操作代码实例解析
2020/01/20 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
python实现数字炸弹游戏程序
2020/07/17 Python
奥地利网上书店:Weltbild
2017/07/14 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
泰国在线书店:SE-ED
2020/06/21 全球购物
毕业生在校学习的自我评价分享
2013/10/08 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
新兵入伍心得体会
2014/09/04 职场文书
保姆聘用合同
2015/09/21 职场文书
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS