1
function redundantSee() {

  var optionSet1 = $('.wrapper:eq(0)'),
      optionSet2 = $('.wrapper:eq(1)');

  optionSet1.find('.options').each(function(){
      var self = $(this),
          input = self.find('input'),
          title = self.find('.title').text(),
          value = input.val(),
          source = self.find('img').attr('src'),
          id = input.attr('id'),
          listItem = $('<li/>', {'value': value, 'id': id }),
          imageElement = $('<img/>', {'src': source, 'title': title});

      $('div.corresponding1').append(nameListItem);
      listItem.append(imageElement);
  });

  optionSet2.find('.options').each(function(){
      var self = $(this),
          input = self.find('input'),
          title = self.find('.title').text(),
          value = input.val(),
          source = self.find('img').attr('src'),
          id = input.attr('id'),
          listItem = $('<li/>', {'value': value, 'id': id }),
          imageElement = $('<img/>', {'src': source, 'title': title});

      $('div.corresponding2').append(listItem);
      listItem.append(imageElement);
  });
}

我已经简化了这个发布,因为这个函数将有超过 4 个选项集循环通过。

我在弄清楚如何将所有重复的代码变成更易于管理的东西时遇到了问题。

但是由于每个选项集都有自己的每个循环,因此 $(this) 变量(以及所有相应的变量)特定于在 ('.options') 元素上运行的循环。

如果我每个循环都做一个并使用一个计数器,如下所示:

$('wrapper').each(function(i){ // ... });

我仍然遇到需要重新声明特定于该 optionSet 循环中的所有新变量的问题。

有人可以帮我弄清楚如何压缩它,这样我就不会在每次向函数添加新选项集时不断重复相同的代码?

编辑:每个 $('div.corresponding') 元素完全不同,因此它们不能用计数器递增。(例如,一个可能是 $('div.foo') 或 $('div.foo ul.bar')

4

2 回答 2

2

例如,您可以扩展 jQuery,使其更具可重用性:

// extend jquery
(function($){

    $.fn.redundantSee = function (subSelector) {

        return this.find('.options').each(function () {
            var self = $(this),
            input = self.find('input'),
            title = self.find('.title').text(),
            value = input.val(),
            source = self.find('img').attr('src'),
            id = input.attr('id'),
            listItem = $('<li/>', { 'value': value, 'id': id }),
            imageElement = $('<img/>', { 'src': source, 'title': title });

            $(subSelector).append(listItem);
            listItem.append(imageElement);
        });

    };

}(jQuery));

// and use it like this
$('.wrapper:eq(0)').redundantSee('div.corresponding1');
$('.wrapper:eq(1)').redundantSee('div.corresponding2');
于 2012-11-07T03:07:58.697 回答
0

我将为包装器执行一个循环,并为每个包装器中的选项执行一个循环,并且我将为相应的 DIV 使用增量变量。

function redundantSee() {
    var i = 0;
    $('.wrapper').each(function(){
        i++;
        $(this).find('.options').each(function(){
            var self = $(this),
                input = self.find('input'),
                title = self.find('.title').text(),
                value = input.val(),
                source = self.find('img').attr('src'),
                id = input.attr('id'),
                listItem = $('<li/>', {'value': value, 'id': id }),
                imageElement = $('<img/>', {'src': source, 'title': title});

            $('div.corresponding' + i).append(nameListItem);
            listItem.append(imageElement);
        });
    });
}
于 2012-11-07T03:13:01.723 回答