用jsf-2将javascript代码封装在复合文件中
我问了这个问题,但它作为一个副本关闭了,并有一个指向这个答案的链接 也许在我的问题中,我没有充分说明我想做什么: 我想有一个复合的内部结构可能会改变在未来的版本。我希望这个组合有一个javascript函数,可以从外部调用该函数来处理所有内部细节,封装在组合中,外部没有代码部分用jsf-2将javascript代码封装在复合文件中,javascript,jsf-2,encapsulation,Javascript,Jsf 2,Encapsulation,我问了这个问题,但它作为一个副本关闭了,并有一个指向这个答案的链接 也许在我的问题中,我没有充分说明我想做什么: 我想有一个复合的内部结构可能会改变在未来的版本。我希望这个组合有一个javascript函数,可以从外部调用该函数来处理所有内部细节,封装在组合中,外部没有代码部分 <h:form onload="this.myfunc=function(){alert('Hello world');}" ... 首先 通过提供ID调用复合组件: <core:yourComposite
<h:form onload="this.myfunc=function(){alert('Hello world');}" ...
首先
通过提供ID调用复合组件:
<core:yourComposite id="someId" .../>
第二
在h:form属性上添加prependId=false
,以防止自动id,并为该表单提供id
现在您可以检查呈现的html,您将看到具有映射语义id的表单,如:someId:formId
现在您可以在表单中插入脚本调用:
getElementById('#{cc.attrs.id}:formId')
在HTML中非常正常在解析完end标记后,元素才在DOM中可用。确保脚本在
之后运行。我建议通过一些不错的HTMLDOM/JS教程来掌握它的基本概念。@BalusC是的,这是我的一个错误。但是将h:outputScript放在表单后面并没有多大帮助。“this”仍然是窗口,只要我没有(未完成的)父节点或其他东西开始,我就不能使用previousSibling。或者有没有一种方法(简单)可以访问树中的最后一个节点,不管它嵌套在哪里?(我可以进行迭代,但这看起来太过分了。)只需按id获取元素?@BalusC我怎么知道id?jsf在它前面加了一些东西。糟糕的建议。首先,prependId=“false”
在JSF2中是不好的做法,正如注释和副本中指出的那样,只需使用{cc.clientId}
。其次,如果OP的另一个错误被详细指出也很好({cc.attrs.id}
方法是胡说八道)。@BalusC:从你的评论中可以看出:“其次,如果OP的另一个错误被详细指出也很好({cc.attrs.id}方法是胡说八道)。“如果是这样,你为什么不愿意提及?
<composite:implementation>
<h:form id="${cc.attrs.imgId}" styleClass="small">
<f:event type="postAddToView" listener="#{mBean.register}" />
<f:attribute name="myId" value="hmta${cc.attrs.imgId}" />
<h:graphicImage width="${cc.attrs.width}" id="${cc.attrs.imgId}"
onclick="this.nextSibling.value=mods(event)" onmouseover="aa=this.id"
value="images/img?#{cc.attrs.flav}=#{Math.random()}">
<f:ajax event="click" execute="@this k"
listener="#{mBean.handleEvent}" render="@this">
</f:ajax>
</h:graphicImage>
<h:inputHidden id="k" value="#{mBean.keyX}" />
</h:form>
<h:outputScript>window.document.getElementById('#{cc.clientId}:#{cc.attrs.imgId}').myfunc=function() {alert("newly called"+#{mBean.keyX})};</h:outputScript>
</composite:implementation>
<core:yourComposite id="someId" .../>