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

GWT中对不同浏览器兼容性实现原理

    博客分类:
  • GWT
阅读更多
目前大多数的  JS框架都有跨浏览器到功能,他们会根据不同的浏览器来执行不同的代码,从而达到一致的功能。
GWT也有这种兼容所有浏览器到功能,他是如何实现的呢。

GWT中每一个模块都有一个gwt.xml配置文件,
如: com.google.gwt.dom.DOM.gwt.xml这个配置文件
<module>
  <inherits name="com.google.gwt.core.Core"/>
  <inherits name="com.google.gwt.user.UserAgent"/>

  <replace-with class="com.google.gwt.dom.client.DOMImplOpera">
    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
    <when-property-is name="user.agent" value="opera"/>
  </replace-with>

  <replace-with class="com.google.gwt.dom.client.DOMImplSafari">
    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
    <when-property-is name="user.agent" value="safari"/>
  </replace-with>

  <replace-with class="com.google.gwt.dom.client.DOMImplIE8">
    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
    <when-property-is name="user.agent" value="ie8"/>
  </replace-with>

  <replace-with class="com.google.gwt.dom.client.DOMImplIE6">
    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
    <when-property-is name="user.agent" value="ie6"/>
  </replace-with>

  <replace-with class="com.google.gwt.dom.client.DOMImplMozilla">
    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
    <when-property-is name="user.agent" value="gecko1_8"/>
  </replace-with>

  <replace-with class="com.google.gwt.dom.client.DOMImplMozillaOld">
    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
    <when-property-is name="user.agent" value="gecko"/>
  </replace-with>
</module>



这里有很多replace-with的标签,仔细想一下应该可以猜到他的功能。
当属性user.agent的值为ie6时,用com.google.gwt.dom.client.DOMImplIE6这个类来实现com.google.gwt.dom.client.DOMImpl这个抽象类。
也就是说GWT通过判断user.agent来判断用户使用的是什么浏览器,然后用相应的实现类来执行,从而达到不同浏览器到兼容性。

那么这个user.agent属性是哪来的呢,观察这个xml的开头可以看到此模块继承了<inherits name="com.google.gwt.user.UserAgent"/>
应该可以在这个UserAgent模块里看出端倪来。

看一下UserAgent模块的xml文件
<module>

  <!-- Browser-sensitive code should use the 'user.agent' property -->
  <define-property name="user.agent" values="ie6,ie8,gecko,gecko1_8,safari,opera"/>

  <property-provider name="user.agent"><![CDATA[
      var ua = navigator.userAgent.toLowerCase();
      var makeVersion = function(result) {
        return (parseInt(result[1]) * 1000) + parseInt(result[2]);
      };

      if (ua.indexOf("opera") != -1) {
        return "opera";
      } else if (ua.indexOf("webkit") != -1) {
        return "safari";
      } else if (ua.indexOf("msie") != -1) {
        if (document.documentMode >= 8) {
          return "ie8";
        } else {
          var result = /msie ([0-9]+)\.([0-9]+)/.exec(ua);
          if (result && result.length == 3) {
            var v = makeVersion(result);
            if (v >= 6000) {
              return "ie6";
            }
          }
        }
      } else if (ua.indexOf("gecko") != -1) {
        var result = /rv:([0-9]+)\.([0-9]+)/.exec(ua);
        if (result && result.length == 3) {
          if (makeVersion(result) >= 1008)
            return "gecko1_8";
          }
        return "gecko";
      }
      return "unknown";
  ]]></property-provider>

  <!-- Deferred binding to optimize JRE classes based on user agent. -->
  <inherits name="com.google.gwt.emul.EmulationWithUserAgent"/>
</module>

