2012-03-08 57 views
12

Tengo una aplicación con un mapa de imagen del lado del cliente con varias secciones definidas. Necesito llamar a un método en Managed Bean desde el <area> atributo onclick.Llamando al método Bean administrado desde JavaScript

Esto no funciona:

<area id="ReviewPerson" shape="rect" coords="3, 21, 164, 37" href="#" 
    onclick="#{personBean.method}" alt="Review Person" id="reviewPersonArea" 
    title="Review Person" /> 

Ya que mis manos están atadas en el mapa de imagen (por desgracia), ¿cómo puedo llamar a un método de bean administrado dentro de la etiqueta <area>?

Respuesta

16

Tiene algunas opciones. Si está utilizando JSF 2.0 puede construir un componente compuesto alrededor de estas etiquetas de área.

La manera más fácil, sin embargo, sería invocar un botón de entrada JSF oculto.

<h:commandButton id="hdnBtn" actionListener="#{personBean.method}" style="display: none;" /> 

Se mostrará como un elemento input HTML en la página que se puede acceder desde Javascript e invocar su caso click.

onclick="jQuery('#form:hdnBtn').click();" 
+0

Sí, parece ser lo único que puede hacer. Gracias por la ayuda. – Jason

+0

En lugar de ** actionListener **, si usamos el atributo ** action **, será fácil redirigirlo a los beans administrados. [Metodología de redireccionamiento] (https://stackoverflow.com/a/6026401/4067157) no funciona con actionListener – snAtchnAren

3

Si utiliza la costura, Remoting puede hacer esto para usted: http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/remoting.html

Otro enfoque sería no exponer los métodos como los servicios REST, y llamarlos desde el JavaScript usando algo como jQuery. Aquí hay un buen artículo sobre este enfoque: http://coenraets.org/blog/2011/12/restful-services-with-jquery-and-java-using-jax-rs-and-jersey/

+0

No es exactamente lo que necesitaba ya que la aplicación se ha diseñado sin uno u otro enfoque, pero upvoted ya que son ideas decentes y desearía poder hacer esto como un servicio REST. – Jason

3

Si desea completa ADF Faces solución puede probar esto:

function doClick(){ 
    var button = AdfPage.PAGE.findComponentByAbsoluteId("aButton"); 
    ActionEvent.queue(button,true); 
} 
17

Si utiliza PrimeFaces, no es necesario jQuery. Se utiliza remoteCommand con un atributo de nombre, y llamar a ese nombre de Javascript, por lo que:

<area... onclick="somejavascript();"... /> 

<p:remoteCommand name="myCommand" actionListener="#{personBean.method}" style="display: none;" /> 

Javascript:

function somejavascript(){ 
    myCommand(); 
} 
+6

¿Por qué necesito el método adicional somejavascript()? ¿No podemos escribir 'onclick =" myCommand(); "'? – Falco

+1

Tienes toda la razón. –

+1

@Falco onclick = "myCommand()" simplemente hará que personBean.method se ejecute. remoteCommand es para cuando necesitamos ejecutar algo primero en javascript, y solo entonces llamamos al método bean. – dennisdeems

Cuestiones relacionadas