重构“停止运行此脚本?” jquery中的错误

时间:2012-08-09 21:53:04

标签: javascript jquery internet-explorer

我一直在调整这个和那个以及另一个试​​图获得“停止运行这个脚本?”在IE7中消失的错误 - 所有用户此时都需要使用的浏览器:P我尝试了几次改进尝试;所有这些都导致脚本停止工作,而不是长时间运行。我尝试过使用setTimeout(),没有运气。我可能没有正确地做到这一点。任何人都可以提出改进方法,以提高效率(并让那长时间运行的脚本消息消失)?

以下是代码:

HTML:

<div class="changeView" style="float:right;">Show All...</div>
<div id="accordion" style="width: 99%;">
    <% foreach (var obj in Model.Objects) { %>
        <h3><a href="#"><span class="title"><%:obj.Id%></span><span class="status" style="font-size:75%"> - <%:obj.Status%></span></a></h3>
        <div id="<%:obj.Id %>">
            <div class="loading"><img src="<%=Url.Content("~/Content/Images/ajaxLoader.gif") %>" alt="loading..." /></div>
        </div>
    <% } %>
</div>

然后我们有一个onclick函数来启动它...

$(function () {
    $(".changeView").click(function () {
        var divText = $(this).html();
        var src = '<%=Url.Content("~/Content/Images/ajax-loader.gif")%>';

        if (divText == "Show All...") {
            $(this).html("Show Filtered...");
            $('#accordion').accordion('destroy');
            $('#accordion').empty();
            $('#accordion').addClass("loading");
            $('#accordion').append('Loading Information...<img src="' + src + '" alt="loading..." />');
            changePartialView("all");
        }
        else {
            $(this).html("Show All...");
            $('#accordion').accordion('destroy');
            $('#accordion').empty();
            $('#accordion').addClass("loading");
            $('#accordion').append('Loading Information...<img src="' + src + '" alt="loading..." />');
            changePartialView("filter");
        }
    });
});

接下来调用changeView函数:

//change view and reinit accordion
function changePartialView(viewType) {
    $.ajax({
        type: "POST",
        url: "<%:Model.BaseUrl%>" + "ToggleView",
        data: "Type=<%:Model.Target%>&Id=<%:Model.Id%>&view=" + viewType,
        success: function (result) {
            $('#accordion').empty();
            $('#accordion').removeClass();
            for (var index = 0; index < result.Html.length; index++) {
                $('#accordion').append(result.Html[index]);
            }
            var $acc = $("#accordion").accordion({
                collapsible: true,
                active: false,
                autoHeight: false,
                change: function (event, ui) {
                    var index = $acc.accordion("option", "active");
                    if (index >= 0) {
                        var clickedId = ui.newHeader.find("a").find(".title").text();
                        getRequirements(clickedId);
                    }
                    else {
                        // all panels are closed
                    }
                }
            });
        },
        error: function (xhr, err) {
            alert("readyState: " + xhr.readyState + "\nstatus: " + xhr.status);
            alert("responseText: " + xhr.responseText);
            alert("Error in ajax: " + result);
        }
    });
}

注意: result.Html返回格式化HTML的通用列表,一个用于手风琴的每个面板。除了长时间运行的脚本错误消息之外,每个人都非常乐意。

澄清返回值:result.Html包含大约200-250个这些字符串的实例:

"<h3><a href=\"#\"><span class=\"title\">" + obj.Id +
"</span><span class=\"status\" style=\"font-size:75%\"> - " + obj.Status + count +
"</span></a></h3><div id=\"" + obj.Id + "\"><div class=\"loading\"><img src=\"" +
Url.Content("~/Content/Images/ajaxLoader.gif") + "\" alt=\"loading...\" /></div></div>")

2 个答案:

答案 0 :(得分:1)

        for (var index = 0; index < result.Html.length; index++) {
            $('#accordion').append(result.Html[index]);
        }

一次一个地将大量节点添加到DOM中的速度很慢,一种可以加快速度的方法就是将它们全部插入到一个未连接的节点中,然后当你将它们全部移动时完成了:

        var holder = $('<div></div>');
        for (var index = 0; index < result.Html.length; index++) {
            holder.append(result.Html[index]);
        }
        $('#accordion').append(holder.children());

答案 1 :(得分:0)

更改服务器以返回数据而不是大量HTML。使用客户端模板解决方案。 然后,一旦有了数组,就可以异步更新显示(就像你提到的setTimeout一样)

在这个大的HTML字符串中只有两个动态的东西,非常浪费。

还是少退货?