2

我有以下脚本,它的行为方式与我期望的不同:

success: function( widget_shell ) 
{ 
    if( widget_shell.d[0] ) {
        for ( i = 0; i <= widget_shell.d.length - 1; i++ ) {
           $( ".column_" + widget_shell.d[i].column_id ).append( "<div class='widget_" + widget_shell.d[i].widget_id + "'>" );
           $( ".widget_" + widget_shell.d[i].widget_id ).append( "<div class='widget_content_" + widget_shell.d[i].widget_id + "'>" );
           $( ".widget_" + widget_shell.d[i].widget_id ).append( "</div>" );
           $( ".column_" + widget_shell.d[i].column_id ).append( "</div>" );
        }
    }

这会产生这样的 HTML:

<div id="divMain">
    <div class="column_1 ui-sortable">
        <div class="widget_9">
            <div class="widget_content_9"></div>
            <div class="widget_content_9"></div>
        </div>
    </div>
    <div class="column_2 ui-sortable">
        <div class="widget_9">
            <div class="widget_content_9"></div>
        </div>
    </div>
    <div class="column_3 ui-sortable">
        <div class="widget_58">
            <div class="widget_content_58"></div>
        </div>
    </div>
</div>

当 JSON 数据如下所示时:

{
    "d": [
        {
            "__type": "Widget_Shell",
            "column_id": 1,
            "widget_id": 9
        },
        {
            "__type": "Widget_Shell",
            "column_id": 2,
            "widget_id": 9
        },
        {
            "__type": "Widget_Shell",
            "column_id": 3,
            "widget_id": 58
        }
    ]
}

所以基本上,基于 JSON 数据,我应该每列只看到 1 个小部件,这很好,但由于某种原因,我最终在第一列小部件中有 2 个内容......

知道为什么吗?

4

1 回答 1

5

jQuery 函数在使用 选择元素时搜索整个文档$("...")。在您的情况下,在第二次迭代中有两个.widget_9元素,每个元素都<div>附加一个。

您想要的只是附加到刚刚创建的元素,这可以通过以下方式完成.appendTo

var $widget = $("<div class='widget_" + widget_shell.d[i].widget_id + "'>")
                .appendTo(".column_" + widget_shell.d[i].column_id);

$("<div class='widget_content_" + widget_shell.d[i].widget_id + "'>")
  .appendTo($widget);

$widget每次迭代都会被一个新元素覆盖,因此您不会弄乱上一次迭代的元素。

请注意,jQuery 知道如何使用 来创建元素$("<div>"),因此不需要结束标记。您还应该声明i为 in var i

于 2012-11-06T13:29:32.010 回答