Windows desktop gadgets Windows小工具:如何修改DOM?
我一直在努力创建一个Windows桌面小工具。我可以使用document.createElement创建所需的HTML元素。我可以设置它们的属性,也可以在设置它们之后获得这些属性,但是我所做的任何修改文档的操作都会完全失败。我没有看到任何错误,但这个小工具就是没有改变。甚至像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
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>© 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
和linkonclick
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>