2011-10-17 27 views
7

Tệp HTML của tôi có hàm javascript xxx_return(), sẽ trả về giá trị chuỗi. Có cách nào tôi có thể lấy giá trị này từ lớp Java ?.Cách nói chuyện với hàm Javascript từ SWT

Tôi đang sử dụng trình bao SWT để hiển thị html này. SWT có mang bất kỳ tính năng nào để nhận các giá trị trả về của một hàm script không?

chỉnh sửa:

Mã của tôi là một cái gì đó như dưới đây: gói 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(); 


} 

Mã này mang lại cho tôi một ngoại lệ SWT như Object mong đợi:

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) 

Trong kịch bản java tôi đã viết một chức năng trong thẻ script như:

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

bất cứ ai có thể tìm thấy lỗi trong này ?. Tôi không hiểu nơi nó chạm vào lỗi.

Cảm ơn.

Trả lời

4

Sử dụng đối tượng SWT Browser. Sau đó, bạn có thể chỉ cần sử dụng String result = (String)Browser.evaluate("xxx_return();").

+0

Tôi đã chỉnh sửa câu hỏi của mình. Tôi đã làm như bạn nói, nhưng nó mang lại cho tôi một ngoại lệ. Bạn có thể vui lòng tìm lỗi này không? Cảm ơn – Kris

+1

Có một lỗi liên quan đến 'Browser # evaluation' và null return values ​​with IE9: https://bugs.eclipse.org/bugs/show_bug.cgi?id=344597. Để giải quyết vấn đề này, bạn có thể thực hiện 'Browser.evaluate (" foo() || ''; ")' Bạn có thể đơn giản hóa điều này thành hàm Javascript chỉ trả về một chuỗi không đổi? Điều đó có thành công không? –

+1

Tôi có thể truy xuất chuỗi từ javascript, bằng cách gọi đánh giá là Browser.evaluate ("return foo()"); – Kris

4

Tôi đã tìm thấy nó, ngoại lệ đã xảy ra do Browser.evaluate() đã được gọi trước khi trang được tải trong trình bao. Tôi đã thêm một ProgressListener để biết việc hoàn thành, và cố gắng gọi nó là làm việc.

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

Cảm ơn tất cả

0

Bên cạnh các giải pháp trên, thêm "trở lại" ở phía trước của biểu thức. Cũng tùy thuộc vào những gì bạn đang đánh giá, sự kiện hoàn thành có thể được bỏ qua. Biểu thức sau chỉ hoạt động.

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

Tất nhiên nếu bạn đang đánh giá javascript từ trang được tải trong trình duyệt, đánh giá phải được gọi sau khi hoàn thành sự kiện, nếu không javascript có thể chưa được tải.

Các vấn đề liên quan