Windows desktop gadgets Windows小工具:如何修改DOM?

Windows desktop gadgets Windows小工具:如何修改DOM?,windows-desktop-gadgets,Windows Desktop Gadgets,我一直在努力创建一个Windows桌面小工具。我可以使用document.createElement创建所需的HTML元素。我可以设置它们的属性,也可以在设置它们之后获得这些属性,但是我所做的任何修改文档的操作都会完全失败。我没有看到任何错误,但这个小工具就是没有改变。甚至像document.body.innerHTML=“asdf”这样简单的东西完全不做任何事情。IE8中的相同代码工作得非常好。我错过了什么 gadget.xml: <?xml version="2.0" encoding

我一直在努力创建一个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>

您的代码看起来不错,我已经多次使用
innerHTML
和link
onclick
s。我会检查两件事

就在您的
document.body.innerHTML=“asdf”的正上方行,放置
窗口提示(“,”)。这将允许您验证函数是否被调用:

function testFunction() 
{
    window.prompt("", "");
    // window.prompt("", document.body.innerHTML);    // before
    document.body.innerHTML = "asdf";
    // window.prompt("", document.body.innerHTML);    // after
} 
您还可以添加一些before/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问题,但我的第一个建议(
提示符
)可能会让您了解问题所在。
更新

应该早就发现了。您需要使用
returnfalse取消默认操作,单击链接的:

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


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

您能发布一些代码吗?在gadget中修改DOM就像在IE中一样简单,所以问题可能出在其他地方。我已经在主帖中添加了代码。我尝试了你的建议,并在修改后输出document.body.innerHTML的值。该值应显示为“asdf”,但小部件的界面没有更新。DOM更新后是否需要为小部件运行重画功能?@bshacklett:no这意味着很可能在某个地方有一个无限制的转换(请参阅我文章的第二部分)。这是在允许JavaScript代码执行的同时阻止窗口重画的唯一方法。我现在会检查您的所有文件并注释掉任何转换代码。很抱歉,我忘了提到正在运行的唯一代码是上面列出的“testFunction()”。我把其他的都处理掉了,就是这样!谢谢这让我快发疯了!
System.Gadget.beginTransition();
blah = blah.blah.blah.blah;         // "blah" is null or not an object
System.Gadget.endTransition(System.Gadget.TransitionType.morph, 1.0);
   <a href="#" onClick="testFunction(); return false;">New Server</a>