这里有一个property-provider标签,这就是提供user.agent属性的标签,
CDATA里面的代码就是js代码,通过这个js代码来判断浏览器类型
仔细看一下这段js代码:
      var ua = navigator.userAgent.toLowerCase();
      var makeVersion = function(result) {
        return (parseInt(result[1]) * 1000) + parseInt(result[2]);
      };

      if (ua.indexOf("opera") != -1) {
        return "opera";
      } else if (ua.indexOf("webkit") != -1) {
        return "safari";
      } else if (ua.indexOf("msie") != -1) {
        if (document.documentMode >= 8) {
          return "ie8";
        } else {
          var result = /msie ([0-9]+)\.([0-9]+)/.exec(ua);
          if (result && result.length == 3) {
            var v = makeVersion(result);
            if (v >= 6000) {
              return "ie6";
            }
          }
        }
      } else if (ua.indexOf("gecko") != -1) {
        var result = /rv:([0-9]+)\.([0-9]+)/.exec(ua);
        if (result && result.length == 3) {
          if (makeVersion(result) >= 1008)
            return "gecko1_8";
          }
        return "gecko";
      }
      return "unknown";


navigator.userAgent.toLowerCase();

这句话就能拿到浏览器的相关信息,并把它们变成小写字母。

不同浏览器提供的内容不同,分别如下、
      IE

      Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
      Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
      Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
      Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
      其中,版本号是MSIE之后的数字。

      Firefox

      Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
      Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
      Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12
      其中,版本号是Firefox之后的数字。

      Opera

      Opera/9.27 (Windows NT 5.2; U; zh-cn)
      Opera/8.0 (Macintosh; PPC Mac OS X; U; en)
      Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0
      其中,版本号是靠近Opera的数字。

      Safari

      Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13
      Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3
      其版本号是Version之后的数字。

      Chrome

      Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
      其中,版本号在Chrome只后的数字。

就是对这个字符串进行判断,来得知浏览器类型,然后设置属性user.agent来告知gwt程序
2
0
分享到:
评论
1 楼 ocaicai 2012-10-18  
很有研究能力,思维清晰!

