2009-09-16 55 views
5

我正在使用ScriptManager.RegisterStartupScript来注册对大量JS函数的调用。RegisterStartupScript和执行顺序

ScriptManager.RegisterStartupScript(this, this.GetType(), "Script1", "SomeScript1", true); 
ScriptManager.RegisterStartupScript(this, this.GetType(), "Script2", "SomeScript1", true); 
ScriptManager.RegisterStartupScript(this, this.GetType(), "EndScript", "EndScript", true); 

当呈现HTML时,它将按顺序添加它们。

<script type="text/javascript"> 
//<![CDATA[ 
other functions calls.. 
SomeScript1();SomeScript2();EndScript(); 
//]]> 
</script> 

然而,当我在调试模式下步,脚本的执行并不为了(例如:EndScript执行第一前SomeScript1SomeScript2

ScriptManager.RegisterStartupScript gaurantee执行的顺序它加入?如果不是,有什么办法(我想最后总是执行EndScript

回答

6

从MSDN页RegisterStartupScript:不能保证输出由使用RegisterStartupScript注册

启动脚本块按照它们的登记顺序。如果启动脚本块的顺序很重要,请使用StringBuilder对象将脚本块收集到单个字符串中,然后将它们全部注册为单个启动脚本。

将它们呈现给页面后,脚本的实际执行由浏览器处理,并且与ScriptManager控件没有任何关系。看看你发布的例子,浏览器应该按照他们写的顺序执行。您的EndScript函数是否可以通过页面上的其他东西调用?另外,如果您使用任何类型的回调,则回调完成时的时间是不确定的。您能否提供这些脚本中每个脚本的代码示例?

+0

但他们以正确的顺序添加。 MSDN链接是否暗示它们将按正确的顺序添加,但不会按照添加的顺序执行?不幸的是,我无法将所有的脚本块都收集到一个字符串中。任何其他解决方法? – Nick 2009-09-16 21:45:44

2

您显示的输出保证按该顺序运行。

如果SomeScriptX在其机构内发出setTimeout调用,则可能EndScriptSomeScriptX()已完成其工作之前开始执行。

或者,也许“其他函数调用..”在某处深处调用EndScript()

无论哪种方式,如果你能保证ScriptManager被呈现在其输出准确顺序,然后就是用JavaScript执行中的顺序。