2012-03-08 14 views
12

Mam aplikację z mapą obrazów po stronie klienta z wieloma zdefiniowanymi sekcjami. Muszę wywołać metodę w Managed Bean z atrybutu onclick <area>.Wywołanie metody Managed Bean From JavaScript

To nie działa:

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

Ponieważ moje ręce są związane na mapie obrazu (niestety), jak mogę nazwać udało metoda fasoli od wewnątrz znacznika <area>?

Odpowiedz

16

Masz kilka opcji. Jeśli korzystasz z JSF 2.0, możesz zbudować komponent złożony wokół tych znaczników obszaru.

Najprostszym sposobem jest wywołanie ukrytego przycisku wprowadzania JSF.

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

Spowoduje to jako input elementu HTML na stronie, że można uzyskać dostęp z JavaScript i wywołać jego click wydarzenie.

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

Yup, wydaje się być jedyną rzeczą do zrobienia. Dzięki za pomoc. – Jason

+0

Zamiast ** actionListener **, jeśli użyjemy atrybutu ** action **, łatwo będzie przekierować w zarządzanych komponentach bean. [Metoda przekierowania] (https://stackoverflow.com/a/6026401/4067157) nie działa z actionListener – snAtchnAren

3

Jeśli używasz szew Remoting może zrobić dla Ciebie: http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/remoting.html

Innym rozwiązaniem byłoby narażać metod jak usługi REST, i nazywają je z JavaScript za pomocą coś jak jQuery. Oto dobry artykuł na temat tego podejścia: http://coenraets.org/blog/2011/12/restful-services-with-jquery-and-java-using-jax-rs-and-jersey/

+0

Niekoniecznie to, co potrzebne, ponieważ aplikacja jest zaprojektowana bez obu podejścia, ale upvoted ponieważ są przyzwoite pomysły i chciałbym, abyśmy mogli to zrobić jako usługę REST. – Jason

3

Jeśli chcesz kompletny ADF Faces rozwiązanie można spróbować to:

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

Jeśli używasz primefaces, nie potrzeba jQuery. Użyć remoteCommand z atrybutem name, i nazywają to imię z javascript, więc:

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

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

Javascript:

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

Dlaczego potrzebuję dodatkowej metody somejavascript()? Czy nie możemy napisać 'onclick =" myCommand(); "'? – Falco

+1

Masz absolutną rację. –

+1

@Falco onclick = "myCommand()" spowoduje tylko wykonanie metody personBean.method. remoteCommand służy do tego, kiedy musimy najpierw wykonać coś w javascript, a dopiero potem wywołać metodę bean. – dennisdeems

Powiązane problemy