2011-10-17 17 views
7

Mój plik HTML ma funkcję javascript xxx_return(), która zwróci wartość ciągu. Czy jest jakiś sposób mogę wziąć tę wartość z warstwy Java ?.Jak rozmawiać z funkcją JavaScript z SWT

Używam powłoki SWT do wyświetlania tego html. Czy SWT przenosi jakąś funkcję, aby uzyskać wartości zwracane przez funkcję skryptu?

edit:

Mój kod jest coś takiego jak poniżej: pakietu test.html.simulation;

import org.eclipse.swt.SWT; 
import org.eclipse.swt.SWTException; 
import org.eclipse.swt.browser.Browser; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class BrowserExample{ 
public static void main(String[] args) 
{ 
    Display display = new Display(); 
    final Shell shell = new Shell(display); 
    String html=""; 
    Object ob=null; 
    shell.setText("Browser Example"); 
    shell.setSize(500, 350); 

     final Browser browser = new Browser(shell, SWT.NONE); 
     browser.setBounds(5, 75, 600, 400); 

     browser.setUrl("http://localhost/test/tryxml.html"); 

     shell.open(); 
     //System.out.println(browser.getUrl()); 
     //try 
     { 
     html=(String)browser.evaluate("returnHTML();"); 
     }/*catch(SWTException e) 
     { 
      System.out.println(e.getMessage()); 

     }*/ 
     System.out.println(html); 

     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
      } 

     display.dispose(); 


} 

Ten kod daje mi wyjątek SWT podobnego obiektu spodziewanych:

Exception in thread "main" org.eclipse.swt.SWTException: Object expected 
at org.eclipse.swt.browser.WebBrowser$EvaluateFunction.function(Unknown Source) 
at org.eclipse.swt.browser.WebSite.Invoke(Unknown Source) 
at org.eclipse.swt.browser.WebSite$7.method6(Unknown Source) 
at org.eclipse.swt.internal.ole.win32.COMObject.callback6(Unknown Source) 
at org.eclipse.swt.internal.ole.win32.COM.VtblCall(Native Method) 
at org.eclipse.swt.internal.ole.win32.IDispatch.Invoke(Unknown Source) 
at org.eclipse.swt.ole.win32.OleAutomation.invoke(Unknown Source) 
at org.eclipse.swt.ole.win32.OleAutomation.invoke(Unknown Source) 
at org.eclipse.swt.browser.IE.execute(Unknown Source) 
at org.eclipse.swt.browser.WebBrowser.evaluate(Unknown Source) 
at org.eclipse.swt.browser.Browser.evaluate(Unknown Source) 
at test.html.simulation.BrowserExample.main(BrowserExample.java:29) 

w skrypcie java Pisałem funkcję w tagu skryptu jak:

<script> 
function returnHTML() 
    { 
    var str=document.body.innerHTML; 
    //alert(str); 
    return str; 
    } 
</script> 

Czy ktoś może znaleźć błąd w tym ?. Nie rozumiem, gdzie trafia błąd.

Dzięki.

Odpowiedz

4

Użyj obiektu SWT Browser. Następnie możesz po prostu użyć String result = (String)Browser.evaluate("xxx_return();").

+0

Zmieniłem moje pytanie. Zrobiłem tak, jak powiedziałeś, ale to daje mi wyjątek. Czy możesz znaleźć błąd? Dzięki – Kris

+1

Istnieje błąd dotyczący "Przeglądarki # wartości" i wartości zwracanych null z IE9: https://bugs.eclipse.org/bugs/show_bug.cgi?id=344597. Aby obejść ten problem, można wykonać polecenie 'Browser.evaluate (" foo() || ''; ")' Czy możesz uprościć to do funkcji JavaScript, która po prostu zwraca stały ciąg znaków? Czy to się udaje? –

+1

Mogę pobrać String z javascript, wywołując assessment jako Browser.evaluate ("return foo()"); – Kris

4

Znalazłem, wyjątek wystąpił od czasu wywołania funkcji Browser.evaluate() przed załadowaniem strony do powłoki. Dodałem ProgressListener, aby poznać zakończenie, i próbowałem wywoływanie go działało.

browser.addProgressListener(new ProgressListener() { 
       public void changed(ProgressEvent event) 
       { 

       } 
       public void completed(ProgressEvent event) 
       {String htm; 
       htm=(String)browser.evaluate("return returnHTML()"); 
       System.out.println(htm); 
       } 
      }); 

Dzięki wszystkim

0

Ponadto powyższe rozwiązania, dodaj „zwrot” przed wyrażeniem. Również w zależności od tego, co oceniasz, ukończone wydarzenie można zignorować. Po wyrażeniu po prostu działa.

browser.evaluate("return 4 + 5;") 

Oczywiście jeśli jesteś oceny JavaScript z załadowanej strony w przeglądarce, ocenić należy nazwać po zakończone zdarzenie, w przeciwnym razie może javascript nie zostały załadowane.