Windows小工具:如何修改DOM?

时间:2010-02-18 23:59:01

标签: windows-desktop-gadgets

我一直致力于创建Windows桌面小工具。我可以使用document.createElement创建我想要的HTML元素。我可以设置它们的属性,我可以在设置它们之后获取这些属性,但是我做的任何修改文档的操作都完全无声地失败。我根本没有看到任何错误,但小工具不会改变。即使像document.body.innerHTML = "asdf";这样简单的事情也绝对没有。 IE8中的相同代码完美无缺。我在这里缺少什么?

gadget.xml:

<?xml version="2.0" encoding="utf-8" ?>
<gadget>
<name>Citrix Logon Controller</name>
<version>0.1</version>
<author name="Brian G. Shacklett">
    <info url="http://digital-traffic.net" />
</author>
<copyright>&#169; Brian G. Shacklett</copyright>
<description>Controls Citrix Logons.</description>
<hosts>
    <host name="sidebar">
        <base type="HTML" apiVersion="1.0.0" src="gadget.html" />
        <permissions>Full</permissions>
        <platform minPlatformVersion="1.0" />
    </host>
</hosts>
</gadget>

HTML:

<html>
    <head>
    <title>Citrix Manager</title>
    <script type="text/javascript">
        debugger;
    </script>
    <script src="scripts/debug.js" type="text/javascript"></script>
    <script src="scripts/gadget.js" type="text/javascript"></script>
    <script src="scripts/util.js" type="text/javascript"></script>
    <link type="text/css" rel="stylesheet" href="styles/gadget.css" />
</head>

<body >
    <div id="header"><h1>Citrix Manager</h1></div>
    <div id="mainContent">
        <a href="#" onClick="window.location.reload()">reload</a><br />
        <a href="#" onClick="testFunction();">New Server</a>
    </div>
</body>
</html>

gadget.js:

function testFunction()
{
document.body.innerHTML = "asdf";
}

1 个答案:

答案 0 :(得分:1)

您的代码看起来很好,我使用innerHTML并链接onclick很多次。我会检查两件事。

document.body.innerHTML = "asdf";行的正上方,放置window.prompt("","");。这将允许您验证函数是否被调用:

function testFunction() 
{
    window.prompt("", "");
    // window.prompt("", document.body.innerHTML);    // before
    document.body.innerHTML = "asdf";
    // window.prompt("", document.body.innerHTML);    // after
} 

您还可以在提示之前/之后添加一些内容,以获得innerHTML的值(请参阅注释代码)。

其次,我会检查您可能正在使用的任何转换。在Vista System.Gadget.beginTransition()中,将锁定小工具的外观,直到调用System.Gadget.endTransition()为止。如果在这两个函数之间引发错误,则永远不会调用endTransition(),并且小工具将被锁定。

System.Gadget.beginTransition();
blah = blah.blah.blah.blah;         // "blah" is null or not an object
System.Gadget.endTransition(System.Gadget.TransitionType.morph, 1.0);

使用try / catch围绕其间的内容始终是最安全的。除此之外,我无法说出可能导致您的DOM问题的原因,但我的第一个建议(prompt)可能会让您了解问题所在。

<小时/> 的更新

之前应该发现这个。您需要使用链接点击:

取消return false;的默认操作
   <a href="#" onClick="testFunction(); return false;">New Server</a> 

运行innerHTML函数后,页面将导航到“#”。我不认为这会是一个问题,因为#通常会带你到一个页面锚点而不重新加载,但看起来这就是问题的原因。经过全面测试。