【问题标题】:jQuery .clone() HTML forms that contain radio buttons - keep the radio events specific to the cloned elementsjQuery .clone() 包含单选按钮的 HTML 表单 - 保留特定于克隆元素的单选事件
【发布时间】:2016-04-25 09:23:55
【问题描述】:

我正在使用 Bootstrap、jQuery、HTML 和 Django 后端处理一些前端表单。在表单中的某一时刻,用户应该添加“软件”信息,然后可以选择上传软件文件或使用其托管文件的 URL。 URL 选项允许从多个 URL 位置下载文件。还有一个添加多个软件包的选项,因此如果他们想添加另一个,有一个“添加”按钮可以克隆表单组并允许用户输入另一个软件包的信息。

我不确定如何使克隆数据获得它自己的键值以在后端使用的动态,但现在我最大的问题是当您单击Add More Software... 按钮时,单选按钮被克隆只会影响原始单选按钮,并且不会将 .switchClass() 事件绑定到它们以更改它们的外观。我一生都无法弄清楚如何让单选按钮绑定到它们被克隆的 HTML。我附上了一个jsfiddle来查看:

jQuery clone() and Radio Buttons

我的问题是,我将如何使其更具动态性,以便按钮与与单选按钮一起克隆的 HTML 一起使用,以及如何将克隆的表单组设置为动态以获取背面的值 -结束了吗?

<div class="software-container">
<div class="form-group">
    <label class="col-sm-2 control-label">
      * Files
    </label>
    <div class="col-sm-9">
      <div class="btn-group" data-toggle="buttons">
        <label id="software-upload-btn" for="software-upload" class="btn btn-default">
          <input id="software-upload" type="radio" name="software-upload" value="upload"> Upload
        </label>
        <label id="software-url-btn" for="software-upload" class="btn btn-default">
          <input id="software-url" type="radio" name="software-url" value="url"> URL
        </label>
      </div>
    </div>
  </div>
  <div id="software-upload-panel" class="hidden">
    <div class="form-group upload-container">
      <div class="col-sm-offset-2 col-sm-9">
        <input type="file" id='software-file' name="software-file" title="" placeholder="No File">
      </div>
    </div>
  </div>

  <div id="software-url-panel" class="hidden">
    <div class="form-group url-container">
      <div class="col-sm-offset-2 col-sm-9">
        <input type="url" id="software-file" name="software-file" class="form-control" placeholder="https://www.example.com/my-software-4.6.tar.gz" title="">
        <button class="close hidden" type="button">x</button>
      </div>
    </div>
    <div class="form-group add-url-container">
      <div class="col-sm-offset-2 col-sm-9">
        <button class="add-url btn btn-default" type="button">
          <i class="glyphicon glyphicon-plus"></i> Add Another URL...
        </button>
      </div>
    </div>
  </div>
</div>

<div class="form-group add-container">
  <label for="add-btn" class="col-sm-2 control-label">
    Add Software:
  </label>

  <div class="col-sm-9">
    <button id="add-software-btn" class="btn btn-default" type="button">
      <i class="glyphicon glyphicon-plus"></i> Add More Software...
    </button>
  </div>
</div>

还有我的 js:

$(document).ready(function() {
  // Actions for URL/Upload button options
  $('#software-upload-btn').click(function() {
    if ($('.active')) {
      $('#software-upload-btn').switchClass('btn-default', 'btn-info', 0);
      $('#software-upload-panel').removeClass('hidden');
      $('#software-url-btn').switchClass('btn-info', 'btn-default', 0);
      $('#software-url-panel').addClass('hidden');
    }
  });

  $('#software-url-btn').click(function() {
    if ($('.active')) {
      $('#software-url-btn').switchClass('btn-default', 'btn-info', 0);
      $('#software-url-panel').removeClass('hidden');
      $('#software-upload-btn').switchClass('btn-info', 'btn-default', 0);
      $('#software-upload-panel').addClass('hidden');
    }
  });

  // Add button actions
  $(document).on('click', '.add-url:last', function() {
        $('.url-container:first').clone().insertAfter($('.url-container:last'))
            .find('.close').removeClass('hidden');

        $('.close').click(function() {
            $(this).closest('div.url-container').remove();
        });
    });

  $(document).on('click', '#add-software-btn:last', function() {
    $('.software-container:first').clone(true)
      .insertAfter($('.software-container:last'));
  });
});

【问题讨论】:

  • 因为id 应该是唯一的。所以选择器不起作用。
  • 好的@RejithRKrishnan,这绝对有道理。不知道为什么我还没有看到。我会先检查一下,然后告诉你。希望事情就这么简单。
  • 好的@RejithRKrishnan,现在不是上传和url单选按钮只更改pre/original单选按钮,当我让它们类时它会改变它们。所以我假设这是“动态”部分的用武之地。但我不确定如何使用 jQuery 的 clone() 以及使这些按钮仅适用于它们的克隆面板/容器的最佳方法
  • 你能添加最新的小提琴吗?

标签: javascript jquery html twitter-bootstrap clone


【解决方案1】:

更新

好的,我做了一些更改以向您展示this 的力量:

  • 为 2 个按钮添加了特殊类:.uplBtn.urlBtn
  • .software-container 类添加到#software-container-1
  • var con = $(this).closest('.software-container'); 这就是每个 software-container 的隔离方式。
    • $(this) 是刚刚被点击的那个特定按钮
    • .closest('.software-container') 将从$(this) 开始,一直到.software-container
  • var pkg = $('#' + con.attr('id')); 这很丑,但它有效。这将连接一串.software-container id 并使其成为一个jQuery 对象。

