`
yiminghe
  • 浏览: 1465478 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

跨平台兼容问题

阅读更多

首先举例常见的事件 注册 函数的跨浏览器解决方案:

 

function addEvt(el,eventName,fn){
    if (window.addEventListener) {
           el.addEventListener(eventName, fn, false);
    } else if(window.attachEvent) {
           el.attachEvent("on" + eventName, fn);
    } else {
            el["on"+eventName]=fn;
    }
}

 

这显然不是最优,若遇到 功能复杂的 类似情况 ,则函数内到处都散落着平台判断,十分影响主线思路,且程序 很多 执行时间都花费在了判断上面,不值得。


假设这个环境是java运行环境,可对应代码:

 

public static void addEvent(Node el, String eventName, Callback func) {
        if (addEventListener) {
            el.addEventListener(eventName, func, false);
        } else if (attachEvent) {
            el.attachEvent(eventName, func);
        } else {
            //el["on"+eventName]=func
        }
    }

 

那么按照面向对象的设计模式,分离变与不变的部分以及提取基类,可以重构为:

 

interface EventUtil {
    void addEvent(Node el, String eventName, Callback func);
}

class StandardEventUtil implements EventUtil {

    public void addEvent(Node el, String eventName, Callback func) {
        el.addEventListener(eventName, func, false);

    }
}

class IEEventUtil implements EventUtil {

    public void addEvent(Node el, String eventName, Callback func) {
        el.attachEvent(eventName, func);
    }
}

class FallBackEventUtil implements EventUtil {
    public void addEvent(Node el, String eventName, Callback func) {
        //el["on"+eventName]=func
    }
}

public static EventUtil getEventUtil() {
        if (eventUtil != null) return eventUtil;
        if (addEventListener) {
            return eventUtil = new StandardEventUtil();
        } else if (attachEvent) {
            return eventUtil = new IEEventUtil();
        } else {
            return eventUtil = new FallBackEventUtil();
        }

    }

 

将事件添加做为抽像的接口,各个平台实现对应的功能类,生成单例对象即可。


而以这个为思路,根据上述的单例场景,利用javascript内置的对象构造函数,以及函数随时可以重写的特性,可以优化为下面的代码:

 

var eventUtil = {
    addEvent: function(el, eventName, fn) {
        el.addEventListener(eventName, fn, false);
    }
};
if (window.addEventListener) {} else if (window.attachEvent) {
    eventUtil.addEvent = function(el, eventName, fn) {
        el.attachEvent("on" + eventName, fn);
    }
} else {
    eventUtil.addEvent = function(el, eventName, fn) {
        el["on" + eventName] = fn;
    }
}

 

进一步采用javascript的函数特性可修改为目前来说比较理想的代码:

 

var eventUtil = {
    addEvent: function() {
        if (window.addEventListener) {
            return function(el, eventName, fn) {
                el.addEventListener(eventName, fn, false);
            };
        } else if (window.attachEvent) {
            return function(el, eventName, fn) {
                el.attachEvent("on" + eventName, fn);
            };
        } else {
            return function(el, eventName, fn) {
                el["on" + eventName] = fn;
            };
        }
    }()
};
 

总结:


javascript可以说是 一门 同时具有面向对象以及函数特征的混合语言,所以如果合理利用目前成熟的面向对象设计,对于构造复杂的应用必能起到很大的帮助。

分享到:
评论

相关推荐

    .net core实现海康SDK跨平台兼容

    《.NET Core实现海康SDK跨平台兼容详解》 在当今多平台开发环境中,软件的跨平台能力成为了不可或缺的一部分。本文将深入探讨如何利用.NET Core技术实现海康SDK的跨平台兼容,涵盖Windows和Linux系统,使开发者能够...

    AR.js引擎开发:跨平台WebAR发布+.WebAR技术概览+.跨平台WebAR发布流程+跨平台兼容性问题及解决方案+.WebAR应用设计与开发+AR.js环境搭建与配置

    跨平台兼容性问题及解决方案.docx AR.js引擎开发:跨平台WebAR发布_(8).性能优化与资源管理.docx AR.js引擎开发:跨平台WebAR发布_(9).AR.js与Three.js结合使用.docx AR.js引擎开发:跨平台WebAR发布_(10).AR....

    《C/C++编写跨平台程序:实践篇》

    C/C++作为一种广泛支持的系统编程语言,具有强大的功能和性能,但在编写跨平台程序时,它的一个主要问题是直接暴露系统级API和内存对象布局,使得程序员在不同操作系统之间移植代码时会遇到障碍。为了解决这一问题,...

    SVG和Canvas绘图:SVG和Canvas的跨平台兼容性问题.docx

    SVG和Canvas绘图:SVG和Canvas的跨平台兼容性问题.docx

    C++跨平台开发技术指南.pdf

    《C++跨平台开发技术指南》是一本专注于C++语言跨平台开发的实用技术书籍。这本书详细介绍了C++在不同操作系统上,如Windows、Mac OS和Linux上开发应用程序的策略和实践。跨平台开发是软件开发领域中的一个重要方面...

    一个跨平台的聊天工具

    【标题】:“一个跨平台的聊天工具”所涉及的知识点主要涵盖了软件开发的多...总的来说,这个跨平台聊天工具的开发涉及到了QT框架的应用、网络编程、多平台兼容性策略以及局域网通信技术,体现了IT领域的综合知识运用。

    跨平台的C++播放器

    本项目的目标是利用C++的高级特性和跨平台兼容性,创建一个功能强大的多媒体播放器。 在设计这样一个播放器时,首先需要关注的关键知识点包括: 1. **跨平台编程**:使用C++的一个主要原因是它的跨平台特性。为了...

    跨平台进程间通信源码

    跨平台进程间通信(IPC,Inter-Process Communication)是计算机技术中的一...通过这些资源,开发者可以学习如何在不同操作系统上构建和使用这个跨平台的进程间通信库,从而实现高效、稳定且兼容性强的进程间数据交换。

    C++ 跨平台 异步消息队列

    综上所述,"C++ 跨平台 异步消息队列"项目涉及了C++多线程编程、同步机制、队列数据结构和跨平台兼容性等多个核心知识点。通过理解和掌握这些技术,开发者可以构建出更健壮、高效的并发应用程序。

    跨平台的socket库,windows-linux-socket

    本文将深入探讨“跨平台的socket库,windows-linux-socket”这一主题,旨在帮助开发者理解如何在Windows和Linux操作系统之间实现兼容的Socket编程。 首先,Socket是操作系统提供的一种接口,用于在网络中进行进程间...

    跨平台socket封装

    3. **错误处理**:跨平台意味着需要处理各种可能出现的错误,例如网络中断、权限问题、地址冲突等。封装应该提供统一的错误处理机制,方便上层代码进行异常处理。 4. **线程安全**:在多线程环境下,socket操作需要...

    EasyTcpServer-优化线程-跨平台兼容-utf8 bom字符编码.zip

    本项目着重关注了三个方面:线程优化、跨平台兼容性和UTF-8 BOM字符编码处理,这些都是构建高效、稳定且具有广泛适用性的网络服务的关键因素。 首先,让我们深入探讨线程优化。在多客户端并发连接的场景下,服务器...

    数据库同步工具(跨平台)

    跨平台的特性使得这种工具能够广泛应用于各种场景,比如开发者可以在开发环境中使用Windows,而在生产环境中使用Linux,而无需担心数据同步的问题。 描述中提及的"支持各种数据库类型"意味着这款工具具备广泛的...

    c++ 跨平台线程 线程池

    - `spthread.h`看起来是一个自定义的线程库,可能是为跨平台兼容性设计的,它可能封装了不同操作系统的线程API,提供统一的接口。 - 在C++中,这样的库可以帮助开发者编写无需关心底层操作系统差异的代码,提高...

    如何把flash转换为html5.docx

    另一方面,Adobe的Wallaby是另一款Flash转HTML5的工具,它同样旨在帮助开发者解决跨平台兼容问题。尽管详细功能和适用范围未在描述中明确,但可以推测它也致力于将Flash内容转换为HTML5,以适应那些不支持Flash的...

    Html5与APP开发比较心得.pdf

    尽管HTML5的Runtime和浏览器兼容性曾是挑战,但现在有了如Modernizr这样的库,可以有效解决跨平台兼容问题。同时,HTML5的HTML、CSS3等技术也为开发者提供了便利。 最后,用户体验是决定用户选择的关键因素。原生...

    工厂MES系统移动应用_技术方案

    2. **跨平台兼容问题**:不同移动平台的技术差异导致同一应用在不同平台上的实现方式存在较大差异,这增加了开发和维护的复杂性。 3. **应用更新周期长**:由于应用商店的审核机制,尤其是iOS平台上的长时间审核过程...

    c语言跨平台互斥锁封装

    而且跨平台开发中,在业务逻辑里写不同平台的兼容代码,容易造成过多的冗余,以及代码结构过于复杂的问题。为了提供一种统一的调用方式,封装一套跨平台的互斥锁还是有必要的。 本资源在Windows、Linux、Android、...

    C++跨平台插件实例.

    C接口是语言无关的,可以被任何支持C调用约定的语言调用,从而确保了跨平台兼容性。Boost.Python则允许C++代码与Python脚本进行交互,利用Python的易用性和跨平台特性,实现C++插件的跨平台目标。 实现C++跨平台...

Global site tag (gtag.js) - Google Analytics