为什么在jsf中使用任何a4j元素都会在页面代码中添加第二个body和head标记



在我的jsf页面代码中,我有一个与此类似的结构:

<frameset id="navframeset">
   <frame name="navframe" src='<c:url value="TopNavigation.jsf"/>'/>
   <frameset>
      <frame name="leftframe" src='<c:url value="Test1.jsf"/>'/>
      <frame name="tabbedframe" src='<c:url value="Test2.jsf"/>' />
</frameset>

在Test2.jsf中,我包含了以下richfaces库:

<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>

当我尝试在页面代码中使用任何一个a4j元素时,例如a4j:button,那么这个代码就会在我的输出html文件中生成:

<head>...</head>
<body>..</body>
<head><script xmlns="http://www.w3.org/1999/xhtml">A4J.AJAX._scriptEvaluated=true;</script></head>
<body marginwidth="0" marginheight="0"></body>

最后两行是在我在页面代码中使用a4j元素时添加的,它复制了现有的body和html标记(前两行)。我使用的richfaces版本是3.1.6.SR1。有人能告诉我怎么修吗?

好的,这是3.1.6.SR1库的问题,它是最后一个支持jsf 1.1版本的库。我在谷歌上找到了以下解决方案https://developer.jboss.org/thread/196997?tstart=0.然而,它并不完美,也不适用于所有情况。正因为如此,我试图用其他方式解决这个问题,作为上面链接中的建议,我将AJAX.js文件改为richfaces-impl.jar。我从richfaces-3.2版本中获取了AJAX.js文件,并替换了3.1.6.SR1中的代码。应更换以下部件:

line 1412//添加了A4J.AJAX.TestScriptEvaluation();

A4J.AJAX.processResponse = function(req) {
        A4J.AJAX.TestScriptEvaluation();
        var options = req.options;
        var ajaxResponse = req.getResponseHeader('Ajax-Response');

2014行TestScriptEvaluation函数应替换为以下函数:

//Test for re-evaluate Scripts in updated part. Opera & Safari do it.
A4J.AJAX._scriptEvaluated=false;
A4J.AJAX.TestScriptEvaluation = function () {
if ((!document.all || window.opera) && !A4J.AJAX._scriptTested){

    try{    
        // Simulate same calls as on XmlHttp
        var oDomDoc = Sarissa.getDomDocument();
        var _span = document.createElement("span");
        document.body.appendChild(_span);
        // If script evaluated with used replace method, variable will be set to true
        var xmlString = "<html xmlns='http://www.w3.org/1999/xhtml'><sc"+"ript>A4J.AJAX._scriptEvaluated=true;</scr"+"ipt></html>";
        oDomDoc = (new DOMParser()).parseFromString(xmlString, "text/xml");
        var _script=oDomDoc.getElementsByTagName("script")[0];
        if (!window.opera && !A4J.AJAX.isWebkitBreakingAmps() && _span.outerHTML) {


            _span.outerHTML = new XMLSerializer().serializeToString(_script); 
        } else {
            var importednode ;
            importednode = window.document.importNode(_script, true);
            document.body.replaceChild(importednode,_span);
        }
    } catch(e){ /* Mozilla in XHTML mode not have innerHTML */ };
}
      A4J.AJAX._scriptTested = true;
    }

仅此而已。随着这些变化,这个问题不再存在。

相关内容

  • 没有找到相关文章

最新更新