2012-12-14 22 views
1

我正在使用Silverlight應用程序,當它加載到瀏覽器中時,它會設置一個html <param>標記(它位於silverlight內<object>標籤)與一個值。稍後在執行SL應用程序時,我需要更改<param>標記的值屬性。我試圖通過簡單地調用一個客戶端JavaScript函數來獲取param標記,然後調用objById.setAttribute(value,「my new value」)來實現此目的。這是奇怪的地方。按照這種方式設置屬性似乎是有效的,根據警報消息顯示在將其設置爲新值之後的屬性值。但是,當我在關閉警報對話框後在瀏覽器上查看源代碼時,我仍然看到網頁源代碼中的舊值。任何想法爲什麼源視圖不會顯示新的價值? param標籤上有一個runat="server"屬性,因爲它在加載時最初由Silverlight應用程序設置。 runat = server屬性是否會在這裏引發問題?如何使用JavaScript更改html值<param> value屬性還有runat =「server」

HTML:

<div id="silverlightControlHost"> 
    <object id="silverlightObject" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
    <param .../> 
    <param .../> 
    <param .../> 
    <param name="initParams" id="Ip" runat="server" /> 
    ... 

的Javascript:

function refreshInitParams(newParams) { 
    var slObjIp = document.getElementById("Ip"); 

    //Display Initial Value 
    alert(slObjIp.getAttribute("value").toString()); 
    //Set New Value 
    slObjIp.setAttribute("value", "New Value"); 
    //Display new value 
    alert(slObjIp.getAttribute("value").toString()); 
} 

回答

2

當解析HTML時,瀏覽器會從原始文本中生成Document Object Model(DOM)。這有點類似於編譯的一個計算機程序,因爲它以瀏覽器可以快速找到所需信息並使整體瀏覽器體驗流暢的方式來組織信息。例如,如果你打電話給document.getElementById(),瀏覽器不會再重新解析所有的HTML,它只是查找有問題的元素的ID索引(可能是一個哈希表)。

出於這個原因,當你更新 DOM元素,使用你的情況setAttribute,瀏覽器只更新DOM。它沒有任何理由重新生成DOM構建的HTML;這將毫無意義並造成不必要的開支。出於這個原因,如果您查看瀏覽器源代碼,您將看不到任何DOM更改。你只能看到源自它最初來自服務器的源。

希望這會有所幫助!

+0

謝謝 - 我在IE中查看源代碼。在Firefox/Firebug中查看它顯示更新的值。儘管你的解釋幫助我更好地理解了DOM。現在我只希望我的SL應用程序能夠找到更新的值! – lg1382

1

我假設你正在使用 「查看源文件」,在IE瀏覽器。
加載後頁面的來源不會更改。即使通過javascript在頁面上更改文本,也不會在查看源代碼時顯示。

如果您希望即時查看源代碼更改,請在其他瀏覽器(如Chrome)中使用Inspect Element。它會顯示通過腳本進行的任何更改。

相關問題