在使用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或其他库,我想确保无论控件的哪个组合都呈现给页面,脚本引用以正确的顺序呈现,以避免任何依赖性问题。
除了弄清楚如何规定依赖脚本的顺序之外,请随意撕掉您在此处看到的任何不良做法或问题代码。
答案 0 :(得分:0)
不一定是声明确定顺序的脚本的顺序。如果您有许多脚本和许多DocumentReady函数,因为Jquery循环并处理每个DocumentReady函数块,如果文档尚未就绪,它会将函数推送到等待堆栈。如果文档准备就绪,它会立即处理该功能。因此,DocReady调用第一个包含的内容总是可能最后执行,而最后一个包含将首先执行,因为在文档最终准备就绪时会在最后执行。
这篇文章很好地解释了它,并为它提出了一个解决方法: