У меня есть приложение JSF 1.2 (Sun RI, Facelets, Richfaces), которое использовалось только в браузерах IE6. Теперь мы также должны поддерживать Firefox (да!).JSF CommandLink не работает в Firefox после целой формы reRender
На одной из моих страниц у меня есть форма, содержащая кнопку, которая будет повторно отображать всю форму. После повторной рендеринга в этой форме добавляются некоторые ссылки (<h:commandLink/>
).
для JSF код выглядит следующим образом:
<h:form id="foobar">
...
<a4j:commandButton ... reRender="foobar"/>
...
<h:commandLink .../>
</h:form>
Моя проблема связана с HTML-кодом, генерируемым компонентом команды линии связи, которая выглядит следующим образом:
<a href="#" onclick="if(typeof jsfcljs == 'function'){jsfcljs(document.forms['foobar'],'...','');}return false">bla bla</a>
(для информации, jsfcljs
является функцией Javascript, генерируемой компонентом <h:commandLink/>
)
Проблема в том, что document.forms["foobar"]
работает ну, когда страница изначально отображается, но как только форма повторно отображается после вызова Ajax, этот код больше не работает в Firefox (но работает на IE6).
Это результат ошибки Javascript, когда я нажимаю на одну ссылку в форме после вызова Ajax.
Обратите внимание, что, если я позвоню document.getElementById("foobar");
после вызова Ajax, Firefox основывает свою форму ...
Если рассмотрим следующую функцию JavaScript:
function test() {
var e = document.forms;
var tmp = "";
for (i = 0; i < e.length; i++) {
tmp = tmp + e[i].id + " ; ";
}
alert(tmp);
}
, когда я запускаю его до и после Ajax вызов, я получаю следующие результаты:
someForm ; anotherForm ; foobar ; // Before Ajax call on FF
someForm ; anotherForm ; // After Ajax call on FF. PROBLEM HERE!
someForm ; anotherForm ; foobar ; // Before Ajax call on IE6
someForm ; anotherForm ; foobar ; // After Ajax call on IE6
Вот мои мысли о причине проблемы:
Когда ответ Ajax получен на стороне клиента, a4j удаляет элементы-объекты reRender (в частности, мою форму foobar
) из объектов дерева DOM, что приводит к удалению из массива document.forms
. Затем он снова добавляет форму foobar
с ее новым контентом. Но Firefox делает не обновляет массив document.forms
, в то время как IE6 делает. Именно поэтому document.forms["foobar"]
возвращает undefined
после вызова Ajax.
Мое решение для решения этой проблемы - изменить атрибут reRender
, чтобы повторно отобразить только отдельные части формы, а не форму. Таким образом, мои ссылки работают.
Однако, я хотел знать, есть ли другой способ решить эту проблему, не изменяя атрибут reRender
. Любая идея?
Редактировать
Javascript код, когда ссылка команды нажата следующий:
function dpf(f) {
var adp = f.adp;
if (adp != null) {
for (var i = 0; i < adp.length; i++) {
f.removeChild(adp[i]);
}
}
};
function apf(f, pvp) {
var adp = new Array();
f.adp = adp;
var ps = pvp.split(',');
for (var i = 0, ii = 0; i < ps.length; i++, ii++) {
var p = document.createElement("input");
p.type = "hidden";
p.name = ps[i];
p.value = ps[i + 1];
f.appendChild(p);
adp[ii] = p;
i += 1;
}
};
function jsfcljs(f, pvp, t) {
apf(f, pvp);
var ft = f.target;
if (t) {
f.target = t;
}
f.submit();
f.target = ft;
dpf(f);
};
В OnClick атрибута <h:commandLink>
, мы называем jsfcljs(document.forms['foobar'], 'someId', '')
, который вычисляется в jsfcljs(undefined, 'someId', '')
. Затем, когда вызывается f
, я получаю ошибку Javacript, которая говорит, что f is undefined
.
MyFaces или RI? – Bozho
ВС реализации. – romaintaz