Jquery - If/else 迭代语句只工作一次/在删除 div 并再次添加它之后它不起作用

Jquery - If/else statement with iteration works only once/ after the div is removed and prepended again it does not work

https://jsfiddle.net/9harsfb6/

在我提供的 jsFiddle 文件中,当您将鼠标悬停在菜单项上时,会出现红色下划线……然后当您将鼠标悬停并再次尝试将鼠标悬停在上面时,红线不会出现……我想要 1.每次我将鼠标悬停在给定项目下方时都会出现红线 2. 悬停后能够从一个元素平滑地动画到下一个元素,这也可以在我提供的 jsfiddle 演示中看到...但问题是整个事情只在第一次悬停时有效。

CSS:

        <ul id="menu">
                    <li class="slider1"><a id="omnie" href="">o mnie</a></li>
                    <li class="slider2"><a id="oferta" href="">oferta</a></li>
                    <li class="slider3"><a id="etyczny" href="">kod etyczny</a></li>
                    <li class="slider4"><a id="referencje" href="">referencje</a></li>
                    <li class="slider5"><a id="kontakt" href="">kontakt</a></li>
                </ul>

JQuery:

$(document).ready(function() {

    $('ul').on('mouseenter', function() {
            $('body').prepend( '<div id="object1"></div>' );
        });

    $('ul#menu').mouseleave(function () {
        $('div#object1').fadeOut(300, function() { $(this).remove(); }) ;
        });
 });




$(document).ready(function(e) { 
            var i=1;
                $('ul#menu li.slider1').on({ 

                            mouseenter: function(e) {   

                            if(i<2) {
                            $('div#object1').css('position', 'absolute');                       
                            $('div#object1').css('width', '100px');
                            $('div#object1').css('height', '5px');                                  
                            $('div#object1').css('right', 620); //or wherever you want it
                            $('div#object1').css('top', 75);
                            $('div#object1').fadeIn(1000);                              
                            i++;}  else {

                                    $('div#object1').css('position', 'absolute');
                                    $('div#object1').css('width', '100px');
                                    $('div#object1').css('height', '5px');                              

                                    $('div#object1').stop().animate( {right:620, top:75, opacity:1}, 700);

                    }
                }       
    });

                $('ul#menu li.slider2').on({ 

                            mouseenter: function(e) {   

                            if(i<2) {
                            $('div#object1').css('position', 'absolute');                               
                            $('div#object1').css('width', '100px');
                            $('div#object1').css('height', '5px');                                  
                            $('div#object1').css('right', 480); //or wherever you want it
                            $('div#object1').css('top', 75);
                            $('div#object1').fadeIn(1000);                              
                            i++;}  else {

                                    $('div#object1').css('position', 'absolute');
                                    $('div#object1').css('width', '100px');
                                    $('div#object1').css('height', '5px');                              

                                    $('div#object1').stop().animate( {right:490, top:75, opacity:1}, 700);


                    }
                }       
    });     
}); 

你的 i 变量永远不会被重置,所以你在 if (i <2) 块中对 div 所做的初始化在 div 被删除后永远不会重新运行并且重新添加。

要解决此问题,对当前代码的最小更改是将两个文档就绪处理程序组合起来(无论如何您都应该这样做),以便您的所有函数都可以访问相同的 i 变量,然后在您的 ul 元素的 mouseleave 处理程序中将 i 重置为 1。演示:https://jsfiddle.net/9harsfb6/3/(另请注意,单击 "Tidy" 按钮后代码更容易阅读?)

不过您的代码可以简化很多:您似乎在 div 上的多个位置将相同的属性设置为相同的值。您可以将所有这些移出 JS 并移入 CSS。您可以在页面 html 中包含 div 来开始,而不是附加和删除它。您可以通过让 ul 元素的 mouseout 事件处理程序触发 .slider1 元素的 mouseenter 来隐藏它。像这样:https://jsfiddle.net/9harsfb6/5/

// JS that works with the div in the page html and all the
// positioning and size nonsense in the CSS:
$(document).ready(function() {
  $('ul#menu').mouseleave(function() {
    $('ul#menu li.slider1').trigger('mouseenter');
  });

  $('ul#menu li.slider1').on({
    mouseenter: function(e) {
      $('div#object1').stop().animate({
        right: 620,
        opacity: 1
      }, 700);
    }
  });

  $('ul#menu li.slider2').on({
    mouseenter: function(e) {
      $('div#object1').show().stop().animate({
        right: 490,
        opacity: 1
      }, 700);
    }
  });
});

使用这样的计数器来确定您的函数需要做什么通常不是一个好主意。 一个简单的解决方案是用布尔值替换您的计数器,并在您的函数中检查并相应地设置它的值,然后合并您的两个 document.ready 函数,如下所示:

$(document).ready(function () {

    var hidden = true;

    $('ul').on('mouseenter', function () {
        $('body').prepend('<div id="object1"></div>');
    });

    $('ul#menu').mouseleave(function () {
        $('div#object1').fadeOut(300, function () {
            $(this).remove();
            hidden = true;
        });
    });

    $('ul#menu li.slider1').on({

        mouseenter: function (e) {

            if (hidden) {
                ...

                hidden = false;
            } else {

            }
        }
    });

此外,您无需在每次悬停时都删除 prepend/append 您的 div。