【问题标题】:Jquery index in array problem数组问题中的Jquery索引
【发布时间】:2011-03-31 11:39:21
【问题描述】:

我有这个代码。如果您单击下一个按钮然后单击上一个然后单击下一个,那么上一个索引输出就会混淆。

例如。当页面加载时,索引为 0。然后当我单击下一个时,索引为 1。然后我单击上一个,它又回到 0。到目前为止一切都很好,但是当我再次单击下一个时,它变成 2,这把一切都搞砸了。

认为这可能是由于...

if (index < 0) {
        index = lengthMinusOne;
};

这几天一直在努力。请帮忙。非常感谢。

//Image Gallery
var imgs = [
    ['images/test1.jpg', 'Test1', 'sdfsdfsdfsdf', 'light'],
    ['images/test2.jpg', 'Test2', 'sdfsdfsdf', 'light'],
    ['images/Test3.jpg', 'Test3', 'sdfsdfsdfsd.', 'dark']
];

var cnt = imgs.length;
var lengthMinusOne = cnt - 1,
    index = 0,
    fadeSpeed = 1000;

preload_image_object = new Image();
var i = 0;
for (i = 0; i <= cnt; i++)
preload_image_object.src = imgs[i];
$("#txt h1").text(imgs[0][1]);
$("#txt #desc p").text(imgs[0][2]);
var ld = imgs[0][3];
if (ld == "dark") {
    $("body").addClass("dark");
};
var firstImg = $('<img />');
$(firstImg).attr('src', imgs[0][0]);
$('#supersized').append(firstImg);
$(firstImg).hide().fadeIn(fadeSpeed);
$("#prev-photo").bind('click', prev);

function prev() {
    index--;
    $('#prev-photo,#next-photo').unbind();
    if (index < 0) {
        index = lengthMinusOne;
    };
    var ld = imgs[index][3];
    if (ld == "dark") {
        $("body").addClass("dark");
    } else {
        $("body").removeClass("dark");
    };
    oldImg = $('#supersized img').addClass('old');
    $("#txt h1").text(imgs[index][1]).hide().fadeIn();
    $("#txt #desc p").text(imgs[index][2]).hide().fadeIn();
    var img = new Image();
    $(img).load(function () {}).error(function () {}).attr('src', imgs[index][0]);
    $('#supersized').append(img);
    $('#supersized img').css('left', '0');
    $(img).hide().fadeIn(fadeSpeed, function () {
        oldImg.remove();
        $('#prev-photo').bind('click', prev);
        $('#next-photo').bind('click', prev);
    });
    console.log(index);
};
$("#next-photo").bind('click', next);

function next() {
    index++;
    $('#next-photo,#prev-photo').unbind();
    if (index > lengthMinusOne) {
        index = 0
    };
    var ld = imgs[index][3];
    if (ld == "dark") {
        $("body").addClass("dark");
    } else {
        $("body").removeClass("dark");
    };
    oldImg = $('#supersized img').addClass('old');
    $("#txt h1").text(imgs[index][1]).hide().fadeIn();
    $("#txt #desc p").text(imgs[index][2]).hide().fadeIn();
    var img = new Image();
    $(img).load(function () {}).error(function () {}).attr('src', imgs[index][0]);
    $('#supersized').append(img);
    $('#supersized img').css('left', '0');
    $(img).hide().fadeIn(1300, function () {
        oldImg.remove();
        $('#next-photo').bind('click', next);
        $('#prev-photo').bind('click', prev);
    });
    console.log(index);
};

【问题讨论】:

  • 没有仔细看代码,只是阅读您的描述。您是否考虑过将当前图像从堆栈中推送和弹出。这将消除必须跟踪索引。只是一个想法,祝​​你好运。
  • 这是一个圆形的showreel,所以我需要跟踪索引,以便循环回第一张/最后一张图像。

标签: jquery arrays indexing


【解决方案1】:

prev 中重新应用它们时,您将两个处理程序绑定到prev 函数。

$(img).hide().fadeIn(fadeSpeed, function () {
    oldImg.remove();
    $('#prev-photo').bind('click', prev);
    $('#next-photo').bind('click', prev);
});

应该是:

$(img).hide().fadeIn(fadeSpeed, function () {
    oldImg.remove();
    $('#prev-photo').bind('click', prev);
    $('#next-photo').bind('click', next);
});

我会将此代码(以及任何其他重复代码)抽象为它自己的函数,并从prevnext 调用它。

【讨论】:

  • 完美。这么快。不能感谢你。你能解释一下“抽象这段代码”并给我一个入门吗?
  • @Model -- 看看你的函数。除了您正在调用的函数的参数值之外,它们中的大部分都是相同的。您可以创建一个包含重复代码的函数,使用函数参数作为不同参数的替换。使用适当的实际值从 prev 和 next 调用此函数。编程的一个基本原则是“干——不要重复自己”——如果你发现自己在编写相同的代码,你应该找到一种方法来分享你已经编写的代码。
  • @Model - 您也可以考虑只隐藏/显示 prev/next 按钮,而不是取消绑定/重新绑定处理程序。如果一个按钮不做任何事情,我不希望它出现在界面中。如果这不起作用,那么我会应用某种 CSS 来表明它已“禁用”。
  • 我是个新手。我假设您正在谈论 prev() 和 next() 函数。很高兴看到我上面的代码使用 DRY 方法进行了优化。如果你能花一两秒钟让我开始,那就太好了。我知道一个大问题。
  • 再次感谢。绑定只是为了阻止人们在加载图像时点击按钮。
猜你喜欢
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2011-07-04
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
相关资源
最近更新 更多