2009-08-18 11 views
6

To nie działa w Safari:Jak czekać na zakończenie apletu Java w Safari?

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

myMethod jest metoda publicznego zadeklarowane w MyAppletClass.

Kiedy po raz pierwszy ładuję stronę w Safari, pokazuje ona alert przed zakończeniem ładowania apletu (tak, że w oknie komunikatu wyświetla się undefined). Jeśli odświeżę stronę, aplet został już załadowany, a alert wyświetli function myMethod() { [native code] }, jak można się spodziewać.

Oczywiście oznacza to, że metody Aplet nie są dostępne dopiero po załadowaniu, ale Safari nie blokuje uruchamianie JavaScript. Ten sam problem występuje z <body onLoad>.

Co potrzebne jest coś <body onAppletLoad="doSomething()">. Jak obejść ten problem?

Dzięki

PS: Nie jestem pewien, czy to istotne, ale JAR jest podpisane.

Odpowiedz

8

Używam timera, który resetuje i sprawdza kilka razy, zanim się poddaje.

<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>    

Należy zauważyć, że zakłada to, że aplet będzie uruchamiany w Safari. W niektórych przypadkach applet wymagał Java 6, która po prostu zawiesza Safari nawet z kodem podobnym do powyższego. Zdecydowałem się na wykrywanie przeglądarki na serwerze i przekierowanie użytkownika na stronę błędu, gdy przeglądarka nie obsługuje apletu.

+0

Dziękuję. Szkoda, że ​​nie ma na to czystszego sposobu! –

+0

Możesz także po prostu sprawdzić aplet. Przynajmniej możesz w Firefoksie. Nie sprawdzałem w Chrome i IE. W ten sposób nie trzeba modyfikować apletu, aby mieć określoną metodę. –

2

miałem podobny problem jakiś czas temu i dodanie MAYSCRIPT do znacznika apletu rozwiązać mój problem.

Rzuć okiem na tej stronie: http://www.htmlcodetutorial.com/applets/_APPLET_MAYSCRIPT.html

Nadzieję, że to pomaga!

+0

Nie widzę, jak to ma znaczenie, aby czekać na załadowanie apletu. Również przykład na stronie nie działa w Firefoksie 3.5.4 na systemie Snow Leopard. – edoloughlin

+0

AFAIU, który dotyczy tylko IE. Innymi słowy, nie OS X, a nie Safari. –

3

Oto ogólna funkcja Napisałem właśnie do tego:

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

Nazwijmy to tak:

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

Można również wypróbować document.getElementById (applet_id) .isActive, aby przetestować, czy aplet jest załadowany w powyższym przykładzie, zadziałało dla mnie. :) – MarioVilas

+1

Ale jeśli to zrobisz, document.getElementById (applet_id) zwróci wartość null, gdy nie istnieje, a następnie wygeneruje zerowy wyjątek odwołania do ".isActive". Nie chciałem testować przez wyjątek, który jest bardzo, bardzo powolny w JS. –

+0

Jeśli chodzi o moje testy, 'typeof (document.getElementById (applet_id))' zawsze zwraca 'object'. Czy miałeś na myśli 'typeof (document.getElementById (applet_id) .someFunction)'? – targumon

Powiązane problemy