1

我正在使用 Silverlight 应用程序,当加载到浏览器中时,它会设置一个带有值的 html<param>标记(位于 silverlight<object>标记内)。稍后在执行 SL 应用程序期间,我需要更改 <param>标签。我试图通过简单地调用一个客户端javascript函数来实现这一点,该函数通过它的id获取param标签,然后调用objById.setAttribute(value,"my new value")。这就是奇怪的地方。根据将属性设置为新值后显示属性值的警报消息,以这种方式设置属性似乎有效。但是,当我在关闭警报对话框后在浏览器上查看源代码时,我仍然会在网页源代码中看到旧值。知道为什么源视图不会显示新值吗?param 标记确实有一个runat="server"属性,因为它最初是由 Silverlight 应用程序在加载时设置的。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());
}
4

2 回答 2

2

解析 HTML 时,浏览器会根据原始文本构建文档对象模型(DOM)。这有点类似于编译计算机程序,因为它以浏览器可以快速找到所需信息并使整体浏览器体验流畅的方式组织信息。例如,如果您调用document.getElementById(),浏览器不会再次重新解析所有 HTML,它只会查找相关元素的 ID 索引(可能是哈希表)。

出于这个原因,当您更新DOM 元素时,setAttribute在您的情况下,浏览器只更新 DOM。没有理由重新生成构建 DOM 的 HTML;这将毫无意义,并造成不必要的开支。因此,如果您查看浏览器源代码,您将不会看到任何反映的 DOM 更改。您只会看到最初来自服务器的源。

希望这可以帮助!

于 2012-12-14T17:38:13.137 回答
1

我假设您在 IE 中使用“查看源代码”。
页面的来源在加载后不会改变。在查看源代码时,即使通过 javascript 更改页面上的文本也不会显示。

如果您希望即时查看源代码更改,请在其他浏览器(例如 Chrome)中使用 Inspect Element。它将向您显示通过脚本所做的任何更改。

于 2012-12-14T17:32:48.333 回答