在使用IScriptControl接口实现自定义控件时,如何指定脚本呈现到页面的顺序?
下面是我正在做的一个例子:
public class MyScriptControl : WebControl, IScriptControl
{
private static ConcurrentBag<ScriptReference> ScriptReferences;
static MyScriptControl()
{
ScriptReferences = new ConcurrentBag<ScriptReference>
{
new ScriptReference { Name = "jquery" },
new ScriptReference { Name = "jquery-ui" },
new ScriptReference { Name = "myscriptcontrol" }
};
ScriptManager.ScriptResourceMapping.AddDefinition("myscriptcontrol",
new ScriptResourceDefinition
{
ResourceAssembly = Assembly.GetCallingAssembly(),
ResourceName = "Path.To.Scripts.myscriptcontrol.js"
}
);
}
public MyScriptControl()
{ }
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ScriptManager.GetCurrent(Page)
.RegisterScriptControl<MyScriptControl>(this);
}
protected override void Render(HtmlTextWriter writer)
{
// Render UI
}
public IEnumerable<ScriptReference> GetScriptReferences()
{
foreach (var reference in ScriptReferences)
{
yield return reference;
}
}
public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
return new ScriptDescriptor[] { };
}
}上面的代码产生了一个问题,因为它在呈现jQuery脚本引用之前呈现jQueryUI脚本引用。如果我更改了顺序,脚本将以正确的顺序呈现:
ScriptReferences = new ConcurrentBag<ScriptReference>
{
new ScriptReference { Name = "myscriptcontrol" },
new ScriptReference { Name = "jquery-ui" },
new ScriptReference { Name = "jquery" }
};这对于单个控件来说是很棒的,但我正在开发几十个内部控件,其中一些将依赖于jQuery或其他库,并且我希望确保无论呈现给页面的控件组合是什么,脚本引用都会以正确的顺序呈现,以避免任何依赖项问题。
除了弄清楚如何指定依赖脚本的顺序之外,您还可以随意拆解您在此处看到的任何糟糕的实践或问题代码。
发布于 2011-07-14 23:49:29
决定顺序的不一定是脚本声明的顺序。如果您有许多脚本和许多DocumentReady函数,当Jquery遍历和处理每个DocumentReady函数块时,如果文档还没有准备好,它会将函数推入等待堆栈。如果文档准备就绪,它会立即处理函数。因此,第一个includes的DocReady调用总是最后执行,最后一个调用将首先执行,这是可能的,因为它们是在文档最终准备就绪时在最后处理的。
这篇文章很好地解释了这一点,并提出了一个解决方法:
Change Execution Order of DocumentReady
https://stackoverflow.com/questions/6502298
复制相似问题