2

我不能让 GWT 生成有效的 XHTML。在我们的项目中,我们使用表格布局,因此页面上有很多表格,它们里面有<colgroup>标签和<col>标签。无论在主 HTML 模板中放置哪种 doctype ,<col>标签都不会关闭。XHTML Transitional 和 XHTML String 都试过了。结果是一样的。

<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(...).

该问题在 Web 和 Dev 模式下的 Chrome、Firefox 和 IE 中重现。它发生在不使用 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>
4

1 回答 1

1

如果这发生在客户端,那么 GWT 根本不会生成标签。它正在操作 DOM,而您正在使用一种工具将其序列化为 HTML。

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

也就是说,HTML 是浏览器的原生标记语言,最好使用它与它们进行通信。与其取出 XHTML,不如取出 HTML 并在您将标记发送到的地方使用 HTML 解析器。

于 2012-08-06T12:32:44.613 回答