我有多个 Select 下拉菜单,每个子菜单都有一个相应的输入字段.我try 做的是一个JS函数,它允许通过向上/向下点击图标来重新排序行.

我试图做的也是简单地为第一行只有一个向下图标,为最后一行只有一个向上图标,并为他们之间的所有其他东西都有向上和向下.发生的事情是,我有向上和向下为第一和第二行和向上为最后一行.

以下是我目前为止所拥有的代码

$(document).ready(function () {

  function moveUp(index) {
    if (index === 0) return;
    var $currentItem = $('[name="status[' + index + ']"]').closest('.line');
    var $prevItem = $('[name="status[' + (index - 1) + ']"]').closest('.line');
    $currentItem.insertBefore($prevItem);
    updateIconsVisibility();
  }

  function moveDown(index) {
    var $currentItem = $('[name="status[' + index + ']"]').closest('.line');
    var $nextItem = $('[name="status[' + (index + 1) + ']"]').closest('.line');
    $nextItem.insertAfter($currentItem);
    updateIconsVisibility();
  }

  function updateIconsVisibility() {
    $('.line').each(function (index, element) {
      var $line = $(element);
      var $arrows = $line.find('.arrows');
      var $upIcon = $arrows.find('.fa-chevron-circle-up');
      var $downIcon = $arrows.find('.fa-chevron-circle-down');

      if (index === 0) {
        $upIcon.hide();
        $downIcon.show();
      } else if (index === $('.line').length - 1) {
        $upIcon.show();
        $downIcon.hide();
      } else {
        $upIcon.show();
        $downIcon.show();
      }
    });
  }

  $(document).on('click', '.move-up-button', function() {
    var index = $(this).data('index');
    moveUp(index);
  });

  $(document).on('click', '.move-down-button', function() {
    var index = $(this).data('index');
    moveDown(index);
  });

  updateIconsVisibility();
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet"/>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<div class="mb-3"   id="dropdown-container-edit">
                            <div class="line" style="margin-top: 15px;display: flex;min-width: 329px;">
                                <div style="float:left;display: flex; flex-direction: column;width: 10%;">
                                    <label for="select-group" class="form-label">Select Status</label>
                                </div>
                            </div>
         
                            <div class="line" style="margin-top: 15px;display: flex;min-width: 329px;">
                                <div style="float:left;display: flex; flex-direction: column;width: 10%;">
                                    <select class="select-group" name="status[0]">
                                        <option value="" data-id="">Select Status</option>
                                        <option value="0" data-id="" selected>Status_1</option>
                                        <option value="1" data-id="" >Status_2</option>
                                        <option value="2" data-id="" >Status_3</option>   
                                    </select>
                                </div>
                                <div style="float:left; display: flex; flex-direction: column; width: 90%;">
                                    <input type="text" class="input-field status-input" name="status-input[0]" style="margin-left: 5px;" value="status_1">
                                </div>
                             
                                <div class="arrows" style="display: inherit;margin-left: 10px;margin-top: 3px; ">
                                    <i class="fa fa-chevron-circle-up fa-2x move-up-button" data-index="0" style="margin-right: 5px;"></i>
                                    <i class="fa fa-chevron-circle-down fa-2x move-down-button" data-index="0"></i>
                                </div>
                            </div>
                            
                            <div class="line" style="margin-top: 15px;display: flex;min-width: 329px;">
                                <div style="float:left;display: flex; flex-direction: column;width: 10%;">
                                    <select class="select-group" name="status[1]">
                                        <option value="" data-id="">Select Status</option>
                                        <option value="0" data-id="" >Status_1</option>
                                        <option value="1" data-id="" selected>Status_2</option>
                                        <option value="2" data-id="" >Status_3</option>   
                                    </select>
                                </div>
                                <div style="float:left; display: flex; flex-direction: column; width: 90%;">
                                    <input type="text" class="input-field status-input" name="status-input[1]" style="margin-left: 5px;" value="status_2">
                                </div>
                             
                                <div class="arrows" style="display: inherit;margin-left: 10px;margin-top: 3px; ">
                                    <i class="fa fa-chevron-circle-up fa-2x move-up-button" data-index="1" style="margin-right: 5px;"></i>
                                    <i class="fa fa-chevron-circle-down fa-2x move-down-button" data-index="1"></i>
                                </div>
                            </div>
                            
                            <div class="line" style="margin-top: 15px;display: flex;min-width: 329px;">
                                <div style="float:left;display: flex; flex-direction: column;width: 10%;">
                                    <select class="select-group" name="status[2]">
                                        <option value="" data-id="">Select Status</option>
                                        <option value="0" data-id="" >Status_1</option>
                                        <option value="1" data-id="" >Status_2</option>
                                        <option value="2" data-id="" selected>Status_3</option>   
                                    </select>
                                </div>
                                <div style="float:left; display: flex; flex-direction: column; width: 90%;">
                                    <input type="text" class="input-field status-input" name="status-input[2]" style="margin-left: 5px;" value="status_3">
                                </div>
                             
                                <div class="arrows" style="display: inherit;margin-left: 10px;margin-top: 3px; ">
                                    <i class="fa fa-chevron-circle-up fa-2x move-up-button" data-index="2" style="margin-right: 5px;"></i>
                                    <i class="fa fa-chevron-circle-down fa-2x move-down-button" data-index="2"></i>
                                </div>
                            </div>
                            
                            
                        </div>

如果需要这里也是JSFiddle:https://jsfiddle.net/tm51dkra/2/

推荐答案

我只改变了几件事:

在你的moveDown函数中,你有这个代码:$nextItem.insertAfter($currentItem);,但它应该是$currentItem.insertAfter($nextItem);

我还从第一个div中删除了class line.

<div class="" style="margin-top: 15px;display: flex;min-width: 329px;">
    <div style="float:left;display: flex; flex-direction: column;width: 10%;">
        <label for="select-group" class="form-label">Select Status</label>
    </div>
</div>

因为你使用.line作为 Select 器,就像在:

function updateIconsVisibility() {
    $('.line').each(function (index, element) {

我已经添加了一个updateIndexes函数来更新索引,所以它们的排序将工作.

Demo

$(document).ready(function() {

  function moveUp(index) {
    index = parseInt(index);
    if (index === 0) return;
    var $currentItem = $('[name="status[' + index + ']"]').closest('.line');
    var $prevItem = $('[name="status[' + (index - 1) + ']"]').closest('.line');
    $currentItem.insertBefore($prevItem);
    updateIndexes();
    updateIconsVisibility();
  }

  function moveDown(index) {
    index = parseInt(index);
    var $currentItem = $('[name="status[' + index + ']"]').closest('.line');
    var $nextItem = $('[name="status[' + (index + 1) + ']"]').closest('.line');
    if ($nextItem.length === 0) return;
    $currentItem.insertAfter($nextItem);
    updateIndexes();
    updateIconsVisibility();
  }
  
  function updateIndexes() {
    $('.line').each(function(i) {
      $(this).find('select[name^="status"]').attr('name', 'status[' + i + ']');
      $(this).find('input[name^="status-input"]').attr('name', 'status-input[' + i + ']');
      $(this).find('.move-up-button, .move-down-button').attr('data-index', i);
    });
  }

  function updateIconsVisibility() {
    $('.line').each(function(index) {
      var $upIcon = $(this).find('.fa-chevron-circle-up');
      var $downIcon = $(this).find('.fa-chevron-circle-down');

      if (index === 0) {
        $upIcon.hide();
      } else {
        $upIcon.show();
      }
      if (index === $('.line').length - 1) {
        $downIcon.hide();
      } else {
        $downIcon.show();
      }
    });
  }

  $(document).on('click', '.move-up-button', function() {
    var index = $(this).attr('data-index');
    moveUp(index);
  });

  $(document).on('click', '.move-down-button', function() {
    var index = $(this).attr('data-index');
    moveDown(index);
  });
  updateIndexes();
  updateIconsVisibility();
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<div class="mb-3" id="dropdown-container-edit">
  <div class="" style="margin-top: 15px;display: flex;min-width: 329px;">
    <div style="float:left;display: flex; flex-direction: column;width: 10%;">
      <label for="select-group" class="form-label">Select Status</label>
    </div>
  </div>

  <div class="line" style="margin-top: 15px;display: flex;min-width: 329px;">
    <div style="float:left;display: flex; flex-direction: column;width: 10%;">
      <select class="select-group" name="status[0]">
        <option value="" data-id="">Select Status</option>
        <option value="0" data-id="" selected>Status_1</option>
        <option value="1" data-id="">Status_2</option>
        <option value="2" data-id="">Status_3</option>
      </select>
    </div>
    <div style="float:left; display: flex; flex-direction: column; width: 90%;">
      <input type="text" class="input-field status-input" name="status-input[0]" style="margin-left: 5px;" value="status_1">
    </div>

    <div class="arrows" style="display: inherit;margin-left: 10px;margin-top: 3px; ">
      <i class="fa fa-chevron-circle-up fa-2x move-up-button" data-index="0" style="margin-right: 5px;"></i>
      <i class="fa fa-chevron-circle-down fa-2x move-down-button" data-index="0"></i>
    </div>
  </div>

  <div class="line" style="margin-top: 15px;display: flex;min-width: 329px;">
    <div style="float:left;display: flex; flex-direction: column;width: 10%;">
      <select class="select-group" name="status[1]">
        <option value="" data-id="">Select Status</option>
        <option value="0" data-id="">Status_1</option>
        <option value="1" data-id="" selected>Status_2</option>
        <option value="2" data-id="">Status_3</option>
      </select>
    </div>
    <div style="float:left; display: flex; flex-direction: column; width: 90%;">
      <input type="text" class="input-field status-input" name="status-input[1]" style="margin-left: 5px;" value="status_2">
    </div>

    <div class="arrows" style="display: inherit;margin-left: 10px;margin-top: 3px; ">
      <i class="fa fa-chevron-circle-up fa-2x move-up-button" data-index="1" style="margin-right: 5px;"></i>
      <i class="fa fa-chevron-circle-down fa-2x move-down-button" data-index="1"></i>
    </div>
  </div>

  <div class="line" style="margin-top: 15px;display: flex;min-width: 329px;">
    <div style="float:left;display: flex; flex-direction: column;width: 10%;">
      <select class="select-group" name="status[2]">
        <option value="" data-id="">Select Status</option>
        <option value="0" data-id="">Status_1</option>
        <option value="1" data-id="">Status_2</option>
        <option value="2" data-id="" selected>Status_3</option>
      </select>
    </div>
    <div style="float:left; display: flex; flex-direction: column; width: 90%;">
      <input type="text" class="input-field status-input" name="status-input[2]" style="margin-left: 5px;" value="status_3">
    </div>

    <div class="arrows" style="display: inherit;margin-left: 10px;margin-top: 3px; ">
      <i class="fa fa-chevron-circle-up fa-2x move-up-button" data-index="2" style="margin-right: 5px;"></i>
      <i class="fa fa-chevron-circle-down fa-2x move-down-button" data-index="2"></i>
    </div>
  </div>


</div>

Javascript相关问答推荐

除了在Angular 16中使用快照之外,什么是可行且更灵活的替代方案?

如何通过onClick为一组按钮分配功能;

当promise 在拒绝处理程序被锁定之前被拒绝时,为什么我们会得到未捕获的错误?

如何分配类型脚本中具有不同/额外参数的函数类型

没有输出到带有chrome.Devtools扩展的控制台

格式值未保存在redux持久切片中

这个值总是返回未定义的-Reaction

对路由DOM嵌套路由作出react

Eval vs函数()返回语义

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

无法重定向到Next.js中的动态URL

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

Node.js错误: node 不可单击或不是元素

重新呈现-react -筛选数据过多

与在编剧中具有动态价值的定位器交互

在JavaScript中将Base64转换为JSON

P5.js中矩形内的圆弧

在Press Reaction本机和EXPO av上播放单个文件

需要从对象生成列表

如何将值从后端传递到前端