jquery的附加和前置问题

时间:2011-07-06 00:02:41

标签: javascript jquery dom append prepend

我使用以下代码检查某个div是否存在。如果没有,它会在正确的位置将它添加到dom中。

if (!($("#col"+lastSlide).length))
{
    $('#schDisplay').prepend('<div id="col' + (lastSlide) + '"></div>');
}

我的问题是,当这个if语句再次检查已经附加/预先添加的div时,它不会看到我添加的div。因此它将继续添加已经预先附加/附加的div。

有没有办法解决这个问题?

更多代码:

//fillin added column
function fillElement(colnum)
{
    var URL = 'schedule.php';
    $("#col"+colnum).text("Loading...").show();
    $.post(URL,{fecolnum: colnum}, 
    function (data)
    {
        $("#col"+colnum).html(data).show();
    });
}
//...irrelevant code...

    // Create event listeners for .arrows clicks
      $('.arrows')
        .bind('click', function(){
            numberOfSlides++;
            // Determine new position
            if ($(this).attr('id')=='arrow_right')
            {
                lastSlide++;
                currentPosition++;
                if (!($("#col"+lastSlide).length))
                {
                    $('#schDisplay').append('<div id="col' + lastSlide + '" class="schColumn" style="float: left; width: ' +slideWidth+ 'px"></div>');
                    fillElement(lastSlide);
                }
            }
            else
            {
                lastSlide--;
                currentPosition--;
                if (!($("#col"+lastSlide-2).length))
                {
                    $('#schDisplay').prepend('<div id="col' + (lastSlide-2) + '" class="schColumn" style="float: left; width: ' +slideWidth+ 'px"></div>');
                    fillElement(lastSlide-2);
                }
            }

5 个答案:

答案 0 :(得分:1)

如果我正确地理解了您的问题,那么如果您再次执行相同的操作,则表示它会不断添加div。但是,我无法重现这一点。以下代码显示了一个div。据你说,它会显示两个div。

lastSlide = 1;
if (!($("#col"+lastSlide).length))
{
    $('#schDisplay').prepend('<div id="col' + (lastSlide) + '"></div>');
}
if (!($("#col"+lastSlide).length))
{
    $('#schDisplay').prepend('<div id="col' + (lastSlide) + '"></div>');
}

如果我没有错过任何东西,你的问题必须在别处。

答案 1 :(得分:1)

我没有太多的背景信息,但请查看我根据你给我的信息jsfiddle

请注意我发表评论的行,您可以对 out 增量声明发表评论。基本上,这就是你可以测试当“lastSlide”是相同值时会发生什么的方法。 (相比之下,如果“lastSlide”确实是一个不同的值)。

您可能只是尝试调试实际代码并确保lastSlide具有您实际期望的值。

答案 2 :(得分:0)

这将有效:

if (!($("#col"+lastSlide).length)) {
  var newdiv = $('<div id="col'+lastSlide+'"/>');
  $('#schDisplay').prepend(newdiv);
}

答案 3 :(得分:0)

它一直在添加,因为你的if条件总是正确的。

我没有测试过这个......

你能尝试这样的事情来看看它是否有帮助?

var len = 0;
len = $("#col"+lastSlide).length;
if (len < 1)
{
    $('#schDisplay').prepend('<div id="col' + (lastSlide) + '"></div>');
}

答案 4 :(得分:0)

如果已经预先添加了div,则可以使用jQuery过滤器删除所选的div。这适用于您的特定情况:

$('#schDisplay').filter(':not(:has(div[id^=col]))')

这表示“选择id为'schDisplay'的div,然后将其从选择中删除,如果它有任何后代div,其中id以'col'开头”。

在您的示例中,您将prepend语句链接到此代码,如此(不需要if语句):

$('#schDisplay').filter(':not(:has(div[id^=col]))').prepend('<div id="col' + (lastSlide) + '"></div>');

特别说明:我相信:has选择器是一个jQuery内容过滤器选择器,这意味着没有jQuery它将无法工作。您显然正在使用jQuery,但具有不同实现的读者应牢记这一点。