我需要在表单重新呈现后重新执行 javascript。简单地说,在 XHTML 内容之后放入 javascript 将无济于事,因为它是部分请求。此外,我不能使用“onComplete”,因为我从中重新呈现表单的命令按钮在多个地方使用的 JSF 组件中。我需要在本地进行修复。
有什么办法吗?我想知道 f:ajax 在这种情况下是否会有所帮助。
请让我知道,如果有人对此有所了解。
我需要在表单重新呈现后重新执行 javascript。简单地说,在 XHTML 内容之后放入 javascript 将无济于事,因为它是部分请求。此外,我不能使用“onComplete”,因为我从中重新呈现表单的命令按钮在多个地方使用的 JSF 组件中。我需要在本地进行修复。
有什么办法吗?我想知道 f:ajax 在这种情况下是否会有所帮助。
请让我知道,如果有人对此有所了解。
最简单的方法是将JS函数调用放在待更新组件本身中。
<h:form>
...
<h:commandButton value="submit"><f:ajax render="@form" /></h:commandButton>
<h:outputScript>someFunction();</h:outputScript>
</h:form>
这样,它会在页面加载时执行,并且如果表单被 ajax 更新,它也会执行。
至于它<f:ajax>
本身,你也可以使用它的onevent
属性。
<f:ajax ... onevent="handleAjax" />
和
function handleAjax(data) {
var status = data.status;
switch(status) {
case "begin":
// This is invoked right before ajax request is sent.
break;
case "complete":
// This is invoked right after ajax response is returned.
break;
case "success":
// This is invoked right after successful processing of ajax response and update of HTML DOM.
someFunction();
break;
}
}
您可以添加一个全局挂钩,jsf.ajax.addOnEvent()
这样您就不需要在功能要求适用于每个 ajax 请求的每个onevent
属性中指定它。<f:ajax>
jsf.ajax.addOnEvent(handleAjax);
另一种方法是使用OmniFaces JSF 实用程序库<h:onloadScript>
,该库正是为此目的提供了 OmniFaces JSF 实用程序库。你可以把它放在你想要的头上。
<h:onloadScript>someFunction();</h:onloadScript>
这会在视图上的每个 ajax 请求上自动重新执行,因此您无需将其复制到视图中可以进行 ajax 更新的多个单独位置,或者在每个<f:ajax render>
.
如果你想用 JQuery/JS 做复杂的操作并且不是特别关心这个,BalusC 第一个答案是最合适的
对于更复杂的 JS,如果您决定使用全局事件处理程序,例如您使用 JS 将bind
函数传递给元素,这些函数将被重新绑定(因此执行两次),因此您需要一些方法来确定需要什么重新执行。
我最后做的是从事件回调中获取 id 并只执行相关的 JS/JQuery:
jsf.ajax.addOnEvent(ajaxCompleteProcess);
function ajaxCompleteProcess(data) {
if (data.status && data.status === 'success') {
var children1 = data.responseXML.children;
for (i = 0; i < children1.length; i += 1) {
var children2 = children1[i].children;
for (j = 0; j < children2.length; j += 1) {
var children3 = children2[j].children;
for (y = 0; y < children3.length; y += 1) {
if (children3[y].id.indexOf('javax.faces.ViewState') != -1)
continue;
elementProcess(('#' + children3[y].id.replace(/\:/g, '\\:')));
}
}
}
}
}
注意:这些丑陋for
的循环可能不是必需的(您可以使用 clildren[0]),但我还没有时间检查规范。
您可以将 jQuery 添加到您的应用程序并执行以下操作:
$(#yourComponentId).load(function(){
//execute javascript.
});
你可以看看这里http://api.jquery.com/load/
LE:那是在
$(document).ready(function(){
}
俄亥俄州