【问题标题】:jQuery toggle keeps repeatingjQuery切换不断重复
【发布时间】:2012-04-06 21:02:56
【问题描述】:

我对 jQuery 还很陌生,但似乎很容易。一样的,我想不通。 我正在尝试在两个动画功能之间切换,但是当功能二完成时,它会继续并调用功能一。

function toggleThis(){
    $("#navSliderArrow").toggle(function() {       
        $(this).animate({ marginLeft: '235' }, 500);
        $("#sliderArrow").attr("src", "images/hide_nav.gif");
    }, function() {       
        $(this).animate({ marginLeft: '0' }, 500);
        $("#sliderArrow").attr("src", "images/show_nav.gif");
    });
}

我做错了什么? ~gyz

【问题讨论】:

  • 据我所知,.toggle只有一个回调函数。不知道当你有 2 个这样的功能时会发生什么。无论如何,你想在这里实现什么?
  • 将此函数绑定到单击事件将实际上单击按钮两次,一次用于单击,一次用于切换。这就是为什么您会看到它向两个方向滑动。
  • 请包含您的相关 HTML,以便我们了解更多有关此功能的实际作用。

标签: jquery jquery-animate toggle


【解决方案1】:

根据我之前的评论,

据我所知,.toggle 只有一个回调函数。不确定 当你有两个这样的功能时会发生什么......无论如何,什么是 你想达到这里吗?

阅读更多.toggle API doc

我假设您正在尝试显示和隐藏 onclick#sliderArrow。如果是这样,请在下面尝试,

   $(function () {
       var $slideArrow = $("#sliderArrow");
       var $navSlideArrow = $('#navSliderArrow');
       $slideArrow.on ('click', function () {              
          if ($slideArrow.attr('src').indexOf('show') >= 0) {
                $navSlideArrow.animate({ marginLeft: '235' }, 500);
                $slideArrow.attr("src", "images/hide_nav.gif");
          } else {
                $navSlideArrow.animate({ marginLeft: '0' }, 500);
                $slideArrow.attr("src", "images/show_nav.gif");
          }
       });
   });

【讨论】:

  • 不,这似乎有同样的问题,只是它不是只重复一次,而是每次点击都会重复一次(第一次点击没有,第二次点击一次,第三次点击两次,等等)。也许暂时忽略图像交换 - 我要做的就是使用相同的可点击 div 将其位置在第一次点击时向左移动,然后在第二次点击时向右移动。
  • 有趣的是,如果你抛出一个不存在的函数,我的原始代码可以正常工作,比如 $(this).harumph();打破功能。太糟糕了,它引发了一个错误。
【解决方案2】:

还有一个事件处理程序版本的 .toggle() - http://api.jquery.com/toggle-event/

toggle事件处理程序绑定了click方法本身,所以你只需要直接执行动画:

$("#navSliderArrow").toggle(
    function() {       
        $(this).animate({ marginLeft: '235' }, 500);
        $("#sliderArrow").attr("src", "images/hide_nav.gif");
    }, 
    function() {       
        $(this).animate({ marginLeft: '0' }, 500);
        $("#sliderArrow").attr("src", "images/show_nav.gif");
    }
);

【讨论】:

  • 所以这与我最初发布的内容基本相同,除了 togglethis() 函数之外?当我把它放在原始功能之外时,我似乎没有得到任何功能。
  • 你把原函数绑定到点击事件了吗?你能发布更多代码吗?
  • 哎呀——现在才看到你的小提琴。其他地方一定有问题。让我检查一下...
  • 我使用 作为我的点击事件。这叫它,但它仍然存在我之前提到的重复问题。
  • @gyzhor,那么这完全解释了你做错了什么以及你在原始 OP 中遗漏了什么。绑定事件时,您确实不需要内联 JavaScript。换句话说,如果你用 jQuery 将点击事件绑定到一个对象,你也在<a>中使用onclick=
【解决方案3】:

引用 OP:

“我做错了什么?”

根据the jQuery documentation,您的语法错误。 toggle() 内不能有两个回调函数。

.toggle([持续时间] [, 缓动] [, 回调])

  • duration - 确定动画运行时间的字符串或数字。
  • easing - 一个字符串,指示用于过渡的缓动函数。
  • 回调 - 动画完成后调用的函数。

编辑:

看了其他答案,发现有another version of jQuery toggle()...

http://api.jquery.com/toggle-event/

.toggle( handler(eventObject), handler(eventObject) [,handler(eventObject)] )

  • handler(eventObject) - 每次点击元素时都会执行的函数。
  • handler(eventObject) - 每次点击元素时执行的函数。
  • handler(eventObject) - 点击后要循环执行的其他处理程序。

正确实现,您的 jQuery 应该看起来像 类似 这个...

$(document).ready(function() {
    $("#navSliderArrow").toggle(
        function() {       
            $(this).animate({ marginLeft: '235' }, 500);
            $("#sliderArrow").attr("src", "images/hide_nav.gif");
        },
        function() {       
            $(this).animate({ marginLeft: '0' }, 500);
            $("#sliderArrow").attr("src", "images/show_nav.gif");
        }
    );
});

使用 jQuery,绝对 不需要像 <a href="#" onclick="togglethis()"> 这样的任何内联 JavaScript。您的 HTML 应该看起来 类似于...

<a href="#" id="navSliderArrow">

我只说“类似”,因为您的 HTML 不包含在您的 OP 中,而且我不知道您的目标元素应该是什么。

jsFiddle DEMO

【讨论】:

  • 奇怪,我从另一个网站上得到了这个语法,它建议你如何在两个函数之间切换。不过,我想做的是让一个 div 在第一次点击时向右移动 235px,然后在下一次点击时回到 0px,令人作呕。看起来很像初学者的东西,但是,那是我。
  • 哎呀,我想我应该在最后的帖子中添加@Sparky672。
  • @gyzhor,在回复用户自己的答案或问题时,您不需要@user。另请参阅我编辑的答案并在您的原始问题中包含更多 HTML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2017-08-04
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多