2011-07-28 60 views
0

我有一個Web部件,它創建了一些與用戶指定的任何時區結合的模擬時鐘。我遇到的問題是我的時鐘有時會加載,有時候不會。我相信我的問題在於我的js文件的加載順序。我在我的web部件代碼中加載了一個OnLoad事件,並且我的clock.js文件(構建時鐘的文件)在我的代碼給出UTC時間+偏移量被定義之前先運行。如何延遲JavaScript文件使用HtmlTextWritter在C#中加載最後一個

這裏是我的代碼,以顯示時鐘的時鐘:

protected override void Render(HtmlTextWriter output) 
    { 
    base.Render(output); 


var skins = this._ClockSkins.ToString(); 

output.Write("<table align=\"center\"><tr>"); 

for (int i = 0; i < 6; i++) 
{ 



output.RenderBeginTag(HtmlTextWriterTag.Script); 
output.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); 

//output.Write("var time;"); 
output.Write("function LoadTrigger() {"); 
output.Write("document.write('<span><div width=\"90px\"><td width=\"90px\" valign=\"top\" align=\"center\" ><canvas class=\"CoolClock:" + skins + "\" id=\"[" + i + "]\" ></canvas></td></div></span>');"); 
output.Write("}"); 
output.Write("window.onload = LoadTrigger();"); 
//output.Write("window.setTimeout(\"LoadTrigger()\", 1000);"); 
output.RenderEndTag(); 

//output.Write("<script defer=\"defer\" type=\"text/javascript\">document.write  ('<span><div width=\"90px\"><td width=\"90px\" valign=\"top\" align=\"center\" ><canvas class=\"CoolClock:" + skins + "\" id=\"[" + i + "]\" ></canvas></td></div></span>');</script>"); 
} 

output.Write("</tr></table>"); 


} 
} 

現在有時時鐘將呈現細,有時候我會爲我的模擬時鐘外殼和無分,秒指針(這些都是基於它設置的時區來渲染)。正如你從我註釋掉的代碼中可以看到的,我嘗試了幾種不同的方法來使它正確工作。任何有關我的時鐘爲什麼有效的問題,如果我刷新頁面幾次,他們將工作。

回答

1

您可以使用類似

setTimeout(function(){ 
    document.write("<script type='text/javascript' src='clock.js'></script> 
"); 
}, 1000); 

耽誤您的網頁列入本的寫作。

+0

我試過了,我面對的問題是這是一個wsp。 JavaScript文件不能從scr =「myjs.js方法中調用,因爲它們並不位於項目的根級別,並且它們不在12配置單元中,所以也沒有」_layouts/myjs.js「。他們進入程序集,並且由於SharePoint有時候是一個邪惡的助推器,這就是它如何完成的,我也試過了所有的時間,我開始認爲它不會起作用。對你的幫助非常感謝 – lazoDev

+0

是的,我認爲這對你來說太簡單了,沒有嘗試過,我想如果你想弄亂,你可以把.js文件的內容寫到頁面上 – Maxx

+0

我會,但它是一個大文件:)什麼讓我生氣是我使用的web服務調用是在JavaScript中,我認爲這是我的問題所在,我使用的是一個C#web服務調用,但效果很好;但是,我正在將其部署到多個環境中,這意味着對webser的url進行硬編碼在web.config中擔心。使用JS我不必這樣做(window.href),但我無法每次渲染這個東西。奇怪的是,它會工作,但只有當它想要。 – lazoDev

1

如果你正在調用一個js文件,你能夠實際使用jQuery嗎?如果您能夠將JQuery添加到.js文件中,則可以使用以下代碼:

$(document).ready(function(){ ...您的東西在這裏... });

然後在頁面加載後執行。

+0

我可以,但是如果您查看代碼,我使用的JavaScript就是C#HtmlTextWriter方法的內部。這意味着它仍然不會達到$(document).ready(function {....});直到我需要的所有東西都運行完畢。相信我,我經歷了所有的顯而易見的事情。就像我說的,我認爲我將不得不使用C#web服務調用並手動進入並更改web.config文件中的URL。同樣,這並不是說我的代碼根本無法工作,它每次加載或刷新頁面時都不會加載。但它會加載時SharePoint感覺像這樣:) – lazoDev

+1

瞭解。我試圖建議的是刪除線:output.Write(「window.onload = LoadTrigger();」);而是添加如下內容:output.Write(「$(document).ready(function(){LoadTrigger();});」);然後它將允許您在HtmlTextWriter方法中創建函數,但通過JQuery觸發它來驗證該頁面是否已完全加載。 – PapaDaniel