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 相关文章推荐
DIY jquery plugin - tabs标签切换实现代码
Dec 11 Javascript
jQuery图片播放8款精美插件分享
Feb 17 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
Jun 29 Javascript
求数组最大最小值方法适用于任何数组
Aug 16 Javascript
使用JS获取当前地理位置方法汇总
Dec 18 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
Mar 21 Javascript
基于jQuery插件实现点击小图显示大图效果
May 11 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 Javascript
vue 页面加载进度条组件实例
Feb 05 Javascript
小程序实现单选多选功能
Nov 04 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
Js通过AES加密后PHP用Openssl解密的方法
Jul 12 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
删除无限级目录与文件代码共享
2006/07/12 PHP
动态生成gif格式的图像要注意?
2006/10/09 PHP
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
关于COOKIE个数与大小的问题
2011/01/17 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python实现将元祖转换成数组的方法
2015/05/04 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python如何读写json数据
2018/03/21 Python
django中模板的html自动转意方法
2018/05/27 Python
python监控文件并且发送告警邮件
2018/06/21 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
如何清空Session
2015/02/23 面试题
幼儿园保育员辞职信
2014/01/12 职场文书
关于人生的感言
2014/01/17 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
python解析照片拍摄时间进行图片整理
2022/07/23 Python
table不让td文字溢出操作方法
2022/12/24 HTML / CSS