¿Cómo seleccionar componentes JSF usando jQuery?

Resuelto Karthikeyan asked hace 13 años • 4 respuestas

Estoy intentando implementar jQuery con componentes PrimeFaces y JSF, pero no funciona correctamente. Cuando intenté hacer lo mismo con las etiquetas HTML, funcionó correctamente.

Aquí está el código con etiquetas HTML que funciona correctamente con 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" />

con

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

Aquí está el código con PrimeFaces/JSF que no funciona correctamente con jQuery:

<p:selectManyCheckbox >
    <f:selectItem itemLabel="1" value="one" id="rad" ></f:selectItem>
</p:selectManyCheckbox>

con

$("#rad").change(function() {
    if ($("#rad:checked").val() == "one") {
        $("#p2").hide();
    } else {
        $("#p2").show();
    }  
});
Karthikeyan avatar Oct 28 '11 16:10 Karthikeyan
Aceptado

Debes darte cuenta de que jQuery funciona con el árbol HTML DOM en el lado del cliente. jQuery no funciona directamente en los componentes JSF como lo escribió en el código fuente de JSF, pero jQuery funciona directamente con el árbol HTML DOM generado por esos componentes JSF. Debe abrir la página en el navegador web, hacer clic derecho y luego Ver código fuente . Verá que JSF antepone el ID de los elementos de entrada HTML generados con los ID de todos NamingContainerlos componentes principales (como <h:form>, <h:dataTable>etc.) con :un carácter separador predeterminado. Así por ejemplo

<h:form id="foo">
    <p:selectManyCheckbox id="bar" />
    ...

terminará en HTML generado como

<form id="foo" name="foo">
    <input type="checkbox" id="foo:bar" name="foo:bar" />
    ...

En su lugar , debe seleccionar elementos exactamente con esa ID. Sin embargo, es :un carácter especial en los identificadores CSS que representa un pseudoselector. Para seleccionar un elemento con a :en el ID usando selectores CSS en jQuery, debe escapar mediante barra invertida o usar el [id=...]selector de atributos o simplemente usar el antiguo getElementById():

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

Si ve una j_idXXXpieza generada automáticamente en el ID que XXXrepresenta un número incremental, entonces debe darle al componente en particular un ID fijo, porque el número incremental es dinámico y está sujeto a cambios dependiendo de la posición física del componente en el árbol.


Como alternativa, también puedes usar un nombre de clase:

<x:someInputComponent styleClass="someClassName" />

que termina en HTML como

<input type="..." class="someClassName" />

para que puedas conseguirlo como

var $elements = $(".someClassName");

Esto permite una mejor abstracción y reutilización. Seguramente ese tipo de elementos no son únicos . Sólo los elementos principales del diseño, como el encabezado, el menú, el contenido y el pie de página, son realmente únicos, pero, a su vez, normalmente no están incluidos en ningún NamingContainerotro.


Como otra alternativa, puedes simplemente pasar el elemento HTML DOM a la función:

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

Ver también:

  • ¿Cómo puedo saber la identificación de un componente JSF para poder usarlo en Javascript?
  • ¿Cómo utilizar el ID de elemento HTML generado por JSF con dos puntos ":" en los selectores de CSS?
  • De forma predeterminada, JSF genera ID inutilizables, que son incompatibles con la parte CSS de los estándares web.
  • Integre JavaScript en un componente compuesto JSF, de forma limpia
BalusC avatar Oct 28 '2011 10:10 BalusC

También puede utilizar jQuery "El atributo contiene selector" (aquí está la URL http://api.jquery.com/attribute-contains-selector/ )

Por ejemplo, si tienes un

 <p:spinner id="quantity" value="#{toBuyBean.quantityToAdd}" min="0"/> 

y quieres hacer algo sobre su objeto, puedes seleccionarlo con

jQuery('input[id*="quantity"]')

y si quieres imprimir su valor puedes hacer esto

alert(jQuery('input[id*="quantity"]').val());

Para conocer la etiqueta html real del elemento, siempre puedes mirar el elemento html real (en este caso, el spinner se tradujo a entrada) usando Firebug o, por ejemplo, herramientas de desarrollo o ver el código fuente...

Daniel.

Daniel avatar Oct 28 '2011 15:10 Daniel

Si está utilizando RichFaces, puede verificar rich:jQueryel comonent. Le permite especificar la identificación del lado del servidor para el componente jQuery. Por ejemplo, tiene un componente con una identificación de servidor especificada, luego puede aplicar cualquier material relacionado con jQuery de la siguiente manera:

<rich:jQuery selector="#<server-side-component-id>" query="find('.some-child').removeProp('style')"/>

Para obtener más información, consulte la documentación .

Espero eso ayude.

nndru avatar Sep 28 '2017 10:09 nndru