为什么这个jquery each()循环不能在唯一的类上运行

时间:2015-09-29 23:34:43

标签: javascript jquery hide show

我正在尝试使用jquery函数处理具有唯一标识符的类。 但似乎没有将var添加到元素中...我该怎么做

我的代码就是这个......

    var x = 1;
    $('.newest_posts').each(function() {

      $('.showFull' + x).on('click', function(e) {
        $('.newest_small' + x).hide(); // hide image preview on delete click
        $('.newest_full' + x).show(); // hide image delete link on click
        e.preventDefault();
      });

      x = x + 1;
    });

对jquery不是很精通,但是我被绊倒是因为我有这个代码可以先隐藏它们

    var i = 1;
    $('.newest_posts').each(function() {

      $('.newest_full' + i).hide();

      i = i + 1;
    });

3 个答案:

答案 0 :(得分:2)

你必须问一个问题:当调用点击处理程序时,<LinearLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:weightSum="1" tools:context="com.favtest2.MainActivity"> <Button android:id="@+id/addBtn" android:text="Add New Item" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="addItems" android:layout_gravity="right" /> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="false" /> 等于 ?它在注册处理程序时不等于x值,但在循环完成后等于x的值。

假设没有其他任何修改它,它将等于x

以下是问题的快速解决方法:

$(.newestPosts).length() + 2

它在处理函数的范围内创建一个新变量。

更好的解决方法是省去外部var x = 1; $('.newest_posts').each(function() { var xCopy = x; $('.showFull' + xCopy).on('click', function(e) { $('.newest_small' + xCopy).hide(); // hide image preview on delete click $('.newest_full' + xCopy).show(); // hide image delete link on click e.preventDefault(); }); x = x + 1; }); 并使用x处理程序的第一个参数,它将成为索引。

each

答案 1 :(得分:0)

您必须首先了解javascript是异步的,并且该代码不会以您期望以同步编程语言运行的方式运行。

每个循环在页面加载时运行,递增x变量,而您作为参数传递给“&”按钮的函数。 event仅在页面上单击实际元素时运行。此时,x的值将与您拥有的帖子数相同。

你可以这样做:

var x = 1;
$('.newest_posts').each(function() {

  $('.showFull' + x).on('click', function(e) {
    var thisElementsIndex = $(this).attr("class").split(' ').filter(function(el){
       return el.indexOf('showFull') != -1
    })[0].replace('showFull', '');
    $('.newest_small' + thisElementsIndex ).hide(); // hide image preview on delete click
    $('.newest_full' + thisElementsIndex ).show(); // hide image delete link on click
    e.preventDefault();
  });

  x = x + 1;
});

这里发生的是,每个&#39;使用x变量进行迭代可确保所有类在单击它们时触发该回调。在回调中,您从类名中检索x的值并将其传递给隐藏/显示选择器。

答案 2 :(得分:0)

您还可以使用data()方法存储其索引,以便在元素的onclick函数中使用它:

var x = 1;
$('.newest_posts').each(function() {

  $('.showFull' + x).data('index', x);
  $('.showFull' + x).on('click', function(e) {
    var index = $(this).data('index');
    $('.newest_small' + index).hide(); // hide image preview on delete click
    $('.newest_full' + index).show(); // hide image delete link on click
    e.preventDefault();
  });

  x = x + 1;
});

这具有将每个迭代索引映射到其对应元素的优点,允许其他函数从中受益;你也不必关心x的值,它的范围不在函数范围内。