`
lwt_cedric
  • 浏览: 115397 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

4个跨浏览器必备的函数

阅读更多


如果你的项目要用到 JavaScript,而你不使用任何 JavaScript 框架,那么对于那些常用且各个浏览器明显不同的地方就需要用函数来封装起来。
下面四个函数就是其中的一部分。

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

/************************************
* 检测浏览器
***********************************/
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下4个跨浏览器必备的函数

    下面将详细介绍四个常用的跨浏览器必备函数。 首先,我们需要了解如何检测浏览器。对于JavaScript开发者而言,了解当前用户使用的是哪种浏览器是非常重要的,因为不同的浏览器可能会有不同的对象和方法。通过编写...

    编写跨浏览器的javascript代码必备[js多浏览器兼容写法]

    跨浏览器的写法是将事件参数作为函数的参数,并使用`event || window.event`来兼容不同浏览器。 在创建DOM元素方面,`document.createElement`方法在所有浏览器中都可用,但对于某些特定类型的元素,如`&lt;input&gt;`...

    最常用的10个javascript自定义函数(english)

    - **功能概述**:`addEvent()` 是一个用于绑定事件监听器的通用函数,它可以跨浏览器地添加事件监听器。 - **应用场景**: - 在不同浏览器之间提供一致的行为。 - 简化事件绑定的过程,提高代码的可维护性。 - **...

    DLL 浏览器汉化绿色(编程爱好者必备工具)

    DLL(Dynamic Link Library)是Windows操作系统中的一个重要组成部分,它是一种共享库,包含了各种函数和资源,可供多个程序同时调用,以实现代码复用和优化系统性能。DLL浏览器是一款专门用于查看、理解和管理这些...

    asp常用函数大全 学习asp必备

    - `OpenDB(vdata_url)`: 这个函数用于打开数据库连接,参数`vdata_url`通常是指向数据库的路径或URL。在ASP中,数据库连接是进行数据存储和检索的基础。 - `CheckStr(byValChkStr)`, `CheckSql()`, `UnCheckStr...

    面试必备JS函数工具库手写.docx

    这个实现首先检查`obj`是否为`undefined`或`null`,如果为真,则将其设置为全局对象(在浏览器中是`window`,在Node.js中是`global`)。然后,它在`obj`上创建一个临时方法`temp`,并让`temp`指向`Fn`函数。通过`obj...

    浏览器兼容

    解决这些问题通常需要使用条件语句、封装兼容函数或利用jQuery等库提供的跨浏览器功能。 CSS兼容性问题通常涉及到CSS3的新属性和选择器。不同的浏览器对这些新特性的支持程度不一,可能需要添加特定浏览器的前缀...

    vue3浏览器调试插件

    总之,Vue3浏览器调试插件是Vue3开发者的得力助手,它通过直观的界面和丰富的功能,极大地提升了开发和调试效率,是每个Vue开发者必备的工具之一。熟练掌握Vue Devtools的使用,将使你在Vue3开发中如鱼得水。

    Android 仿ES界面文件浏览器源码.rar

    在Android应用开发中,文件浏览器是一个常见的功能,用于帮助用户浏览和管理设备上的文件。本篇将深入解析“Android 仿ES界面文件浏览器源码”,探讨其设计思路和技术实现,旨在帮助开发者理解和构建类似的文件管理...

    WEB前端标准在各浏览器中的差异.zip_web标准_浏览器

    4. **浏览器内核**:主流浏览器分为 Trident(IE)、Gecko(Firefox)、Blink(Chrome、Opera)和WebKit(Safari、早期Chrome)。每个内核对标准的解析和实现都有其独特性,这导致了渲染和脚本执行的差异。 5. **...

    Chrome浏览器的vue开发插件

    在进行Vue项目开发时,Chrome浏览器的Vue DevTools是一个不可或缺的工具。这个插件专为Vue应用提供深入的调试功能,使得开发者可以更轻松地理解、检查和调试Vue组件及其状态。 Vue DevTools 是由Vue.js官方团队开发...

    开发必备常用ASP函数的封装.pdf

    4. **isInteger(para)**: 这个函数用于判断一个变量是否为整数,确保数据类型正确,防止非整数数据导致的计算错误。 5. **CheckName(str)**: 在注册或登录等场景下,此函数可检查用户名是否符合特定的字符规则,...

    eval函数的一些用法

    在IT行业中,`eval()`函数是一个非常特殊且强大的工具,主要在编程语言中使用,...理解和慎用`eval()`,以及寻求更安全的替代方案,是每个开发者的必备技能。在实际开发中,要充分评估安全性和性能,做出明智的选择。

    NPAPI 插件获取浏览器地址栏URL

    6. **替代方案**:为了实现类似的功能,开发者可以转向使用WebExtensions API,这是一个跨浏览器的API标准,支持Chrome、Firefox、Safari等。通过这个API,开发者可以编写不依赖于NPAPI的浏览器扩展,同样可以获取...

    浏览器xpath插件,学习爬虫必备

    4. 数据提取:XPath还能用于提取节点的值,如`//title/text()`将获取当前文档的标题文本。 在学习爬虫的过程中,XPath插件是不可或缺的辅助工具。它可以帮助初学者快速理解网页结构,找出需要抓取的数据所在位置。...

    chrome 浏览器 selenium IDE插件

    4. **变量与函数**:利用变量存储动态数据,编写可重用的自定义函数,提升脚本复用性。 5. **版本控制**:将测试脚本纳入版本控制系统(如 Git),便于团队协作和历史版本追踪。 **四、Selenium IDE 与自动化测试*...

    vue开发浏览器插件

    Vue DevTools 是一个专为Vue.js应用开发的浏览器扩展插件,用于帮助开发者在浏览器环境中实时查看和调试Vue应用程序的状态。这个插件允许我们深入洞察Vue实例、组件、虚拟DOM、属性、事件以及更多其他细节,极大地...

    浏览器调试ajax请求

    在现代Web开发中,浏览器与服务器之间的通信是一个关键环节,特别是在使用Ajax技术进行异步数据交互时。Ajax(Asynchronous JavaScript and XML)允许我们在不刷新整个页面的情况下与服务器交换数据并更新部分网页...

Global site tag (gtag.js) - Google Analytics