2010-02-18 83 views
3

我一直在创建一个Windows桌面小工具。我可以用document.createElement创建我想要的HTML元素。我可以设置它们的属性,并且可以在设置它们后获取这些属性,但是我所做的任何修改文档的操作都完全失败。我没有看到任何错误,但小工具不会改变。即使像document.body.innerHTML = "asdf";这样简单的事情也绝对没有。在IE8中相同的代码工作得很好。我在这里错过了什么?Windows小工具:如何修改DOM?

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

你能发表一些代码吗?修改DOM在小工具中与在IE中一样简单,所以问题可能在别处。 – 2010-02-19 00:09:11

+0

我已将代码添加到主帖子中。 – bshacklett 2010-02-19 00:56:14

回答

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)可能会让你知道问题是什么。


UPDATE

如果之前已经看准了这一点。您需要取消默认操作,使用return false;,链接点击:

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

您的innerHTML功能运行后,页面导航到“#”。我不认为这会是一个问题,因为#通常会将您带到页面定位点而无需重新加载,但看起来这是问题的原因。充分测试。

+0

我尝试了你的建议,并在改变它之后输出document.body.innerHTML的值。该值显示为“asdf”,但它的界面并未更新。 DOM更新后是否需要为小部件运行重绘功能? – bshacklett 2010-02-22 21:39:42

+0

@bshacklett:不,这意味着很可能有一个未完成的转换(见我的帖子的第二部分)。这是唯一可以阻止窗口重新绘制,同时允许JavaScript代码执行的窗口。我会检查所有的文件,并立即注释掉任何转换代码。 – 2010-02-23 11:36:23

+0

对不起,我忘了提及运行的唯一代码是“testFunction()”,它在上面列出。我摆脱了一切。 – bshacklett 2010-02-23 21:59:43