2008-09-11 9 views
10

Ich arbeite an einem Projekt, wo wir ein Java-Applet für einen Teil der Benutzeroberfläche (eine Karte, speziell) verwenden, aber den Rest der Benutzeroberfläche rund um das Applet in HTML/JavaScript zu kommunizieren mit dem Applet über LiveConnect/NPAPI. Ein bisschen bizarr, ich weiß, aber nehmen wir an, Setup ist nicht in Diskussion. Ich habe angefangen, jQuery als mein JavaScript-Framework zu verwenden, aber ich habe zwei Probleme festgestellt.jQuery und Java-Applets

Ausgabe die erste:

das Applet Auswahl Zugriff auf die Methoden des Applets nicht vorgesehen.

Java:

public class MyApplet extends JApplet { 
    // ... 
    public String foo() { return "foo!"; } 
} 

JavaScript:

var applet = $("#applet-id"); 
alert(applet.foo()); 

Ausführen des obigen Ergebnisse JavaScript in

$("#applet-id").foo is not a function

Dies steht im Gegensatz zu Prototype, wobei der analoge Code funktionierts:

var applet = $("applet-id"); 
alert(applet.foo()); 

Also ... wo sind die Applet-Methoden?

Ausgabe des zweiten:

Es ist ein bekanntes Problem mit jQuery und Applets in Firefox 2: http://www.pengoworks.com/workshop/jquery/bug_applet/jquery_applet_bug.htm

Es ist ein weit hergeholt, aber jemand, der dieses Problem zu umgehen weiß? Ich vermute, dass dieses Problem nicht behoben werden kann, was bedeutet, dass ich zu Prototype wechseln muss.

Danke für die Hilfe!

Antwort

12

Für die erste Ausgabe, wie etwa

alert($("#applet-id")[0].foo()); 

Für die zweite Ausgabe hier versucht, ein thread mit einer möglichen Abhilfe ist.

die Problemumgehung, dass Code zu

// Prevent memory leaks in IE 
// And prevent errors on refresh with events like mouseover in other browsers 
// Window isn't included so as not to unbind existing unload events 
jQuery(window).bind("unload", 
function() { 
     jQuery("*").add(document).unbind(); 
}); 

Änderung Zitiert:

// Window isn't included so as not to unbind existing unload events 
jQuery(window).bind("unload", 
function() { 
     jQuery("*:not('applet, object')").add(document).unbind(); 
});