js 实现支持crtl与shift键的行多选

var lastObj = {};  //选中的当前行对象
var tableObj = {};  //表对象

 

//按键多选
function onTrClick(o) {
                tableObj = document.getElementById("Table1");
                var len = tableObj.rows.length;
                for (var i = 1; i < len; i++) {
                    tableObj.rows[i].rowNum = i;
                }
       if (event.ctrlKey) {//如果按下了ctrl键
           if (o.style.backgroundColor == "#ffffff") {
               o.style.backgroundColor = '#e3e9f4';
               lastObj = o;
           }else if (o.style.backgroundColor == "#e3e9f4") {
               o.style.backgroundColor = '#ffffff';
           }
       }else if (event.shiftKey) {//如果按下了shift键
           var beginNum, lastNum;
           if (lastObj.rowNum <= o.rowNum) {
               beginNum = lastObj.rowNum;
               lastNum = o.rowNum;
           }else {
               beginNum = o.rowNum;
               lastNum = lastObj.rowNum;
           }
           for (var i = 0; i < len; i++) {
               if (i >= beginNum && i <= lastNum) {
                   tableObj.rows[i].style.backgroundColor = "#e3e9f4";
               }else{
                   tableObj.rows[i].style.backgroundColor = "#ffffff";
                   }
           }
           lastObj = o;
       }else {
           for (var i = 1; i < len; i++) {
               tableObj.rows[i].style.backgroundColor = "#ffffff";
           }
           o.style.backgroundColor = '#e3e9f4';
           lastObj = o;
       }
   }

的数据可自定义,支持数据搜索功能。 以下是一个示例代码: ``` <!DOCTYPE html> <html> <head> <title>Drag and Drop Transfer</title> <style type="text/css"> .transfer-container { display: flex; flex-direction: row; align-items: center; justify-content: center; margin-top: 50px; } .transfer-list { list-style: none; margin: 0; padding: 0; width: 200px; height: 300px; border: 1px solid #ccc; overflow-y: auto; } .transfer-list li { padding: 5px; cursor: pointer; } .transfer-list li.selected { background-color: #ccc; } .transfer-list li:hover { background-color: #f5f5f5; } .transfer-buttons { display: flex; flex-direction: column; align-items: center; margin: 0 20px; } .transfer-buttons button { margin: 10px 0; padding: 10px 20px; border: none; background-color: #fff; cursor: pointer; } .transfer-buttons button:hover { background-color: #f5f5f5; } .transfer-buttons button:active { background-color: #ddd; } </style> </head> <body> <div class="transfer-container"> <ul class="transfer-list" id="left-list"> <li data-value="1">Item 1</li> <li data-value="2">Item 2</li> <li data-value="3">Item 3</li> <li data-value="4">Item 4</li> <li data-value="5">Item 5</li> <li data-value="6">Item 6</li> <li data-value="7">Item 7</li> <li data-value="8">Item 8</li> <li data-value="9">Item 9</li> <li data-value="10">Item 10</li> </ul> <div class="transfer-buttons"> <button id="select-all">Select All</button> <button id="transfer-right">Transfer Right</button> <button id="transfer-left">Transfer Left</button> </div> <ul class="transfer-list" id="right-list"> </ul> </div> <script type="text/javascript"> // Get the left and right lists var leftList = document.getElementById('left-list'); var rightList = document.getElementById('right-list'); // Add event listeners to the left list items leftList.addEventListener('mousedown', function(e) { // Check if the ctrl or shift key is pressed var isCtrlPressed = e.ctrlKey || e.metaKey; var isShiftPressed = e.shiftKey; // Get the clicked item var clickedItem = e.target.closest('li'); // Check if the clicked item is already selected var isSelected = clickedItem.classList.contains('selected'); // Deselect all items if the ctrl or meta key is not pressed if (!isCtrlPressed) { deselectAllItems(leftList); } // Select the clicked item if the shift key is pressed if (isShiftPressed) { selectItemsBetweenIndexes(leftList, clickedItem); } else { // Select or deselect the clicked item if (isSelected) { deselectItem(clickedItem); } else { selectItem(clickedItem); } } }); // Add event listeners to the select all button var selectAllButton = document.getElementById('select-all'); selectAllButton.addEventListener('click', function() { selectAllItems(leftList); }); // Add event listeners to the transfer buttons var transferRightButton = document.getElementById('transfer-right'); var transferLeftButton = document.getElementById('transfer-left'); transferRightButton.addEventListener('click', function() { transferItems(leftList, rightList); }); transferLeftButton.addEventListener('click', function() { transferItems(rightList, leftList); }); // Add search functionality var searchInput = document.createElement('input'); searchInput.type = 'text'; searchInput.placeholder = 'Search...'; searchInput.addEventListener('input', function() { searchItems(leftList, this.value); }); leftList.parentNode.insertBefore(searchInput, leftList); // Function to select an item function selectItem(item) { item.classList.add('selected'); } // Function to deselect an item function deselectItem(item) { item.classList.remove('selected'); } // Function to deselect all items function deselectAllItems(list) { var selectedItems = list.querySelectorAll('.selected'); for (var i = 0; i < selectedItems.length; i++) { selectedItems[i].classList.remove('selected'); } } // Function to select all items function selectAllItems(list) { var items = list.querySelectorAll('li'); for (var i = 0; i < items.length; i++) { items[i].classList.add('selected'); } } // Function to select items between indexes function selectItemsBetweenIndexes(list, item) { // Get the clicked item index var clickedIndex = Array.prototype.indexOf.call(list.children, item); // Get the last selected item index var lastIndex = list.lastSelectedIndex || 0; // Select all items between the clicked item and last selected item var minIndex = Math.min(lastIndex, clickedIndex); var maxIndex = Math.max(lastIndex, clickedIndex); for (var i = minIndex; i <= maxIndex; i++) { selectItem(list.children[i]); } // Store the last selected item index list.lastSelectedIndex = clickedIndex; } // Function to transfer items from one list to another function transferItems(sourceList, targetList) { var selectedItems = sourceList.querySelectorAll('.selected'); for (var i = 0; i < selectedItems.length; i++) { var item = selectedItems[i]; targetList.appendChild(item); deselectItem(item); } } // Function to search items in a list function searchItems(list, searchText) { searchText = searchText.toLowerCase(); var items = list.querySelectorAll('li'); for (var i = 0; i < items.length; i++) { var itemText = items[i].textContent.toLowerCase(); if (itemText.indexOf(searchText) === -1) { items[i].style.display = 'none'; } else { items[i].style.display = 'block'; } } } </script> </body> </html> ``` 该示例中,我们创建了一个包含两个列表的容器,一个左侧列表和一个右侧列表。左侧列表包含一些随机数据,并且支持ctrlshift多选。右侧列表为空,我们可以通过点击“Transfer Right”按钮将左侧列表中被选中的项移动到右侧列表中,或者点击“Transfer Left”按钮将右侧列表中被选中的项移动回左侧列表中。 此外,我们还添加了一个“Select All”按钮,它可以选择左侧列表中的所有项,以及一个搜索框,可以根据搜索文本过滤左侧列表中的项。 最后,我们使用JavaScript代码添加了事件监听器和一些帮助函数,以使穿梭框的功能正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值