2011-05-20 75 views
2

我在applet中調用一些Javascript時會出現以下代碼(這有點令人費解,因爲調用的fn從divId標識的DOM中獲取對象並調用功能)。從applet調用JS可在Firefox和Chrome中使用,但不能在Safari中使用

@Override 
public final void start() { 
    System.err.println("start() method called"); 
    this.javascript = JSObject.getWindow(this); 
    this.jsObjectDivId = getParameter("parent_div_id"); 
    this.initCallbackFnName = getParameter("init_callback"); 
    Object args[] = {this.jsObjectDivId, this.initCallbackFnName}; 
    System.out.print("Calling init_callback\n"); 
    this.javascript.call("callJS", args); 
} 

callJS功能是:

window.callJS = function(divId, functionName, jsonArgString) { 
    var args, obj; 
    obj = $(divId).data('neatObject'); 
    args = eval(jsonArgString); 
    return obj[functionName](args); 
}; 

在Firefox/Chrome瀏覽器divIdfunctionName參數包含有效的字符串,一切工作正常;在掛起指定的DIV數據的對象上調用所需的函數。

在Safari中,所述divIdfunctionName參數均報告爲與true值的JavaRuntimeObject

> divId 
    JavaRuntimeObject 
    true 

什麼給了?

+0

我也經歷過safari不支持javascript,與其他瀏覽器一樣完美 – 2011-05-20 12:36:09

+0

它似乎在兩個方向都被破壞了。從JS中調用applet方法也會返回無用的JavaRuntimeObject,而不是我實際想要返回的內容。 – edoloughlin 2011-05-20 14:57:19

回答

4

所有瀏覽器都不支持LiveConnect。尤其是,在使用call時,Safari不會將Java字符串轉換爲prober JS等價物。在你的情況下,你可以在Applet端使用eval而不是call,並將參數放入JSON字符串對象中。喜歡的東西:

javascript.eval(callback + "({\"id\":\"" + id + "\",\" ... })")

基本上,你需要知道的LiveConnect的作品的跨瀏覽器兼容子集。 我已經寫了描述子集的博客文章:http://blog.aarhusworks.com/applets-missing-information-about-liveconnect-and-deployment/

它配備了一個運行在瀏覽器LiveConnect的測試套件:http://www.jdams.org/live-connect-test

+1

這很奇怪。在Safari的最新版本(OS X 10.6.7上的5.0.5)中,它似乎通過了第一個參數,如果它可以轉換爲字符串!我也對返回值有一些好運 - 如果你在字符串上下文中使用它們,它們就會工作,但是除非你給它們連接一個空字符串,否則你不能將它們作爲參數傳遞給其他JS函數。例如,json_parse(applet.getSomeJSON()+「」)將工作,但json_parse(applet.getSomeJSON())將失敗。 – edoloughlin 2011-06-20 12:05:45

0

我有一個類似的問題與調用方法上的Safari一個applet 。它返回的是一個JavaRuntimeObject,當它是用戶後來引發異常時。

正如@edoloughlin所指出的那樣,我必須使用(applet.getMethod()+「」),在此之後評估適當的字符串。

該評論爲我節省了一堆時間,所以我認爲這是有用的添加在這裏,因爲我不能上面評論。

相關問題