如何在 EL(jsf,复合)中使用生成的 id?
How to use generated ids in EL (jsf, composite)?
我想要一个组合
<h:form id="f_imgA" >
<h:graphicImage id="imgA"
onclick="document.getElementById('#{k_imgA.clientId}').value=mods(event)"
value="images/img?r=#{Math.random()}">
<f:ajax event="click" listener="#{mBean.handleEvent}"
execute="@this k_imgA" render="@this"></f:ajax>
</h:graphicImage>
<h:inputHidden id="k_imgA" binding="#{k_imgA}" value="#{mBean.keyX}" />
</h:form>
写的时候
<comps:cimg imgId="imgA" />
此代码的最初目的是将修饰符状态(Ctrl、Shift、Alt)发送到服务器。
我有
<composite:interface>
<composite:attribute name="imgId" />
</composite:interface>
<composite:implementation>
<h:form id="f_#{cc.attrs.imgId}">
<h:graphicImage id="#{cc.attrs.imgId}"
onclick="document.getElementById('#{k_${cc.attrs.imgId}.clientId}').value=mods(event)"
value="images/img?r=#{Math.random()}">
<f:ajax event="click" execute="@this k_#{cc.attrs.imgId}"
listener="#{mBean.handleEvent}" render="@this">
</f:ajax>
</h:graphicImage>
<h:inputHidden id="k_#{cc.attrs.imgId}"
binding="k_#{cc.attrs.imgId}" value="#{mBean.keyX}" />
</h:form>
</composite:implementation>
这在意料之中,但行不通。违规的表达是
#{k_${cc.attrs.imgId}.clientId}
旨在 return id 为 k_imgA 的 hiddenInput 的 clientId。据我所知,EL 不能像上面那样处理嵌套表达式,但值得一试。那么有没有一种简单直接的方法来获取k_imgA的clientId呢?如果可以避免,我不想使用更多 javascript。
编辑:
不要对#{Math.random()}感到困惑,它起作用只是因为我有一个叫做 "Math".
的 bean
javascript 函数模组由
给出
<h:outputScript target="body">function mods(event) {return ((event.ctrlKey)?1:0)+((event.shiftKey)?2:0)+((event.altKey)?4:0)} </h:outputScript>
您不需要 fiddle 所有这些 _#{cc.attrs.imgId}
。只要给复合一个固定的id
。他们已经在自己命名容器了。然后 JSF 会担心剩下的事情。
<composite:implementation>
<h:form id="f">
<h:graphicImage id="i" ... />
<h:inputHidden id="k" ... />
</h:form>
</composite:implementation>
用法:
<comps:cimg id="imgA" />
生成HTML:
<form id="imgA:f" ...>
<img id="imgA:f:i" ... />
<input id="imgA:f:k" ... />
</form>
关于JS的尝试,最好以元素自身的ID为基础:
<h:graphicImage onclick="document.getElementById(id.substring(0,id.lastIndexOf(':')+1)+'k').value='...'" />
或者更简单,如果保证隐藏元素是生成的HTMLDOM树中图像元素的直接兄弟,那么直接用Node#nextSibling
抓取:
<h:graphicImage onclick="nextSibling.value='...'" />
<h:inputHidden ... />
binding
永远不会像您尝试的构造那样工作,即便如此,您最好通过请求范围内的 Map
或所谓的支持组件来完成。
另请参阅:
- Integrate JavaScript in JSF composite component, the clean way
- Rerendering composite component by ajax
我想要一个组合
<h:form id="f_imgA" >
<h:graphicImage id="imgA"
onclick="document.getElementById('#{k_imgA.clientId}').value=mods(event)"
value="images/img?r=#{Math.random()}">
<f:ajax event="click" listener="#{mBean.handleEvent}"
execute="@this k_imgA" render="@this"></f:ajax>
</h:graphicImage>
<h:inputHidden id="k_imgA" binding="#{k_imgA}" value="#{mBean.keyX}" />
</h:form>
写的时候
<comps:cimg imgId="imgA" />
此代码的最初目的是将修饰符状态(Ctrl、Shift、Alt)发送到服务器。
我有
<composite:interface>
<composite:attribute name="imgId" />
</composite:interface>
<composite:implementation>
<h:form id="f_#{cc.attrs.imgId}">
<h:graphicImage id="#{cc.attrs.imgId}"
onclick="document.getElementById('#{k_${cc.attrs.imgId}.clientId}').value=mods(event)"
value="images/img?r=#{Math.random()}">
<f:ajax event="click" execute="@this k_#{cc.attrs.imgId}"
listener="#{mBean.handleEvent}" render="@this">
</f:ajax>
</h:graphicImage>
<h:inputHidden id="k_#{cc.attrs.imgId}"
binding="k_#{cc.attrs.imgId}" value="#{mBean.keyX}" />
</h:form>
</composite:implementation>
这在意料之中,但行不通。违规的表达是
#{k_${cc.attrs.imgId}.clientId}
旨在 return id 为 k_imgA 的 hiddenInput 的 clientId。据我所知,EL 不能像上面那样处理嵌套表达式,但值得一试。那么有没有一种简单直接的方法来获取k_imgA的clientId呢?如果可以避免,我不想使用更多 javascript。
编辑: 不要对#{Math.random()}感到困惑,它起作用只是因为我有一个叫做 "Math".
的 beanjavascript 函数模组由
给出<h:outputScript target="body">function mods(event) {return ((event.ctrlKey)?1:0)+((event.shiftKey)?2:0)+((event.altKey)?4:0)} </h:outputScript>
您不需要 fiddle 所有这些 _#{cc.attrs.imgId}
。只要给复合一个固定的id
。他们已经在自己命名容器了。然后 JSF 会担心剩下的事情。
<composite:implementation>
<h:form id="f">
<h:graphicImage id="i" ... />
<h:inputHidden id="k" ... />
</h:form>
</composite:implementation>
用法:
<comps:cimg id="imgA" />
生成HTML:
<form id="imgA:f" ...>
<img id="imgA:f:i" ... />
<input id="imgA:f:k" ... />
</form>
关于JS的尝试,最好以元素自身的ID为基础:
<h:graphicImage onclick="document.getElementById(id.substring(0,id.lastIndexOf(':')+1)+'k').value='...'" />
或者更简单,如果保证隐藏元素是生成的HTMLDOM树中图像元素的直接兄弟,那么直接用Node#nextSibling
抓取:
<h:graphicImage onclick="nextSibling.value='...'" />
<h:inputHidden ... />
binding
永远不会像您尝试的构造那样工作,即便如此,您最好通过请求范围内的 Map
或所谓的支持组件来完成。
另请参阅:
- Integrate JavaScript in JSF composite component, the clean way
- Rerendering composite component by ajax