jsf
  • iframe
  • richfaces
  • ajax4jsf
  • jsf-1.1
  • 2016-01-07 42 views 2 likes 
    2

    在我的JSF頁面的代碼,我有一個結構類同這一個:爲什麼在jsf中使用任何a4j元素會將頁面代碼添加到第二個body和head標籤中?

    <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:

    <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元素:按鈕,那麼這段代碼是我的輸出HTML文件生成在我的頁面代碼中,它複製了現有的body和html標籤(前兩行)。我使用的richfaces版本是3.1.6.SR1。任何人都可以給我一個提示如何解決它?

    回答

    2

    好的,這是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; 
        } 
    

    而這一切。有了這個變化,這個問題就不存在了。

    +0

    我有同樣的問題,我試過你的解決方案,不幸的是沒有工作。如果我刪除了在AJAX.js中寫入文檔的代碼,會不會是一個問題?謝謝。 –

    相關問題