使用jsf通过ajax调用传输和触发javascript代码
我有一些带有标记的jsf代码,该标记由ajax调用重新呈现。它包含如下内容使用jsf通过ajax调用传输和触发javascript代码,javascript,ajax,jsf,jsf-2,callback,Javascript,Ajax,Jsf,Jsf 2,Callback,我有一些带有标记的jsf代码,该标记由ajax调用重新呈现。它包含如下内容 <h:outputScript>alert("Gotcha")</h:outputScript> 警报(“抓住了”) 但这只在第一次加载时执行,而不是在ajax诱导的部分渲染上执行 这只是一个很小的例子,我真正想做的是在ajax调用返回后立即触发一些服务器生成的javascript,比如 <h:outputScript>#{scriptBean.getScript()}</h
<h:outputScript>alert("Gotcha")</h:outputScript>
警报(“抓住了”)
但这只在第一次加载时执行,而不是在ajax诱导的部分渲染上执行
这只是一个很小的例子,我真正想做的是在ajax调用返回后立即触发一些服务器生成的javascript,比如
<h:outputScript>#{scriptBean.getScript()}</h:outputScript>
{scriptBean.getScript()}
我已经看到了,但是问题和答案看起来都不是针对我的问题,至少在没有其他提示或解释的情况下
而且因为我想让事情保持小而简单,并且因为我可以避免jsf:core(大部分)之上的任何东西,所以我更喜欢避免使用yafl(=另一个奇特的库)的解决方案
编辑:关于@BalusC I的评论,请发布更多上下文:
<composite:implementation>
<h:form id="${cc.attrs.imgId}" styleClass="small" onchange="alert('Gotcha0');">
<f:event type="postAddToView" listener="#{mBean.register}" />
<f:event type="preRenderView" listener="#{mBean.init}" />
<f:attribute name="flav" value="#{cc.attrs.flav}" />
<h:graphicImage width="${cc.attrs.width}" id="${cc.attrs.imgId}"
onclick="if (event.isTrusted) this.nextSibling.value=mods(event);"
onmouseover="aa=this.id" alt="not found"
onchange="alert('Gotcha1');"
value="images/img?#{cc.attrs.flav}=#{mBean.getNextCount()}&imgId=#{cc.attrs.imgId}">
<f:ajax event="click" execute="@form"
onevent="function(data) { if (data.status === 'success') {
console.log('HiHo'+data.responseCode+'\n\n'+ data.responseText+'\n\n'+data.responseXML);
me=window.document.getElementById('#{cc.clientId}:#{cc.attrs.imgId}:#{cc.attrs.imgId}');
me.nextSibling.nextSibling.value=0;
me.nextSibling.value=0;
me.myfunc=function(event)
{
console.log('keyCode='+event.keyCode+' mods='+mods(event)+'/'+this.nextSibling.id);
this.nextSibling.value=mods(event);
this.nextSibling.nextSibling.value=String.fromCharCode(event.keyCode);
this.click();
}; }; }"
listener="#{mBean.handleEvent}" render="@this">
</f:ajax>
</h:graphicImage>
<h:inputHidden id="m" value="#{mBean.keyX}" />
<h:inputHidden id="k" value="#{mBean.key}" />
</h:form>
<h:outputScript>alert("Gotcha2")</h:outputScript>
<h:outputScript>var i=0;window.document.getElementById('#{cc.clientId}:#{cc.attrs.imgId}:#{cc.attrs.imgId}').myfunc=function(event)
{
aa='#{cc.clientId}:#{cc.attrs.imgId}:#{cc.attrs.imgId}';
this.nextSibling.value=mods(event);
this.nextSibling.nextSibling.value=String.fromCharCode(event.keyCode);
this.click();
};
</h:outputScript>
</composite:implementation>
警报(“Gotcha2”)
var i=0;window.document.getElementById(“#{cc.clientId}:#{cc.attrs.imgId}:#{cc.attrs.imgId}”).myfunc=函数(事件)
{
aa='{cc.clientId}:{cc.attrs.imgId}:{cc.attrs.imgId}';
this.nextSibling.value=mods(事件);
this.nextSibling.nextSibling.value=String.fromCharCode(event.keyCode);
这个。单击();
};
“Gotcha2”仅在加载时显示,对于复合的每个实例显示一次,但在通过ajax调用重新呈现组件时不显示
“Gotcha0”和“Gotcha1”被完全忽略
组件上的每个ajax调用都会显示“HiHo”,但我希望该函数仅在呈现组件时启动,这是一个细微的区别,因为我可能会在服务器端操作呈现列表,如
private void addToRenderMap(String obj) {
FacesContext context = FacesContext.getCurrentInstance();
Collection<String> renderIds = context.getPartialViewContext().getRenderIds();
renderIds.add(obj);
}
private void addToRenderMap(字符串obj){
FacesContext context=FacesContext.getCurrentInstance();
集合renderIds=context.getPartialViewContext().getRenderIds();
renderIds.add(obj);
}
甚至从列表中删除调用组件。
(例如,对于按键“i”,我只想在其他组件中显示图像信息,并避免不必要的图像数据重新发送。)
Edit2:我发现,onchange实际上更像是接受输入的字段的onvaluechange,因此忽略这部分代码也就不足为奇了。@BalusC,谢谢你的提示。不,显然这只会呈现h:form。不过,把这些东西放在表格之外是有原因的,但我不记得了。我会做一些实验。@BalusC你说得对,非常感谢。当我把h:outputScript放在h:graphicImage的末尾之前时,它就工作了!我应该删除这个问题吗?@BalusC,sad,所以这只是偶然的。那么什么是正确的方法呢????