2012-08-06 2 views
2

GWT가 유효한 XHTML을 생성하도록 만들 수 없습니다. 우리 프로젝트에서는 테이블 레이아웃을 사용하기 때문에 페이지에 많은 테이블이 있으며 <colgroup> 태그와 함께 <col> 태그가 들어 있습니다. <col> 태그는 기본 HTML 템플리트에 어떤 doctype이 있는지에 관계없이 닫히지 않습니다. 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을 텍스트로 삽입하지 않습니다. 그것은 doc.createElement(...)과 함께 JavaScript의 appendChild(...) 메서드를 사용합니다.

웹 및 개발자 모드 모두 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> 
+0

응용 프로그램이 상당히 크고 복잡하므로 여기서는 Java 소스 코드를 보여주는 것이 복잡합니다. 여기에 기본 HTML 및 gwt.xml 파일을 넣을 것입니다. – Vic

+0

Andrey, 특정 게시물이 필요한 경우 게시 해주세요. – Vic

답변

1

후 GWT는 전혀 태그를 생성하지 않습니다. DOM을 조작하고 HTML로 serialize하는 도구를 사용하고 있습니다.

콘텐츠 형식이 application/xhtml+xml 인 원본 문서를 제공하여 XML 구문 분석 모드를 트리거하면 브라우저가 XHTML로 연결되도록 설득 할 수 있습니다.

즉, HTML은 브라우저의 기본 마크 업 언어이며 대화식으로 사용하는 것이 가장 좋습니다. XHTML을 내보내는 대신 HTML을 가져 와서 마크 업을 보내는 곳에 HTML 파서를 사용하십시오.

+0

Quentin의 답변 주셔서 감사합니다. 그러나 기본 HTML 파일의 MIME 유형을 변경하면 응용 프로그램을 사용할 수 없게됩니다. Chrome은 "Object # 에 'write'", "Firefox에서"사용할 수 없거나 더 이상 사용할 수없는 객체를 사용하려고 시도했습니다. "라는 메서드가 없습니다. 해결할 수 있다면 지금 알아 냈어. – Vic

+0

마지막 단락에서 "application/xhtml + xml"MIME 형식을 사용하지 않고 XML 구조가 필요할 때 일종의 변환을 사용한다는 뜻입니까? 나에 관해서는, 처음 제안이 더 좋았습니다. 나는 XHTML이 브라우저에서 잘 지원되는 좋은 HTML 포맷이라고 생각한다. XML 파서가 XML 파서와 함께 작업 할 수 있습니다. 나는 왜 HTML이 더 좋은지 이해하지 못한다. – Vic

+0

브라우저는 XML 모드에서'document.write'를 지원하지 않는 경향이 있습니다. DOM 조작을 대신 사용하십시오. – Quentin

관련 문제