jquery 的追加和前置问题

发布于 2024-11-18 18:20:49 字数 1635 浏览 3 评论 0原文

我使用以下代码来检查某个 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);
                }
            }

I use the following code to check whether or not a certain div exists. And if it doesn't it adds it to the dom in the proper place.

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

My problem is that when this if statement checks again for a div that had already once been appended/prepended, it doesn't see the div that I added. So it will continue to add the div that was already prepended/appended.

Is there any way this issue can be fixed?

more code:

//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);
                }
            }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

深爱成瘾 2024-11-25 18:20:49

我没有太多背景信息,但请查看我根据您给我的内容制作的 jsfiddle

请注意我做了注释的行,您可以注释掉增量语句。基本上,这就是测试当“lastSlide”为相同值时会发生什么情况的方法。 (相对于“lastSlide”确实是一个不同的值)。

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

I don't have much context to go off of, but checkout this jsfiddle I made from what you gave me.

Notice the line where I've made a comment that you can comment out the increment statement. Basically, this is how you can test what happens when "lastSlide" is the same value. (versus if "lastSlide" is indeed a different value).

You might just try debugging your actual code and make sure that lastSlide has the value you actually expect.

依 靠 2024-11-25 18:20:49

如果我正确理解你的问题,你的意思是,如果你再次做同样的事情,它会不断添加 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>');
}

如果我没有遗漏什么,那么你的问题一定出在其他地方。

If I understand your question correctly, you're saying that it keeps adding the div if you do the same thing again. However, I can't reproduce this. The following code shows one div. According to you, it would show two divs.

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

If I didn't miss something, your problem must lie elsewhere.

为你鎻心 2024-11-25 18:20:49

这将起作用:

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

This will work:

if (!($("#col"+lastSlide).length)) {
  var newdiv = $('<div id="col'+lastSlide+'"/>');
  $('#schDisplay').prepend(newdiv);
}
谎言 2024-11-25 18:20:49

它不断增加,因为你的 if 条件始终为真。

不过我还没有测试过......

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

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

It keeps adding because your if condition is always true.

I haven't tested this though...

Can you try something like this to see if it helps?

var len = 0;
len = $("#col"+lastSlide).length;
if (len < 1)
{
    $('#schDisplay').prepend('<div id="col' + (lastSlide) + '"></div>');
}
神妖 2024-11-25 18:20:49

您可以使用 jQuery 过滤器删除选定的 div(如果它已添加到前面)。这应该适用于您的特定场景:

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

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

在您的示例中,您可以像这样将前置语句链接到此代码(不需要 if 语句):

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

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

You can use jQuery filters to remove the selected div if it has already been prepended to. This should work for your particular scenario:

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

This says "select the div with id 'schDisplay' and then remove it from the selection if it has any descendent divs with ids start with 'col'".

In your example, you would chain on your prepend statement to this code like so (no need for an if statement):

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

A special note: I believe that the :has selector is a jQuery content filter selector, meaning that it will not work without jQuery. You are clearly using jQuery, but readers with different implementations should keep this in mind.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文