3

私の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 には、次のリッチフェイス ライブラリが含まれています。

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

a4j:button などのページ コードで a4j 要素を使用しようとすると、出力 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>

これらの最後の 2 行は、ページ コードで a4j 要素を使用し、既存の body タグと html タグ (最初の 2 行) を複製するときに追加されます。私が使用しているリッチフェイスのバージョンは 3.1.6.SR1 です。誰でもそれを修正する方法を教えてもらえますか?

4

1 に答える 1

4

これは、jsf 1.1 バージョンをサポートする最後のライブラリである 3.1.6.SR1 ライブラリの問題です。Google で解決策https://developer.jboss.org/thread/196997?tstart=0を見つけました。ただし、これは完璧ではなく、すべての状況で機能するわけではありません。このため、私はこの問題を他の方法で解決しようとしていましたが、上記のリンクの提案として、AJAX.js ファイル形式を richfaces-impl.jar に変更しました。Richfaces-3.2 バージョンから AJAX.js ファイルを取得し、3.1.6.SR1 のコードを置き換えました。次の部品を変更する必要があります。

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;
    }

それだけです。この変更により、この問題はなくなりました。

于 2016-04-13T12:42:38.610 に答える