Comment enregistrer un rappel JavaScript dans une applet Java?

Je développe une applet Java invisible, qui sera entièrement contrôlée par JavaScript.

Je peux facilement appeler les méthodes Java de l’applet et des méthodes JavaScript à partir de l’applet en utilisant netscape.javascript.JSObject.getWindow(this).call() .

Mais pour enregistrer un rappel JavaScript dans l’applet, j’imagine qu’il me faudrait un object fonction JavaScript.

Je voudrais faire:

 public void registerCallback( SomeJavascriptFunction func ) { ... } 

Ce que je pourrais appeler depuis Javascript:

 myapplet.registerCallback(function(){ alert("called back"); }); 

Je pourrais donc appeler cette fonction dans le code suivant:

 func.call( ... ); 

Est-ce que quelque chose comme ça existe? Comment puis-je faire ceci?

Bien maintenant, je pense à créer du Javascript pour gérer ce mécanisme de rappel au lieu de le faire à partir de l’applet.

    Je suis un nouvel utilisateur de la communication Java <-> JavaScript, car je comptais l’étudier cette semaine. Une bonne opportunité ici … 🙂

    Après quelques tests, il semble que vous ne puissiez pas transmettre une fonction JS à un applet Java. À moins que je ne le fasse de la mauvaise façon …

    J’ai essayé:

     function CallJava() { document.Applet.Call("Does it work?"); document.Applet.Call(function () { alert("It works!"); }); document.Applet.Call(DoSomething); // A simple parameterless JS function document.Applet.Call(window.location); } function DumbTest(message, value) { alert("This is a dumb test with a message:\n" + message + "\n" + value); } 

    où Call est défini comme:

     public void Call(Ssortingng message) { JSObject win = (JSObject) JSObject.getWindow(this); Ssortingng[] arguments = { "Call with Ssortingng", message }; win.call("DumbTest", arguments); } public void Call(JSObject jso) { JSObject win = (JSObject) JSObject.getWindow(this); Ssortingng[] arguments = { "Call with JSObject", jso.toSsortingng() }; win.call("DumbTest", arguments); } 

    Lorsque je passe une fonction JS (tous les tests en FF3), je reçois un null du côté Java.

    Notez que la routine Java suivante permet d’afficher le code JS de la fonction DumberTest!

     public int Do() { JSObject win = (JSObject) JSObject.getWindow(this); JSObject doc = (JSObject) win.getMember("document"); JSObject fun = (JSObject) win.getMember("DumberTest"); JSObject loc = (JSObject) doc.getMember("location"); Ssortingng href = (Ssortingng) loc.getMember("href"); Ssortingng[] arguments = { href, fun.toSsortingng() }; win.call("DumbTest", arguments); return fun.toSsortingng().length(); } 

    Au fait: j’ai créé une fonction JS:

     function RegisterCallback(cbFunction) { var callback = cbFunction.toSsortingng(); // We get JS code var callbackName = /^function (\w+)\(/.exec(callback); document.Applet.RegisterCallback(callbackName[1]); } 

    J’extrais le nom de la fonction JS du résultat toSsortingng et le passais à l’applet Java. Je ne pense pas que nous puissions gérer des fonctions anonymes, car Java appelle les fonctions JS par leur nom.

    Côté Java:

     Ssortingng callbackFunction; public void RegisterCallback(Ssortingng functionName) { callbackFunction = functionName; } void UseCallbackFunction() { if (callbackFunction == null) return; JSObject win = (JSObject) JSObject.getWindow(this); win.call(callbackFunction, null); } 

    Je me rends compte que c’est une question très ancienne, mais elle s’est classée au 2e rang d’une de mes recherches pour quelque chose d’autre, et je pense que le texte ci-dessous peut aider quelqu’un d’autre à le trouver.

    J’ai récemment réalisé quelque chose de similaire, selon lequel un applet Java doit rappeler en JavaScript à la fin d’une tâche et appeler différentes fonctions en cas de succès ou d’erreur. Comme cela a été la tendance ces derniers temps, je devais faire appel à des fonctions anonymes définies comme des parameters transmis à d’autres fonctions. C’est le javascript côté client:

     applet.DoProcessing({ success: function(param) { alert('Success: ' + param); }, error: function(param) { alert('Failed: ' + param); } }); 

    Comme mentionné dans les autres réponses, Java ne peut appeler des méthodes JavaScript que par leur nom. Cela signifie que vous avez besoin d’une méthode de rappel globale, qui peut ensuite faire appel à d’autres méthodes selon les besoins:

     function ProcessingCallback(isSuccessful, cbParam, jsObject) { if (isSuccessful && jsObject.success) jsObject.success(cbParam); else if (!isSuccessful && jsObject.error) jsObject.error(cbParam); } 

    Cette fonction est appelée directement depuis l’applet Java:

     public void DoProcessing(final Object callbacks) { //do processing.... JSObject w = JSObject.getWindow(this); //Call our named callback, note how we pass the callbacks parameter straight //back out again - it will be unchanged in javascript. w.call("ProcessingCallback", new Object[]{successful, output, callbacks}); } 

    Vous pouvez conserver la référence de l’object paramètre passée indéfiniment si vous souhaitez l’utiliser comme une forme de rappel enregistré plutôt que jetable, si besoin est, etc.

    Dans notre cas, le traitement peut prendre beaucoup de temps, nous allons donc créer un autre thread – les callbacks fonctionnent toujours ici aussi:

     public void DoProcessing(final Object callbacks) { //hold a reference for use in the thread final Applet app = this; //Create a new Thread object to run our request asynchronously //so we can return back to single threaded javascript immediately Thread async = new Thread() { //Thread objects need a run method public void run() { //do processing.... JSObject w = JSObject.getWindow(app); //Call our named callback, note how we pass the callbacks parameter //straight back out again - it will be unchanged in javascript. w.call("ProcessingCallback", new Object[]{successful, output, callbacks}); } } //start the thread async.start(); } 

    win.eval () appellera un javascript prédéfini.

     Ssortingng callbackFunction; public void RegisterCallback(Ssortingng functionName) { callbackFunction = functionName; } void UseCallbackFunction() { if (callbackFunction == null) return; JSObject win = (JSObject) JSObject.getWindow(this); win.eval(callbackFunction); }