2011-10-17 6 views
7

Mi archivo HTML tiene una función javascript xxx_return(), que devolverá un valor de cadena. ¿Hay alguna manera de que pueda tomar este valor de la capa de Java ?.Cómo hablar con una función de Javascript desde SWT

Estoy usando SWT shell para mostrar este html. ¿SWT lleva alguna característica para obtener los valores de retorno de una función de script?

edición:

Mi código es algo como la siguiente: paquete 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(); 


} 

Este código me da una excepción SWT como objeto esperado:

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) 

En el java script que he escrito una función en la etiqueta de secuencia de comandos como:

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

¿Alguien puede encontrar el error en esto ?. No entiendo dónde golpea el error.

Gracias.

Respuesta

4

Utilice un objeto SWT Browser. Entonces simplemente puede usar String result = (String)Browser.evaluate("xxx_return();").

+0

He editado mi pregunta. Hice lo que dijiste, pero me da una excepción. ¿Puede encontrar el error? Gracias – Kris

+1

Hay un error con respecto a 'Browser # evaluate' y null return values ​​con IE9: https://bugs.eclipse.org/bugs/show_bug.cgi?id=344597. Para solucionar esto, puede hacer 'Browser.evaluate (" foo() || ''; ")' ¿Puede simplificar esto a una función de Javascript que solo devuelve una cadena constante? ¿Eso tiene éxito? –

+1

Pude recuperar el String de javascript llamando a evaluar como Browser.evaluate ("return foo()"); – Kris

4

Lo encontré, la excepción se produjo desde que se llamaba Browser.evaluate() antes de que la página se cargara en el shell. Agregué un ProgressListener para saber la finalización, y traté de llamarlo funcionó.

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

Gracias Todo

0

Además las soluciones anteriores, añada "retorno" en frente de la expresión. También dependiendo de lo que está evaluando, el evento completo puede ser ignorado. La siguiente expresión simplemente funciona.

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

Por supuesto, si usted está evaluando Javascript a partir de la página cargada en el navegador, evaluar debe ser llamado evento después de completado, de lo contrario el javascript puede no haber sido cargado.

Cuestiones relacionadas