2010-02-18 3 views
3

저는 Windows 데스크톱 가젯을 만드는 중입니다. document.createElement를 사용하여 원하는 HTML 요소를 만들 수 있습니다. 속성을 설정할 수는 있지만 속성을 설정 한 후에 속성을 가져올 수는 있지만 문서를 수정하기 위해 수행하는 작업은 완전히 자동으로 실패합니다. 오류가 전혀 표시되지 않지만 가젯은 변경되지 않습니다. document.body.innerHTML = "asdf";과 같은 단순한 것조차 절대적으로 아무것도하지 않습니다. IE8의 동일한 코드가 완벽하게 작동합니다. 내가 여기서 무엇을 놓치고 있니?Windows Gadgets : 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와 마찬가지로 가제트 에서처럼 간단하므로 문제는 다른 곳에서 발생합니다. –

+0

코드를 메인 포스트에 추가했습니다. – bshacklett

답변

1

코드는 괜찮 은데, 나는 onclick의 단지 innerHTML 및 링크를 사용했다 여러 번 괜찮아. 나는 두 가지를 조사 할 것이다.

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;를 사용하여 기본 작업을 취소해야합니다 귀하의 innerHTML을 기능이 실행 된 후

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

, 페이지가 "#"를 탐색한다. 나는 이것이 문제가 될 것이라고 생각하지 않았다. 왜냐하면 # 일반적으로 페이지 로딩을하지 않고 페이지 앵커로 데려 간다. 그러나 이것이 문제의 원인 인 것처럼 보인다. 완전히 테스트되었습니다.

+0

나는 당신의 제안을 시도하고 그것을 변경 한 후에 document.body.innerHTML의 값을 출력했다. 값은 "asdf"로 표시되지만 위젯의 인터페이스는 업데이트되지 않습니다. DOM 업데이트 후 위젯에 대해 실행해야하는 다시 그리기 기능이 있습니까? – bshacklett

+0

@bshacklett : 아니요. 어딘가에 무인 전환이있을 가능성이 높습니다 (내 게시물의 두 번째 부분 참조). JavaScript 코드를 실행하는 동안 창을 다시 그릴 수있는 유일한 방법입니다. 모든 파일을 확인하고 현재 전환 코드를 주석 처리합니다. –

+0

죄송합니다. 위에 나열된 "testFunction()"만 실행되는 코드는 없습니다. 나는 그 밖의 모든 것을 제거했다. – bshacklett

관련 문제