2010-07-15 87 views
11

我希望能夠使用Javascript功能動態地將Java小應用程序插入到網頁中,該功能在按下按鈕時被調用。 (在加載頁面時加載小程序會減慢速度,凍結瀏覽器等等)我正在使用以下代碼,它可以在FF中無縫工作,但在IE8,Safari 4和Chrome中沒有錯誤消息時會失敗。有沒有人有任何想法,爲什麼這不能按預期工作,以及如何動態插入一個適用於所有瀏覽器的小程序?我嘗試使用其他地方建議的document.write(),但是在頁面加載結果之後調用頁面被擦除,所以這不適合我。如何使用Javascript動態地嵌入Java小程序?

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

回答

1

我會建議做一些事情,比如你在做什麼;所以我很困惑,爲什麼它不工作。

Here's a document看起來很有權威性,來自馬的嘴巴,因爲它是。它提到了不同瀏覽器的特質。你可能最終需要爲不同的實現做不同的標籤湯。

但是,如果動態插入,applet/object標記可能會讓它們不能被處理,這或許有些神奇之處。沒有更多的合格建議,我有一個瘋狂的解決方法爲您提供:如何在不同的頁面上呈現小程序,並動態創建IFRAME以顯示您的小程序應占用的空間中的頁面? IFRAME在跨瀏覽器的語法上更加一致,如果它們以相同的方式失敗,我會感到驚訝。

也許你應該使用瀏覽器的調試工具來查看你的小應用程序節點交換後的DOM。也許它不是出現在你認爲它的地方,或者不是你認爲你正在創造的結構。你的代碼對我來說看起來不錯,但我對動態小程序不熟悉。

+0

嗨, 感謝您的建議! IFrame的想法很好,如果我無法使動態插入工作,我可能會使用它。插入applet後,我在IE中查看了DOM,這很奇怪。當插入小程序時,我可以看到包含的div有所擴展以容納小程序,但代碼從不出現在DOM中,並且小程序從不執行。我不知道爲什麼會發生這種情況... – Jonathan 2010-07-15 20:27:44

+1

鏈接已損壞:( – Antonio 2013-02-12 21:59:35

3
document.write() 

將覆蓋整個文檔。如果你想保留文檔,只想添加一個applet,你需要追加它。

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

此代碼將添加小程序作爲正文標記的最後一個元素。確保在DOM處理完成後運行它,否則會出現錯誤。 Body OnLoad,或推薦使用jQuery。

+0

非常感謝您提供了非常明確的答案+1。所以,我只是想讓所有知道「.class」爲「app.code」的值 – Koffy 2014-05-02 12:21:18

1

有一個JavaScript庫,用於此目的: 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

此JavaScript庫使用document.write(),它覆蓋整個文檔。請參閱我的答案以瞭解如何解決該問題。 – BrunoJCM 2013-10-02 18:27:30

+0

這可能已在更高版本中修復。 – 2015-09-08 19:17:09

0

我做了類似於海灘小屋建議的東西。我修改了deployJava.js這樣的:

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

它的工作確定在Chrome,Firefox和IE瀏覽器。目前沒有問題。

我試着先在我的html文件上創建一個div,並將其innerHTML設置爲appletString,但只有IE能夠動態地檢測到新的小程序。將整個div直接插入body適用於所有瀏覽器。

0

創建一個新的applet元素並使用appendChild將其追加到現有元素。

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

...

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

...

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

此外,還要確保現有的元素是可見的,這意味着你沒有設置css來隱藏它,否則,使用後的appendChild瀏覽器將不會加載的小程序。我花了太多時間試圖弄清楚。

0

這爲我工作:

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

----- HTML代碼:

<div id="applet_div"></div> 
相關問題