2009-08-18 71 views
6

這不會在Safari工作:如何等待Java applet在Safari上完成加載?

<html> 
<body> 
<applet id="MyApplet" code="MyAppletClass" archive="MyApplet.jar"> 
<script type="text/javascript"> 
    alert(document.getElementById('MyApplet').myMethod); 
</script> 
</body> 
</html> 

myMethodMyAppletClass聲明的公共方法。

當我第一次在Safari中加載頁面時,它在applet加載完成之前顯示警報(所以消息框顯示undefined)。如果我刷新頁面,則小程序已經加載,並且警報顯示function myMethod() { [native code] },正如您所期望的那樣。

當然,這意味着applet方法在加載之前不可用,但Safari不會阻止JavaScript運行。 <body onLoad>發生同樣的問題。

我需要的是類似<body onAppletLoad="doSomething()">的東西。我該如何解決這個問題?

感謝

PS:我不知道,如果是相關的,但JAR簽署。

回答

8

我使用了一個定時器,它在放棄之前重置並保持多次檢查。

<script language="text/javascript" defer> 

function performAppletCode(count) { 
    var applet = document.getElementById('MyApplet'); 

    if (!applet.myMethod && count > 0) { 
     setTimeout(function() { performAppletCode(--count); }, 2000); 
    } 
    else if (applet.myMethod) { 
     // use the applet for something 
    } 
    else { 
     alert('applet failed to load'); 
    } 
} 

performAppletCode(10); 

</script>    

請注意,這裏假定小程序將在Safari中運行。我有一些小程序需要Java 6,即使代碼與上面類似,也會掛起Safari。我選擇在服務器上執行瀏覽器檢測,並在瀏覽器不支持小程序時將用戶重定向到錯誤頁面。

+0

謝謝。這是一個恥辱,沒有一個更乾淨的方式來做到這一點! – 2009-08-18 12:01:13

+0

你也可以簡單地檢查小程序。至少,你可以在Firefox中。我沒有在Chrome&IE中檢查過。這樣,您就不必修改applet以擁有特定的方法。 – 2013-05-24 14:24:26

2

前段時間我有一個類似的問題,向applet標籤添加MAYSCRIPT解決了我的問題。

採取偷看在此頁: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

希望它能幫助!

+0

我不明白這與等待小程序加載有關。此外,該頁面上的示例在Snow Leopard上的Firefox 3.5.4中不起作用。 – edoloughlin 2009-11-04 10:13:22

+0

只適用於IE的AFAIU。換句話說,不是OS X而不是Safari。 – 2013-08-13 02:49:05

3

這是一個泛型函數我寫的只是這樣做:

/* Attempt to load the applet up to "X" times with a delay. If it succeeds, then execute the callback function. */ 
function WaitForAppletLoad(applet_id, attempts, delay, onSuccessCallback, onFailCallback) { 
    //Test 
    var to = typeof (document.getElementById(applet_id)); 
    if (to == "function") { 
     onSuccessCallback(); //Go do it. 
     return true; 
    } else { 
     if (attempts == 0) { 
      onFailCallback(); 
      return false; 
     } else { 
      //Put it back in the hopper. 
      setTimeout(function() { 
       WaitForAppletLoad(applet_id, --attempts, delay, onSuccessCallback, onFailCallback); 
      }, delay); 
     } 
    } 
} 

這樣稱呼它:

WaitForAppletLoad("fileapplet", 10, 2000, function() { 
    document.getElementById("fileapplet").getDirectoriesObject("c:/"); 
}, function() { 
    alert("Sorry, unable to load the local file browser."); 
}); 
+0

你也可以嘗試document.getElementById(applet_id).isActive來測試applet是否在上面的例子中加載,它對我有用。 :) – MarioVilas 2012-11-23 17:58:04

+1

但是,如果你這樣做,document.getElementById(applet_id)將返回null,當它不存在,然後它會拋出一個空引用異常「.isActive」。我不想通過異常進行測試,這在JS中非常非常慢。 – 2012-12-11 18:52:18

+0

就我的測試而言,'typeof(document.getElementById(applet_id))'總是返回'object'。你的意思是'typeof(document.getElementById(applet_id).someFunction)'? – targumon 2014-02-26 12:32:16