Mvc完成异步脚本加载

时间:2015-12-19 17:22:06

标签: javascript c# asp.net-mvc

我的网页上有异步加载脚本的小问题。 我需要异步加载页面的所有脚本。我尝试了很多程序,我在google上找到了它,但它仍然不完美。

现在我有这样的话:

  1. 将所有脚本从布局拆分为一个包,包括jquery。
  2. 在页面底部调用带有异步标记的RenderFormat。
  3. 现在这就是我遇到问题的地方:我需要解决其中的情况 这些脚本由@RenderFormat呈现。问题是那些 脚本的渲染时间比我需要的要早。
  4. 例如我在Home / Index文件中有这个:

    @Scripts.RenderFormat("<script async type=\"text/javascript\" src=\"{0}\"></script>", "~/bundles/raphael")
    

    或只是

    ...
    $(".datapicker").datapicker();
    ...
    

    我们收到错误,&#34; $未定义&#34;,因为尚未加载jquery。

    内容之后,在布局文件中我有:

    ...
    @Scripts.RenderFormat("<script async type=\"text/javascript\" src=\"{0}\"></script>", "~/bundles/frontall")
    ...
    @RenderSection("scripts", required: false)
    

    如果我将所有脚本放在页面上并将它们放到一个包中,一切都很好,但我不希望脚本被渲染, 我只需要在特定的部分中这样做。

    接下来的想法是创建一个自定义的RenderSection方法,它会像这样做:

        function async(u, c) {
        var d = document, t = 'script',
            o = d.createElement(t),
            s = d.getElementsByTagName(t)[0];
        o.src = u;
        if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); }
        s.parentNode.appendChild(o, s);
    }
    
    async("/bundles/jquery", function() {
        //here, load scripts from inner pages. Index, Detail...
    });
    

    有办法,怎么解决? 非常感谢你的时间。

1 个答案:

答案 0 :(得分:0)

好的家伙,解决了。

布局中有我当前的抄写:

...

 @RenderSection("scripts", required: false)

    <script>

    function async(u, c, css) {
        var t = 'script';
        var element = document.createElement(t);
        var s = document.getElementsByTagName(t)[0];
        element.src = u;

        if (css) {
            t = "link";
            element = document.createElement(t);
            element.href = u;
            element.rel = 'stylesheet';
            element.src = null;
            var head = document.getElementsByTagName('head')[0];
            head.appendChild(element, head);

            return;
        }

        if (c) { element.addEventListener('load', function (e) { c(null, e); }, false); }
        s.parentNode.appendChild(element, s);
    }

    function initScripts() {
        async("/content/css", null, true);
        async("/bundles/jquery", function () {
            @RenderSection("asyncScripts", required: false)
        });
    }

    if (window.addEventListener) {
        window.addEventListener("load", function () {
            initScripts();
        }, false);
    }
    else if (window.attachEvent) {
        window.attachEvent("onload", function () {
            initScripts();
        });
    } else {
        window.onload = function () {
            initScripts();
        };
    }

</script>

在其他文件中。 (索引,细节......)

@section scripts {
   <script type="text/javascript">
    var czech_republic = {};
    window.selectedRegions = [];

    czech_republic.regions = {
        @Html.Raw(string.Join(", ", regions.Select(r => string.Format("\"{0}\": \"{1}\"", r.RaphaelId, r.RaphaelCoordinates))))
    };

</script>
@section asyncScripts {
    @Scripts.RenderFormat("async(\"{0}\");", "~/bundles/raphael");
}

如果您需要调用下一个脚本,例如在raphael之后,您可以在renderformat async中简单地创建新的回调。

感谢所有