Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jsf通过ajax调用传输和触发javascript代码_Javascript_Ajax_Jsf_Jsf 2_Callback - Fatal编程技术网

使用jsf通过ajax调用传输和触发javascript代码

使用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

我有一些带有标记的jsf代码,该标记由ajax调用重新呈现。它包含如下内容

<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()}&amp;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,所以这只是偶然的。那么什么是正确的方法呢????