2010-07-15 15 views
11

Quiero ser capaz de insertar un applet de Java en una página web de forma dinámica utilizando una función de Javascript que se llama cuando se presiona un botón. (Cargar el applet en la carga de la página ralentiza demasiado las cosas, congela el navegador, etc ...) Estoy usando el siguiente código, que funciona a la perfección en FF, pero falla sin mensajes de error en IE8, Safari 4 y Chrome. ¿Alguien tiene alguna idea de por qué esto no funciona como se espera, y cómo insertar dinámicamente un applet de manera que funcione en todos los navegadores? Intenté usar document.write() como se sugiere en otra parte, pero llamar a eso una vez que la página cargó los resultados en la página que se está borrando, entonces esa no es una opción para mí.¿Cómo puedo incrustar un applet de Java dinámicamente con Javascript?

function createPlayer(parentElem) 
{ 
    // The abc variable is declared and set here 

    player = document.createElement('object'); 
    player.setAttribute("classid", "java:TunePlayer.class"); 
    player.setAttribute("archive", "TunePlayer.class,PlayerListener.class,abc4j.jar"); 
    player.setAttribute("codeType", "application/x-java-applet"); 
    player.id = "tuneplayer"; 
    player.setAttribute("width", 1); 
    player.setAttribute("height", 1); 

    param = document.createElement('param'); 
    param.name = "abc"; 
    param.value = abc; 
    player.appendChild(param); 

    param = document.createElement('param'); 
    param.name = "mayscript"; 
    param.value = true; 
    player.appendChild(param); 

    parentElem.appendChild(player); 
} 

Respuesta

1

Hubiera sugerido hacer algo como lo que está haciendo; así que estoy desconcertado de por qué no está funcionando.

Here's a document que parece bastante autorizado, viniendo de la boca del caballo por así decirlo. Menciona la idiosincrasia de diferentes navegadores. Puede terminar necesitando diferentes sopas de etiquetas para diferentes implementaciones.

Pero tal vez haya algo mágico sobre las etiquetas de applet/objeto que evita que se procesen si se insertan dinámicamente. Al no tener más consejos calificados, tengo una alternativa loca para ofrecerte: ¿cómo se presenta el applet en una página diferente y dinámicamente crear un IFRAME para mostrar esa página en el espacio que debe ocupar tu applet? Las IFRAME son un poco más consistentes en sintaxis en todos los navegadores, y me sorprendería si fallaran de la misma manera.

Quizás deba utilizar las herramientas de depuración de su navegador para mirar el DOM después de cambiar el nodo de su applet. Tal vez no esté apareciendo donde crees que está, o no con la estructura que crees que estás creando. Tu código me parece bien, pero no tengo mucha experiencia con los applets dinámicos.

+0

Hola, Gracias por sus sugerencias! La idea de IFrame es buena, y probablemente la use si no puedo lograr que la inserción dinámica funcione. Miré el DOM en IE después de insertar el applet, y es muy extraño. Al insertar el applet, puedo ver que el div que contiene se expande un poco para acomodar el applet, pero el código nunca aparece en el DOM, y el applet nunca se ejecuta. No tengo idea de por qué sucede esto ... – Jonathan

+1

El enlace está roto :( – Antonio

3
document.write() 

Sobreescribirá el documento completo. Si desea conservar el documento y solo desea agregar un applet, deberá agregarlo.

var app = document.createElement('applet'); 
app.id= 'Java'; 
app.archive= 'Java.jar'; 
app.code= 'Java.class'; 
app.width = '400'; 
app.height = '10'; 
document.getElementsByTagName('body')[0].appendChild(app); 

Este código agregará el applet como último elemento de la etiqueta de cuerpo. Asegúrese de que esto se ejecute después de que el DOM se haya procesado o se producirá un error. Body OnLoad, o jQuery listo recomendado.

+0

Gracias por la respuesta muy clara +1. Sin embargo, solo quiero que todos sepan que el valor '.class' al valor "app.code" ya no es necesario. – Koffy

1

Hay una biblioteca JavaScript para este propósito: http://www.java.com/js/deployJava.js

// launch the Java 2D applet on JRE version 1.6.0 
// or higher with one parameter (fontSize) 
<script src= 
    "http://www.java.com/js/deployJava.js"></script> 
<script> 
    var attributes = {code:'java2d.Java2DemoApplet.class', 
     archive:'http://java.sun.com/products/plugin/1.5.0/demos/plugin/jfc/Java2D/Java2Demo.jar', 
     width:710, height:540} ; 
    var parameters = {fontSize:16} ; 
    var version = '1.6' ; 
    deployJava.runApplet(attributes, parameters, version); 
</script> 
+0

Esta biblioteca de JavaScript usa document.write(), que reemplaza todo el documento. Consulte mi respuesta para descubrir cómo solucionarlo. – BrunoJCM

+0

Esto puede haberse solucionado en una versión posterior. –

0

hice algo similar a lo que sugirió Beachhouse. He modificado el deployJava.js así:

writeAppletTag: function(attributes, parameters) { 
    ... 

    // don't write directly to document anymore 
    //document.write(startApplet + '\n' + params + '\n' + endApplet); 

    var appletString = startApplet + '\n' + params + '\n' + endApplet; 
    var divApplet = document.createElement('div'); 

    divApplet.id = "divApplet"; 
    divApplet.innerHTML = appletString; 
    divApplet.style = "visibility: hidden; display: none;"; 

    document.body.appendChild(divApplet); 
} 

Se trabajó bien en Chrome, Firefox e IE. Sin problemas hasta ahora.

me trató en un principio para tener un div ya creada en mi archivo html y acaba de establecer su innerHTML a la appletString, pero sólo IE fueron capaces de detectar el nuevo applet de forma dinámica. Inserte toda la dirección div en el body funciona en todos los navegadores.

0

Crea un nuevo elemento de applet y añádelo a un elemento existente usando appendChild.

var applet = document.createElement('applet'); 
applet.id = 'player'; 

...

var param = document.createElement('param'); 

...

applet.appendChild(param); 
document.getElementById('existingElement').appendChild(applet); 

También, asegúrese de que el elemento existente es visible, lo que significa que no se ha establecido css de ocultarlo, de lo contrario el navegador no se carga el applet después de usar appendChild. Pasé demasiadas horas tratando de resolver eso.

0

Esto funcionó para mí:

// my js code 
    var app = document.createElement('applet'); 
    app.code= 'MyApplet2.class'; 
    app.width = '400'; 
    app.height = '10'; 

    var p1 = document.createElement('param'); 
    p1.name = 'sm_UnwindType'; 
    p1.value='200'; 
    var p2 = document.createElement('param'); 
    p2.name = 'sm_Intraday'; 
    p2.value='300'; 

    app.appendChild(p1); 
    app.appendChild(p2); 

    var appDiv = document.getElementById('applet_div'); 
    appDiv.appendChild(app); 

----- código html:

<div id="applet_div"></div> 
Cuestiones relacionadas