相关推荐

    gwt开发实例实现

    - **跨浏览器兼容性**:GWT生成的JavaScript代码经过精心优化,能够在主流浏览器中良好运行。 - **强大的开发工具**:GWT提供了丰富的开发工具,如开发服务器、编译器、测试工具等,简化开发流程。 - **可维护性...

    GWT学习经验及实例指导

    GWT利用Java的强类型和丰富的库来简化Web应用的开发,同时克服了Ajax开发中的挑战,如浏览器兼容性和调试难题。 【GWT 的优势】 GWT的主要优点在于它为Java开发者提供了一个熟悉的开发环境,避免了直接编写...

    GWT快速开发(GWT) 是一个Java软件开发框架用于开发类似于Google Maps和Gmail的AJAX应用程序。GWT的设计参考Java AWT包设计,类命名规则、接口设计、事件监听等。你可以用Java编程语言开发你的界面,然后用GWT编译器将Java类转换成适合浏览器执行的...

    - **跨平台兼容性**: GWT编译器能够将Java代码转换为浏览器兼容的JavaScript和HTML代码。 - **高性能**: 通过高效的编译器优化,GWT可以生成高性能的前端代码。 - **易于开发**: 开发者可以直接使用熟悉的Java...

    GWT

    1. **Java编程**:GWT允许开发者使用Java语言进行前端开发,利用Java的强大特性和丰富的库,同时避免了JavaScript的语法差异和兼容性问题。 2. **自动编译**:GWT将Java代码编译为优化过的JavaScript,这使得应用...

    gwt 实现的一个简单计算器

    - **"google"**:GWT是由Google开发并维护的开源项目,与Google的其他Web服务和技术(如App Engine)有很好的兼容性。 - **"calculator"**:计算器是编程中常见的示例应用,用于演示基本的用户交互和业务逻辑实现...

    GWT Demo,GWT学习时的一些小例子

    GWT通过Java语言进行开发,并将Java代码编译成高效的JavaScript,使得开发者可以利用Java的强大特性和丰富的库来创建复杂的Web应用,同时避免了直接编写JavaScript的繁琐和兼容性问题。 **GWT 的核心概念** 1. **...

    GWT初学者手册

    2. **跨浏览器支持**:GWT设计了一个架构,能够在单一代码基础上支持多种浏览器,减少了处理浏览器兼容性问题的困扰。 3. **模块系统(Module)**:GWT允许定义模块,方便组织和管理项目。 二、语言特性的支持与...

    GWT快速开发.pdf

    - **跨浏览器兼容性**:GWT能够自动生成针对不同浏览器优化的JavaScript代码,确保应用在各种浏览器环境下都能正常工作。 - **强大的用户界面组件库**:提供了丰富的UI组件,如Button、Label等,方便快速构建用户...

    gwt-jar.rar

    3. **跨浏览器兼容**:GWT支持多种主流浏览器,确保应用在不同平台上的一致性。 4. **开发工具**:GWT提供了一套集成开发环境(IDE)插件,如Eclipse和IntelliJ IDEA,便于调试和开发。 5. **异步通信**:GWT提供了...

    一个简单的GWT示例

    4. **跨浏览器兼容**: GWT支持多种主流浏览器,包括Chrome、Firefox、Safari、Internet Explorer等,确保应用在不同平台上的一致性。 5. **异步通信**: GWT 提供了RPC (Remote Procedure Call)机制,使得客户端和...

    GWT反射

    通过GWT反射,开发者可以在客户端代码中实现类似于服务器端Java反射的功能,但需注意性能和兼容性问题。 【知识点详解】: 1. **GWT的编译过程**:GWT将Java代码转换为优化过的JavaScript,这一过程称为“交叉编译...

    gwt教程

    1. **跨浏览器兼容**:GWT编译后的代码可以在主流浏览器上运行,包括Chrome、Firefox、Safari、Internet Explorer等,无需为每个浏览器编写特定的代码。 2. **丰富的UI组件**:GWT提供了大量的UI控件,如按钮、...

    GWT-source

    9. **兼容性和性能优化**:GWT致力于跨浏览器兼容性,支持主流浏览器,同时也提供多种性能优化策略,如代码分割、延迟加载和本地化缓存等。 10. **社区和生态**:GWT拥有活跃的社区,提供了许多开源项目和插件,如...

    初次接触GWT,知识点概括

    - **跨浏览器兼容**:GWT支持多种主流浏览器,包括Chrome、Firefox、Safari和Internet Explorer。 - **自动编译和优化**:GWT的编译器会进行死代码消除、代码分割和优化,生成高效的JavaScript代码。 - **丰富的...

    SmartGWT 12.0

    SmartGWT 12.0 应该保持了对旧版本的向后兼容性,同时也可能引入了对新浏览器特性的支持,如HTML5特性。此外,升级到新版本通常意味着修复了已知问题,并且增加了新的功能。 8. **开发工具支持** SmartGWT 可以与...

    浅论struts2与gwt

    此外,由于GWT生成的是JavaScript代码,因此需要考虑对不同浏览器的兼容性问题。还有,Struts2的XML配置文件和GWT的代码生成方式可能会增加项目的复杂性。 在实际开发中,理解这两种框架的工作原理和交互方式至关...

    基于GWT的基金管理系统的设计.pdf

    8. 在基于GWT的基金管理系统中,客户端使用GWT开发,服务端采用GWT-RPC实现业务逻辑,并通过DAO层对数据库进行操作。 9.整个系统架构采用MVC模式,实现了高内聚、低耦合的特点,提高了系统的性能和可维护性。 10. ...

    Accelerated GWT: Building Enterprise Google Web Toolkit Applications

    书中还强调了GWT在处理浏览器兼容性方面的优势。由于GWT自动生成JavaScript代码,并能智能地处理不同浏览器的差异,因此开发者无需为每个浏览器编写特定的代码,大大简化了多浏览器支持的工作量。同时,GWT还提供了...

Global site tag (gtag.js) - Google Analytics