2012-08-06 67 views
2

我无法让GWT生成有效的XHTML。在我们的项目中,我们使用表格布局,因此页面上有很多表格,并且里面有<colgroup>标签以及<col>标签。无论doctype放在主HTML模板中,<col>标记都不会关闭。 XHTML Transitional和XHTML String都已经尝试过。结果是一样的。GWT不呈现封闭的XHTML标记

<table class="header-grid" cellpadding="0" cellspacing="0"> 
    <colgroup> 
     <col class="header-left"> 
     <col class="header-center"> 
     <col class="header-right"> 
    </colgroup> 
    <tbody> 
     ... 
    </tbody> 
</table&gt; 

<input>元素也没有关闭。我的猜测是,可能有其他未正确关闭的元素,但它们未在应用程序中使用,或者我没有找到它们。

仅供参考。 GWT操作DOM,并且不会以文本方式对内部HTML进行任何插入。它使用JavaScript的appendChild(...)方法以及doc.createElement(...)

该问题在Chrome,Firefox和IE中均以Web和Dev模式呈现。它发生在未使用UIBinder的页面上。

GWT版本:2.4.0。

主要HTML:主模块的

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <meta name="svg.render.forceflash" content="false"/> 
    <meta name="gwt:property" content="locale=en"/> 
    <meta http-equiv="X-UA-Compatible" content="IE=8, IE9"/> 
    <title>NPQ Facility Management</title> 
    <script src="https://maps-api-ssl.google.com/maps/api/js?v=3&amp;sensor=false" type="text/javascript"></script> 
    <script type="text/javascript" language="javascript" src="FMInsight.nocache.js"></script> 
    <script type="text/javascript" language="javascript" src="gr/abiss/js/sarissa/sarissa.js"></script> 

    <script type="text/javascript" src="js/svg-web/svg.js" data-path="js/svg-web" data-debug="false"></script> 
    <script type="text/javascript" src="js/svgviewer.js"></script> 

    <link media="all" type="text/css" 
      href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/base/jquery-ui.css" rel="stylesheet"/> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" 
      type="text/javascript" charset="utf-8"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js" 
      type="text/javascript" charset="utf-8"></script> 
</head> 
<body> 
    <iframe id="__printingFrame" style="width:0; height:0;border: 0"></iframe> 
    <iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe> 
</body> 
</html> 

