2011-10-17 9 views
7

Il mio file HTML ha una funzione javascript xxx_return(), che restituirà un valore stringa. C'è un modo in cui posso prendere questo valore dal layer Java ?.Come parlare con una funzione Javascript da SWT

Sto usando la shell SWT per visualizzare questo html. SWT ha qualche funzione per ottenere i valori di ritorno di una funzione di script?

edit:

Il mio codice è qualcosa di simile di seguito: pacchetto 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(); 


} 

Questo codice mi dà un'eccezione SWT come oggetto previsto:

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) 

Nello script java ho scritto una funzione nel tag script come:

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

Qualcuno può trovare l'errore in questo ?. Non capisco dove colpisce l'errore.

Grazie.

risposta

4

Utilizzare un oggetto SWT Browser. Quindi puoi semplicemente usare String result = (String)Browser.evaluate("xxx_return();").

+0

Ho modificato la mia domanda. Ho fatto come hai detto, ma mi fa un'eccezione. Per favore, trova l'errore? Grazie – Kris

+1

C'è un bug riguardo a 'Browser # evaluate' e valori di ritorno null con IE9: https://bugs.eclipse.org/bugs/show_bug.cgi?id=344597. Per ovviare a questo, puoi fare 'Browser.evaluate (" foo() || ''; ")' Puoi semplificarlo con una funzione Javascript che restituisce una stringa costante? Succede? –

+1

Potrei recuperare la stringa da javascript, chiamando valutare come Browser.evaluate ("return foo()"); – Kris

4

L'ho trovato, l'eccezione si è verificata da quando il browser.evaluate() veniva chiamato prima che la pagina venisse caricata nella shell. Ho aggiunto un ProgressListener per conoscere il completamento e ho provato a chiamarlo funzionato.

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); 
       } 
      }); 

Grazie Tutti

0

Inoltre le soluzioni di cui sopra, aggiungere "ritorno" di fronte l'espressione. Inoltre, a seconda di cosa stai valutando, l'evento completato può essere ignorato. L'espressione seguente funziona correttamente.

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

Naturalmente se si sta valutando javascript dalla pagina caricata nel browser, valutare deve essere chiamato evento dopo completato, altrimenti il ​​JavaScript potrebbe non essere stato caricato.