现在,当您单击一个按钮时,它只会打开它原本要打开的面板。顺便说一句,如果您注意到克隆会有一个副作用,新的克隆将根据之前克隆的状态以隐藏或隐藏状态开始。也许您应该创建一个看不见且未触及的模板#software-container-0。或者也许只重置新克隆上的隐藏类一次。

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <title>34884672</title>
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
  <link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet" />
  <style>
  </style>
</head>

<body>
  <div id="software-container-1" class="software-container">
    <div class="form-group">
      <label class="col-sm-2 control-label">
        * Files
      </label>
      <div class="col-sm-9">
        <div class="btn-group" data-toggle="buttons">
          <label for="software-upload-btn" class="btn uplBtn btn-default">
            <input class="software-upload-btn" type="radio" name="software-upload" value="upload">Upload
          </label>
          <label for="software-url-btn" class="btn urlBtn btn-default">
            <input class="software-url-btn" type="radio" name="software-url" value="url">URL
          </label>
        </div>
      </div>
    </div>
    <div class="software-upload-panel hidden">
      <div class="form-group upload-container">
        <div class="col-sm-offset-2 col-sm-9">
          <input type="file" class='software-upload-file form-control' name="software-upload-file" title="" placeholder="No File">
        </div>
      </div>
    </div>

    <div class="software-url-panel hidden">
      <div class="form-group url-container">
        <div class="col-sm-offset-2 col-sm-9">
          <input type="url" class="software-url-file form-control" name="software-url-file" placeholder="https://www.example.com/my-software-4.6.tar.gz" title="">
          <button class="close hidden" type="button">x</button>
        </div>
      </div>
      <div class="form-group add-url-container">
        <div class="col-sm-offset-2 col-sm-9">
          <button class="add-url btn btn-default" type="button">
            <i class="glyphicon glyphicon-plus"></i> Add Another URL...
          </button>
        </div>
      </div>
    </div>
  </div>

  <div class="form-group add-container">
    <label class="col-sm-2 control-label">
      Add Software:
    </label>

    <div class="col-sm-9">
      <button class="add-software-btn btn btn-default" type="button">
        <i class="glyphicon glyphicon-plus"></i> Add More Software...
      </button>
    </div>
  </div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script>
    $(document).ready(function() {
      // Actions for URL/Upload button options
      $('label.uplBtn').click(function(event) {
        var con = $(this).closest('.software-container');
        var pkg = $('#' + con.attr('id'));
        console.log('pkg: ' + pkg);
        $(this).switchClass('btn-default', 'btn-info', 0).addClass('active');
        pkg.find('.software-upload-panel').removeClass('hidden');
        pkg.find('label.urlBtn').switchClass('btn-info', 'btn-default', 0).removeClass('active');
        pkg.find('.software-url-panel').addClass('hidden');

        event.stopPropagation();
      });

      $('label.urlBtn').click(function(event) {
        var con = $(this).closest('.software-container');
        var pkg = $('#' + con.attr('id'));
        console.log('pkg: ' + pkg);
        $(this).switchClass('btn-default', 'btn-info', 0).addClass('active');
        pkg.find('div.software-url-panel').removeClass('hidden');
        pkg.find('label.uplBtn').switchClass('btn-info', 'btn-default', 0).removeClass('active');
        pkg.find('div.software-upload-panel').addClass('hidden');

        event.stopPropagation();
      });

      // Add button actions
      $(document).on('click', '.add-url:last', function() {
        $('div[id^="url-container"]:first').clone().insertAfter($('div[id^="url-container"]:last'))
          .find('.close').removeClass('hidden');

        $('.close').click(function() {
          $(this).closest('div[id^="url-container"]').remove();
        });
      });

      $(document).on('click', '.add-software-btn:last', function() {
        var $div = $('div[id^="software-container"]:last');
        var num = parseInt($div.prop("id").match(/\d+/g), 10) + 1;
        var $software_container = $div.clone(true, true).prop('id', 'software-container-' + num);
        $div.after($software_container);

      });
    });
  </script>
</body>

</html>

我想你想克隆#software-container 并给它们一个唯一的ID,这样你就可以从后端挂钩它们。摆脱最近的小提琴,这就是我得到的:https://jsfiddle.net/zer00ne/oay1zbva/

我不确定您是否想要.clone(true),但我记得您想要保留活动...?

jQuery 变化

  $(document).on('click', '.add-software-btn:last', function() {
    var $div = $('div[id^="software-container"]:last');
    num = parseInt($div.prop("id").match(/\d+/g), 10);
    num++;
    //var $software_container = $div.clone().prop('id', 'software-container-'+num);
    //$div.after($software_container);
    $('.software-container:last').clone(true).insertAfter($('.software-container:last')).prop('id', 'software-container-' + num);;
  });
});

【讨论】:

  • 是的,只要您使用var num 计数器,看起来就可以(这是全球仅供参考,所以请注意)。只要大声思考,您就可以使用 $(this) 并创建其他 ids 类。
  • @CharlWillia6 无论如何,如果您需要更多建议,请告诉我,不要忘记投票和/或接受 ;-)
  • 好的,那么他们的 id 可能是最好的选择。
  • 但是如果你使用$(this)来指代它的孩子,它应该被隔离。 var rad1 = $(this).find(".software-upload-btn"); 应该可以工作。或var rad1 = $(event.target).find(".software-upload-btn") 请记住这一点作为可能的替代方案。
  • @CharlWillia6 查看更新。我停止使用 jsFiddle,因为它得到了一个陈旧的缓存。新功能演示位于 sn-p 中。
猜你喜欢
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多