GWT XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<module rename-to="FMInsight"> 
    <!-- Inheriting the core Web Toolkit stuff. --> 
    <inherits name="com.google.gwt.user.User"/> 
    <inherits name="com.google.gwt.inject.Inject"/> 

    <inherits name="com.npq.fm.core.common.Commons"/> 
    <inherits name="com.npq.fm.svg.viewer.SvgViewer"/> 

    <!-- Inheriting the default GWT style sheet. You can change --> 
    <!-- the theme of your GWT application by unommenting --> 
    <!-- any one of the following lines. --> 
    <inherits name="com.google.gwt.user.theme.standard.Standard"/> 
    <inherits name="com.google.gwt.user.theme.chrome.Chrome"/> 
    <!-- <inherits name="com.google.gwt.user.theme.dark.Dark"/> --> 

    <!-- Other module inherits. --> 
    <inherits name="com.google.gwt.xml.XML"/> 
    <inherits name="com.google.gwt.i18n.I18N"/> 
    <inherits name="com.google.gwt.http.HTTP"/> 
    <!-- Other module inherits. --> 
    <inherits name="com.google.gwt.user.ClippedImage"/> 
    <inherits name="com.google.gwt.maps.Maps" /> 

    <!-- Compiled languages --> 
    <!-- In main file we set only EN language and only in compilation files, 
     that inherits from this file define what languages are allowed by 
     re-defining locale like in line below: 
     <extend-property name="locale" values="en,de,fr,nl,uk"/> 
    --> 
    <extend-property name="locale" values="en"/> 
    <set-property name="locale" value="en"/> 
    <set-property-fallback name="locale" value="en"/> 

    <!-- This property provider changes from GWT parameter name --> 
    <!-- for changing application locale from "locale" to --> 
    <!-- property "sap-language". --> 
    <property-provider name="locale"><![CDATA[ 
     var defaultLocale = "en"; 
     try { 
      var locale; 

      // Looking for the locale as a url argument in SAP way 
      if (locale == null) { 
       var args = location.search; 
       var startLang = args.indexOf("sap-language"); 
       if (startLang < 0) { 
        startLang = args.indexOf("locale"); 
       } 
       if (startLang >= 0) { 
        var language = args.substring(startLang); 
        var begin = language.indexOf("=") + 1; 
        var end = language.indexOf("&"); 
        if (end == -1) { 
         end = language.length; 
        } 
        locale = language.substring(begin, end); 
        var lowerCase = locale.toLowerCase() 
        locale = lowerCase; 
       } 
      } 

      if (locale == null) { 
       // Looking for the locale on the web page 
       locale = __gwt_getMetaProperty("locale"); 
      } 

      if (locale == null) { 
       return defaultLocale; 
      } 

      while (!__gwt_isKnownPropertyValue("locale", locale)) { 
       var lastIndex = locale.lastIndexOf("_"); 
       if (lastIndex == -1) { 
        locale = defaultLocale; 
        break; 
       } else { 
        locale = locale.substring(0,lastIndex); 
       } 
      } 
      return locale; 
     } catch(e) { 
      alert("Unexpected exception in locale detection, using default=" + defaultLocale + ", " + e); 
      return defaultLocale; 
     } 
    ]]></property-provider> 

    <!-- 
     Inspired by Apache log4j PatternLayout: 
     http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html 
    --> 
    <set-configuration-property name="log_pattern" value="%d [%-2p] %F %M: %m%n"/> 
    <!--<set-configuration-property name="log_pattern" value="%d [%-2p] %m%n"/>--> 

    <set-property name="log_FirebugLogger" value="ENABLED"/> 
    <set-property name="log_GWTLogger" value="ENABLED"/> 
    <set-property name="log_DivLogger" value="ENABLED"/> 

    <!-- Loggers are disabled by default --> 
    <set-property name="log_ConsoleLogger" value="DISABLED"/> 
    <set-property name="log_SystemLogger" value="DISABLED"/> 
    <set-property name="log_WindowLogger" value="DISABLED"/> 

    <!-- User Agent --> 
    <!-- In main file we set only user-agent to "ie8" and 
     only in compilation files, that inherits from this file we re-define 
     what user agents should be supported by re-defining locale like 
     in line below: 
     <set-property name="user.agent" value="gecko1_8,safari,ie6,ie8,ie9"/> 
    --> 
    <set-property name="user.agent" value="gecko1_8,safari"/> 

    <property-provider name="user.agent"><![CDATA[ 
     var defaultUserAgent = "ie7"; 
     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 && document.documentMode < 9) { 
       return "ie8"; 
      } else if (document.documentMode >= 9) { 
       return "ie9"; 
      } else { 
       return defaultUserAgent; 
      } 
     } 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 "gecko1_8"; 
     } 
     return defaultUserAgent; 
    ]]></property-provider> 

    <replace-with class="com.npq.fm.core.main.client.commons.browserspecific.impl.BrowserSpecificCommonsGecko"> 
     <when-type-is class="com.npq.fm.core.main.client.commons.browserspecific.BrowserSpecificCommons" /> 
     <any> 
      <when-property-is name="user.agent" value="gecko"/> 
      <when-property-is name="user.agent" value="gecko1_8" /> 
     </any> 
    </replace-with> 

    <replace-with class="com.npq.fm.core.main.client.commons.browserspecific.impl.BrowserSpecificCommonsIE"> 
     <when-type-is class="com.npq.fm.core.main.client.commons.browserspecific.BrowserSpecificCommons" /> 
     <any> 
      <when-property-is name="user.agent" value="ie6"/> 
      <when-property-is name="user.agent" value="ie8" /> 
      <when-property-is name="user.agent" value="ie9" /> 
     </any> 
    </replace-with> 

    <replace-with class="com.npq.fm.core.main.client.commons.browserspecific.impl.BrowserSpecificSafari"> 
     <when-type-is class="com.npq.fm.core.main.client.commons.browserspecific.BrowserSpecificCommons" /> 
     <any> 
      <when-property-is name="user.agent" value="safari"/> 
     </any> 
    </replace-with> 

    <stylesheet src="FMInsight-main.css"/> 
    <stylesheet src="res_localized/default.css"/> 

    <!-- Specifying the app entry point class. --> 
    <entry-point class="com.npq.fm.core.main.client.Main"/> 
    <inherits name="org.cobogw.gwt.user.Button"/> 
</module> 
+0

该应用程序相当大且复杂,因此在此处显示Java源代码很复杂。我将在这里放置主HTML和gwt.xml文件。 – Vic 2012-08-06 13:26:33

+0

安德烈,贴吧,如果你需要特定的东西。 – Vic 2012-08-06 13:31:31

回答

1

如果发生这种情况客户端,那么GWT是不是在所有的生成代码。它正在操纵DOM,并且正在使用一种工具将其序列化为HTML。

如果您通过以application/xhtml+xml内容类型提供原始文档来触发XML解析模式,则可能能够说服浏览器序列化为XHTML。

也就是说,HTML是浏览器的本地标记语言,最好用它来与它们进行通信。不要将XHTML取出,而应将HTML取出并在发送标记的位置使用HTML解析器。

+0

感谢您的答复昆汀。但是,更改主HTML文件的MIME类型使应用程序无法使用。 Chrome说:“对象#没有方法'写'”,Firefox:“试图使用不是或不再可用的对象”。如果可以解决的话,我现在想清楚了。 – Vic 2012-08-06 13:20:54

+0

在最后一段中,您是不是指使用“application/xhtml + xml”MIME类型并在需要XML结构时使用某种转换?至于你,你的第一个建议是更好的。我认为XHTML是一种很好的HTML格式,它很好的支持浏览器。和XML解析器可以使用它。我不明白为什么HTML更好。 – Vic 2012-08-06 13:24:08

+0

浏览器往往不支持XML模式下的“document.write”。改用DOM操作。 – Quentin 2012-08-06 13:24:40