通过<a>链接

Override jQuery cycle via <a> link

本文关键字:链接 gt 通过 lt      更新时间:2023-09-26

是否可以通过链接访问jQuery循环来覆盖i变量?

我见过这样做的例子,但在类似这样的情况下,cycle()函数位于变量内部:

$(document).ready(function() {
    $('div[id^="content-"]').hide();
});
$(window).load(function() {
    var divs = $('div[id^="content-"]').hide(),
        i = 0;
    (function cycle() {
        divs.eq(i).fadeIn(400)
                  .delay(5000)
                  .fadeOut(400, cycle);
        if (typeof window["Stage" + i] != 'undefined')
        {
            window["Stage" + i].destroy();
        }
        i = ++i % divs.length; // increment i, 
                               // and reset to 0 when it equals divs.length
        if (i == 1)
        {
            window["Stage" + i] = new swiffy.Stage(document.getElementById('graph_lines'), swiffyobject);
        }
        else if (i === 0)
        {
            window["Stage" + i] = new swiffy.Stage(document.getElementById('circle_lines'), circleobject);
        }
        window["Stage" + i].start();
    })();
});

演示链接

如果您询问周期是否可以全局访问,那么简单的答案是

cycle函数是私有函数闭包的一部分。你必须让它全球化,才能以这种方式运作。但强烈建议我们不要污染全球范围,因此您应该将此功能应用于该关闭中的链接:

$(function(){
    var divs = $('div[id^="content-"]').hide();
    var cycle = function() {
        // do the thing although you're using globals etc.
    }
    $("a").click(cycle);
});

无论如何,这就是实现这一点的方法,但您必须清理代码,删除全局变量,除非它们是真正需要的。学习jQuery及其工作原理,不要重复做同样的事情。当你学到一点的时候,你就会知道我在说什么。

注意:我不确定您所说的通过a链接覆盖是什么意思。在我的例子中,我已经附加了点击事件,但这可能不是您想要的。你必须更加具体。

点击链接后迅速运行

我建议你让自己的生活变得轻松,并添加以下链接:

<a href="#" class="start-swiffy" data-swiffy="0">Start swiffy 0</a>

取而代之的是这个代码:

$(function() {
    var divs = $('div[id^="content-"]').hide();
    divs.each(function(index) {
        $(this).fadeIn(400)
               .delay(5000)
               .fadeOut(400);
        // replaces first if statement
        window["Stage" + index] && window["Stage" + index].destroy();
        if (index === 0)
        {
            window["Stage1"] = new swiffy.Stage(document.getElementById('graph_lines'), swiffyobject);
        }
        if (index === divs.length - 1)
        {
            window["Stage0"] = new swiffy.Stage(document.getElementById('circle_lines'), circleobject);
        }
        window["Stage" + ((index + 1) % divs.length)].start();
    });
    $("a.start-swiffy").click(function(evt) {
        evt.preventDefault();
        window["Stage" + $(this).data("swiffy")].start();
    });
});

尽管我仍然不明白为什么你要做所有这些div渐变和删除阶段,并按偏移顺序逐个运行,这样它们就从第二个开始,第一个从最后一个开始?我想这是可以改进的主要部分。。。