我有一个select下拉菜单,其中一个onChange事件将触发一个Ajax调用来重新填充表单,然后调用javascript函数init(),它将根据新的数据重新排序表单中的可排序div。使用调试器,我发现在完成init()之后,div将按预期的顺序排序,但随后它将执行:
responder = function(event) {
Event.extend(event, element);
handler.call(element, event);
};在函数函数_createResponder(element,eventName,处理程序)中prototype.js中的,然后执行
return !scope ? method : function() {
return method.apply(scope, arguments || []);
}; // Function在函数function(/Object/scope,/Function|String/method /、.../) in jsf.js中,将div重置回原来的顺序。
下面是我的facelet中的一个简化代码片段:
<body onload="init()">
<form id="MaintainPreferencesBean">
<t:selectOneMenu id="selectLayout" value="#{maintainPreferencesBean.layoutIndex}">
<f:selectItems value="#{maintainPreferencesBean.layoutNames}" />
<f:ajax listener="#{maintainPreferencesBean.setLayout}" render="@form" onevent="init()" />
</t:selectOneMenu>
<div id="sortable">
<div id="demoGroup" class="dataGroup"></div>
<div id="offenseGroup" class="dataGroup"></div>
</div>
</form>
</body>以下是javascript:
function init() {
changeOrder("sortable", "dataGroup", document.getElementById("MaintainPreferencesBean:selectLayout").selectedIndex);
Sortable.create("sortable", {
tag : 'div'
});
}
function changeOrder(container, className, layoutIndex) {
var divs = document.getElementById(container).getElementsByClassName(
className);
for ( var i = 0; i < groupNamesArray.length; i++) {
var div = document
.getElementById(groupNamesArray[desiredOrder[layoutIndex][i]]);
var insPt = divs[i];
if (insPt != null && insPt != div)
insPt.parentNode.insertBefore(div, insPt);
}
}注意,在非Ajax页面刷新时,div确实得到了正确的排序。另外,当我使用valueChangeListener (通常的阶段解决方案)而不是Ajax时,排序也是有效的。
发布于 2016-06-08 00:44:46
结果,我需要指定何时执行javascript。
更多信息可以在这里找到:How to re-execute javascript function after form reRender?
https://stackoverflow.com/questions/37689922
复制相似问题