2011-12-23 36 views
6

Czy można wywoływać metody Java (GWT) z JavaScript? Jest również niejasne z dokumentacji. Wszystkie próbki tutaj http://code.google.com/intl/ru/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html demonstrują wywoływanie funkcji java z funkcji JSNI (nie JS).Jak wywołać funkcję GWT java z Javascript?

UPDATE 1

Oto kod Java:

public class Test_GoogleWeb_JSNI_02 implements EntryPoint { 
/** 
* This is the entry point method. 
*/ 
public void onModuleLoad() { 
} 

public static void Callee() { 
    Window.alert("Callee"); 
} 
} 

Oto próbki przycisk rozmówcy w HTML:

<input type='button' value='Call' onclick='Test02()'> 

A oto niektóre funkcje Próbowałem i które zostały nie działa:

<script type="text/javascript"> 

    function Test01() { 
     @com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee()(); 
    } 

    function Test02() { 
     com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee()(); 
    } 


</script> 

UPDATE 2

Poniżej pracował.

przygotowanie

Java:

public void onModuleLoad() { 
    Prepare(); 
} 

public static native void Prepare() /*-{ 
    $doc.calleeRunner = @com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee(); 
}-*/; 

public static void Callee() { 
    Window.alert("Callee"); 
} 

rozmówcy:

function Test03() { 
     document.calleeRunner(); 
} 

Czy istnieje lepszy sposób?

+0

można wywołać metodę javascrypt zwracającą obiekt? i użyć tego obiektu? –

Odpowiedz

10

Twój przykład nie będzie działał, ponieważ próbujesz użyć JSNI w jakimś zewnętrznym skrypcie. Jeśli chcesz wywołać coś z zewnętrznych JS trzeba użyć metody opisanej w niniejszym question lub użyj GWT exporter

UPDATE:

Najbezpieczniej wystawiać rzeczy GWT jest zawinąć wywołanie w jakiś inny funkcjonować. Na przykład:

public native void expose()/*-{ 
    $wnd.exposedMethod = function(param){ 
     @com.my.MyClass::myFunction(*)(param); 
    } 
}-*/; 

W przeciwnym razie mogą wystąpić jakieś dziwne błędy w trybie produkcyjnym =)

+0

Dzięki! Czy aktualizacja dotyczy mojej aktualizacji2? Czy sugerujesz, abyś nie pisał '[email protected] :: myFunction (*) (param)'? Czemu? – Dims

+0

Może to uniemożliwić GWT przeprowadzenie podstawowej optymalizacji. Wpływ na wydajność najprawdopodobniej nie będzie duży, ale powinieneś o tym pamiętać. Również twój sposób będzie działał tylko z ekspozycją metod statycznych, najprawdopodobniej przerwie się, jeśli spróbujesz wywołać jakąś metodę instancji. – jusio

+0

można wywołać metodę javascrypt, która zwraca obiekt? i użyć tego obiektu? –

Powiązane problemy