3

我一直致力于创建 Windows 桌面小工具。我可以使用 document.createElement 创建我想要的 HTML 元素。我可以设置它们的属性,并且可以在设置它们之后获取这些属性,但是我为修改文档所做的任何事情都会完全静默地失败。我根本没有看到任何错误,但小工具并没有改变。即使是简单到什么都不做的document.body.innerHTML = "asdf";事情。IE8 中的相同代码运行良好。我在这里想念什么?

小工具.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>

小工具.js:

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

1 回答 1

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 问题的原因,但我的第一个建议 (the prompt) 可能会让您了解问题所在。


更新

早该发现这一点。您需要使用 取消return false;链接单击的默认操作:

   <a href="#" onClick="testFunction(); return false;">New Server</a> 

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

于 2010-02-20T10:54:33.570 回答