0

我有以下 JavaScript 和 jQuery,它们运行良好:

function updateTaskTypes(taskTypes) {

    $.each(taskTypes, function (idx, e) {

        var contains = $("#async_TaskTypes").find("a:contains('" + e + "')").length > 0;

        if (!contains) {

            var html = "<li><a href=\"#tab" + idx + "\">" + e + "</a></li>";

            $("#async_TaskTypes").append(html);
        }
    });
}

上面的代码接受一个字符串数组。目的是添加一个<li>to,#async_TaskTypes如果它还没有包含一个。

HTML 的格式为:

<ul id="async_TaskTypes" class="tabs">
    <li><a href="#tab0">Preview Blog Comment</a></li>
    <li><a href="#tab1">Respond To Contact Us</a></li>
</ul>

我的问题是 jQuery 似乎没有它应该有的效率。有没有办法让上面的代码更有效率?

通过“高效”,我的意思是我可以使用更直接的 jQuery 函数,或者更简洁的算法等......基本上更优雅的代码。

4

4 回答 4

2

在 DOM 中搜索总是低效的。您应该有一个模型,您可以在其中存储哪些任务已经在显示的列表中,以便您可以使用数组方法简单地搜索它(如果已排序,甚至可能在 中O(n))。这可以做到,例如:

function updateTaskTypes(taskTypes) {
    var $ul = $("#async_TaskTypes"),
        texts = $ul.find("a").map(function(){
            return $(this).text();
        }).get();
    $.each(taskTypes, function (idx, e) {
        if ($.inArray(texts, e) == -1)
            $ul.append("<li><a href=\"#tab" + idx + "\">" + e + "</a></li>");
    });
}

或者您只需删除所有列表项并重新附加整个任务列表,这更简单,并且对于短列表可能更快:

function updateTaskTypes(taskTypes) {
    var $ul = $("#async_TaskTypes").empty();
    $.each(taskTypes, function (idx, e) {
        $ul.append("<li><a href=\"#tab" + idx + "\">" + e + "</a></li>");
    });
}
于 2013-03-10T16:08:05.740 回答
0

或者您实际上可以只使用正则表达式:

var a = $("#async_TaskTypes").html();
if( /Whatever/g.test(a) ) {
  //this string is present in your html
}
于 2013-03-10T16:08:01.197 回答
0

更新Bergi的答案:

function updateTaskTypes(taskTypes) {
    var $ul = $("#async_TaskTypes").empty();
    $.each(taskTypes, function (idx, e) { 
        $ul.append(
            $("<li>").append(
                $("<href>", {id: "tab" + idx}).text(e)
            );
        );
    });
}

也许更优雅一点。

于 2013-03-10T16:20:59.170 回答
0

另一个想法:

var async_TaskTypes = $("#async_TaskTypes");
async_TaskTypes.append(
    $.map(taskTypes, function (idx, e) {
        if (!async_TaskTypes.has("a:contains('" + e + "')")) {
            return $("<li>").append(
                $("<href>", {id: "tab" + idx}).text(e)
            );
        }
    })
);
于 2013-03-10T16:39:47.443 回答