Почему использование любого элемента a4j в jsf добавляет к странице код второго тега 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. Кто-нибудь может дать мне подсказку, как это исправить?
1 ответ
Хорошо, это проблема библиотеки 3.1.6.SR1, последней, которая поддерживает версию jsf 1.1. Я нашел в Google следующее решение https://developer.jboss.org/thread/196997?tstart=0. Однако он не идеален и не работает в любой ситуации. Из-за этого я пытался решить эту проблему другими способами, и, как предложено в приведенной выше ссылке, я изменил файл AJAX.js в форме richfaces-impl.jar. Я взял файл AJAX.js из версии richfaces-3.2 и заменил код в 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;
}
И это все. С этими изменениями эта проблема больше не существует.