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 相关文章推荐
解决jquery .ajax 在IE下卡死问题的解决方法
Oct 26 Javascript
JavaScript CSS修改学习第二章 样式
Feb 19 Javascript
按下Enter焦点移至下一个控件的实现js代码
Dec 11 Javascript
js实现文本框中焦点在最后位置
Mar 04 Javascript
javascript中闭包概念与用法深入理解
Dec 15 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
JavaScript登录记住密码操作(超简单代码)
Mar 22 Javascript
详解如何使用Vue2做服务端渲染
Mar 29 Javascript
Node.js笔记之process模块解读
May 31 Javascript
其实你可以少写点if else与switch(推荐)
Jan 10 Javascript
深入理解 JS 垃圾回收
Jun 03 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
Jul 28 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
PHP检测用户语言的方法
2015/06/15 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
2019/05/15 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
Python中文编码那些事
2014/06/25 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python的形参和实参使用方式
2019/12/24 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
小区门卫管理制度
2014/01/29 职场文书
《王二小》教学反思
2014/02/27 职场文书
艺术教育实施方案
2014/05/03 职场文书
教师先进事迹材料
2014/12/16 职场文书
推销搭讪开场白
2015/05/28 职场文书
合同审查法律意见书
2015/06/04 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
pytorch 使用半精度模型部署的操作
2021/05/24 Python