如何使用jQuery选择JSF组件?

Kar*_*yan 40 jquery jsf primefaces jsf-2

我正在尝试使用PrimeFaces和JSF组件实现jQuery,但它无法正常工作.当我尝试用HTML标签做同样的事情时,它正常工作.

以下是带有HTML标记的代码,它可以与jQuery一起使用:

<input type="checkbox" id="check2"></input>
<h:outputText value="Check the box, if your permanent address is as same as current address."></h:outputText> 
<h:message for="checkbox" style="color:red" />
Run Code Online (Sandbox Code Playgroud)

$("#check2").change(function() {
    if ($("#check2").is(":checked")) {
        $("#p2").hide();
    } else {
        $("#p2").show();
    }
});
Run Code Online (Sandbox Code Playgroud)

以下是使用PrimeFaces/JSF的代码,它与jQuery无法正常工作:

<p:selectManyCheckbox >
    <f:selectItem itemLabel="1" value="one" id="rad" ></f:selectItem>
</p:selectManyCheckbox>
Run Code Online (Sandbox Code Playgroud)

$("#rad").change(function() {
    if ($("#rad:checked").val() == "one") {
        $("#p2").hide();
    } else {
        $("#p2").show();
    }  
});
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 83

您应该意识到jQuery与客户端的HTML DOM树一起使用.你在JSF源代码中编写的jQuery不能直接在JSF组件上工作,但是jQuery直接使用由那些JSF组件生成的HTML DOM树.您需要在webbrowser中打开页面并右键单击,然后单击View Source.你会看到一个JSF预先考虑与所有父的ID生成的HTML输入元件的ID NamingContainer的部件(如<h:form>,<h:dataTable>等)与:作为默认分隔符.所以举个例子

<h:form id="foo">
    <p:selectManyCheckbox id="bar" />
    ...
Run Code Online (Sandbox Code Playgroud)

将最终生成的HTML作为

<form id="foo" name="foo">
    <input type="checkbox" id="foo:bar" name="foo:bar" />
    ...
Run Code Online (Sandbox Code Playgroud)

您需要完全按该ID 选择元素.:然而,它是表示伪选择器的CSS标识符中的特殊字符.要:使用jQuery中的CSS选择器在ID中选择具有ID 的元素,您需要通过反斜杠转义它或使用[id=...]属性选择器或只使用旧的getElementById():

var $element1 = $("#foo\\:bar");
// or
var $element2 = $("[id='foo:bar']");
// or
var $element3 = $(document.getElementById("foo:bar"));
Run Code Online (Sandbox Code Playgroud)

如果j_idXXX在ID中看到自动生成的部分XXX表示增量编号,则必须为特定组件指定固定ID,因为增量编号是动态的,并且可能会根据组件在树中的物理位置而发生更改.


作为替代方案,您也可以使用类名:

<x:someInputComponent styleClass="someClassName" />
Run Code Online (Sandbox Code Playgroud)

最终以HTML格式结束

<input type="..." class="someClassName" />
Run Code Online (Sandbox Code Playgroud)

这样你就可以得到它

var $elements = $(".someClassName");
Run Code Online (Sandbox Code Playgroud)

这允许更好的抽象和可重用性.当然,这些元素并不是唯一的.只有标题,菜单,内容和页脚等主要布局元素才是真正独特的,但它们通常不是NamingContainer已经存在的.


作为另一种选择,您可以将HTML DOM元素本身传递给函数:

<x:someComponent onclick="someFunction(this)" />
Run Code Online (Sandbox Code Playgroud)
function someFunction(element) {
    var $element = $(element);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


Dan*_*iel 6

您还可以使用jQuery"Attribute Contains Selector"(这里是url http://api.jquery.com/attribute-contains-selector/)

例如,如果你有

 <p:spinner id="quantity" value="#{toBuyBean.quantityToAdd}" min="0"/> 
Run Code Online (Sandbox Code Playgroud)

并且你想在它的对象上做一些事情你可以选择它

jQuery('input[id*="quantity"]')
Run Code Online (Sandbox Code Playgroud)

如果你想打印它的价值,你可以这样做

alert(jQuery('input[id*="quantity"]').val());
Run Code Online (Sandbox Code Playgroud)

为了知道元素的真实html标记,你总是可以使用firebug或者开发人员工具或查看源来查看真正的html元素(在这种情况下spinner被翻译成输入)...

丹尼尔.


归档时间:

查看次数:

60862 次

最近记录:

6 年,8 月 前