首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在实现IScriptControl.GetScriptReferences时,我如何指定脚本呈现到页面的顺序?

在实现IScriptControl.GetScriptReferences时,我如何指定脚本呈现到页面的顺序?
EN

Stack Overflow用户
提问于 2011-06-28 14:10:33
回答 1查看 258关注 0票数 1

在使用IScriptControl接口实现自定义控件时,如何指定脚本呈现到页面的顺序?

下面是我正在做的一个例子:

代码语言:javascript
复制
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脚本引用。如果我更改了顺序,脚本将以正确的顺序呈现:

代码语言:javascript
复制
ScriptReferences = new ConcurrentBag<ScriptReference>
{
    new ScriptReference { Name = "myscriptcontrol" },
    new ScriptReference { Name = "jquery-ui" },
    new ScriptReference { Name = "jquery" }
};

这对于单个控件来说是很棒的,但我正在开发几十个内部控件,其中一些将依赖于jQuery或其他库,并且我希望确保无论呈现给页面的控件组合是什么,脚本引用都会以正确的顺序呈现,以避免任何依赖项问题。

除了弄清楚如何指定依赖脚本的顺序之外,您还可以随意拆解您在此处看到的任何糟糕的实践或问题代码。

EN

回答 1

Stack Overflow用户

发布于 2011-07-14 23:49:29

决定顺序的不一定是脚本声明的顺序。如果您有许多脚本和许多DocumentReady函数,当Jquery遍历和处理每个DocumentReady函数块时,如果文档还没有准备好,它会将函数推入等待堆栈。如果文档准备就绪,它会立即处理函数。因此,第一个includes的DocReady调用总是最后执行,最后一个调用将首先执行,这是可能的,因为它们是在文档最终准备就绪时在最后处理的。

这篇文章很好地解释了这一点,并提出了一个解决方法:

Change Execution Order of DocumentReady

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6502298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档