JavaScript實(shí)現(xiàn)自定義拖拽排序列表
功能描述
我們要實(shí)現(xiàn)的功能是:創(chuàng)建一個(gè)可拖拽的列表,用戶(hù)可以通過(guò)鼠標(biāo)拖拽列表項(xiàng)到任意位置,并實(shí)時(shí)顯示拖拽后的排序結(jié)果。
實(shí)現(xiàn)步驟
HTML結(jié)構(gòu)
首先,我們需要?jiǎng)?chuàng)建一個(gè)HTML結(jié)構(gòu)來(lái)表示列表。每個(gè)列表項(xiàng)用一個(gè)<li>標(biāo)簽表示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>拖拽排序列表</title> <style> /* 樣式將在后面添加 */ </style> </head> <body> <ul id="sortable-list"> <li draggable="true">Item 1</li> <li draggable="true">Item 2</li> <li draggable="true">Item 3</li> <!-- 更多列表項(xiàng)... --> </ul> <script> // JavaScript代碼將在后面添加 </script> </body> </html>
CSS樣式
為了增強(qiáng)用戶(hù)體驗(yàn),我們添加一些基本的CSS樣式。
<style> #sortable-list { list-style-type: none; padding: 0; } #sortable-list li { margin: 10px 0; padding: 10px; background-color: #f4f4f4; border: 1px solid #ddd; cursor: move; } </style>
JavaScript實(shí)現(xiàn)
下面是實(shí)現(xiàn)拖拽排序功能的核心JavaScript代碼
// 獲取列表元素 const list = document.getElementById('sortable-list'); // 為每個(gè)列表項(xiàng)添加事件監(jiān)聽(tīng)器 list.addEventListener('dragstart', handleDragStart); list.addEventListener('dragover', handleDragOver); list.addEventListener('drop', handleDrop); // 拖拽開(kāi)始時(shí)觸發(fā) function handleDragStart(e) { // 設(shè)置拖拽的數(shù)據(jù)類(lèi)型和值 e.dataTransfer.setData('text/plain', ''); // 保存拖拽元素的引用 list.dragSrcEl = this; // 為拖拽元素添加樣式 e.target.classList.add('dragging'); } // 當(dāng)拖拽元素在目標(biāo)元素上方時(shí)觸發(fā) function handleDragOver(e) { if (e.preventDefault) { e.preventDefault(); // 阻止默認(rèn)行為,允許放置 } return false; } // 當(dāng)拖拽元素被放置到目標(biāo)元素時(shí)觸發(fā) function handleDrop(e) { if (e.stopPropagation) { e.stopPropagation(); // 阻止事件冒泡 } // 獲取拖拽元素和目標(biāo)元素 const dragSrcEl = list.dragSrcEl; const dropHTML = e.target.innerHTML; // 如果目標(biāo)元素不是列表項(xiàng),則退出 if (dragSrcEl !== e.target && e.target.nodeName === 'LI') { // 交換拖拽元素和目標(biāo)元素的位置 e.target.innerHTML = dragSrcEl.innerHTML; dragSrcEl.innerHTML = dropHTML; // 移除拖拽元素的樣式 dragSrcEl.classList.remove('dragging'); } return false; }
代碼注釋和分析
在HTML中,我們?yōu)槊總€(gè)<li>元素添加了draggable="true"屬性,使其可拖拽。
在CSS中,我們?cè)O(shè)置了列表和列表項(xiàng)的樣式,同時(shí)為正在拖拽的元素添加了一個(gè)dragging類(lèi)(盡管在上面的代碼中并未定義該類(lèi)的樣式,你可以根據(jù)需要添加)。
在JavaScript中,我們使用了HTML5的拖放API。通過(guò)監(jiān)聽(tīng)dragstart、dragover和drop事件,我們能夠控制拖拽的過(guò)程和結(jié)果。
handleDragStart函數(shù)在拖拽開(kāi)始時(shí)被調(diào)用。它設(shè)置了拖拽的數(shù)據(jù)類(lèi)型和值,并保存了拖拽元素的引用。
handleDragOver函數(shù)在拖拽元素在目標(biāo)元素上方時(shí)被調(diào)用。它阻止了默認(rèn)行為,允許元素被放置。
handleDrop函數(shù)在拖拽元素被放置到目標(biāo)元素時(shí)被調(diào)用。它交換了拖拽元素和目標(biāo)元素的位置,并移除了拖拽元素的樣式。
在JavaScript中實(shí)現(xiàn)拖拽排序功能涉及對(duì)HTML5拖放API的使用,以及對(duì)鼠標(biāo)事件和DOM操作的精細(xì)控制。以下是實(shí)現(xiàn)拖拽排序的具體操作步驟:
1.初始化拖拽:
為每個(gè)需要拖拽的列表項(xiàng)(<li>元素)設(shè)置draggable="true"屬性,這允許它們被拖動(dòng)。
為列表(<ul>或<ol>元素)添加事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)dragstart、dragover和drop事件。這些事件分別在拖拽開(kāi)始、拖拽元素在目標(biāo)上方移動(dòng)以及拖拽元素被放置時(shí)觸發(fā)。
2.處理拖拽開(kāi)始(dragstart):
當(dāng)用戶(hù)開(kāi)始拖拽一個(gè)列表項(xiàng)時(shí),dragstart事件被觸發(fā)。
在事件處理程序中,可以使用event.target來(lái)獲取被拖拽的元素。
通常,在這個(gè)階段需要設(shè)置一些數(shù)據(jù)到dataTransfer對(duì)象上,以便在后續(xù)的drop事件中使用。但在拖拽排序的場(chǎng)景中,由于我們只需要知道哪個(gè)元素被拖動(dòng),因此可以設(shè)置一些標(biāo)識(shí)信息或者簡(jiǎn)單地不設(shè)置數(shù)據(jù),而是通過(guò)其他方式(如全局變量或元素屬性)來(lái)跟蹤拖拽的元素。
3.處理拖拽過(guò)程(dragover):
當(dāng)被拖拽的元素移動(dòng)到另一個(gè)列表項(xiàng)上方時(shí),會(huì)不斷觸發(fā)dragover事件。
默認(rèn)情況下,瀏覽器不允許放置(drop)操作,因此需要阻止這個(gè)事件的默認(rèn)行為。這可以通過(guò)調(diào)用event.preventDefault()方法來(lái)實(shí)現(xiàn)。
此外,在這個(gè)階段可以更新界面以提供視覺(jué)反饋,比如改變目標(biāo)列表項(xiàng)的背景色或樣式,以指示它可以接受放置。
4.處理拖拽放置(drop):
當(dāng)用戶(hù)釋放鼠標(biāo)按鈕,且被拖拽的元素位于一個(gè)有效的放置目標(biāo)上方時(shí),drop事件被觸發(fā)。
在drop事件處理程序中,首先需要獲取拖拽源元素(可以從之前設(shè)置的dataTransfer對(duì)象中獲取,或者通過(guò)其他跟蹤機(jī)制)。
接著,獲取放置目標(biāo)元素,這通常是觸發(fā)drop事件的元素。
然后,需要更新DOM來(lái)反映新的排序。這通常涉及改變?cè)氐奈恢?,可以通過(guò)直接操作DOM(比如交換元素的innerHTML)或使用更高級(jí)的DOM操作方法(如insertBefore或appendChild)來(lái)實(shí)現(xiàn)。
最后,可能需要提供一些額外的反饋,比如通過(guò)動(dòng)畫(huà)來(lái)平滑地展示元素位置的改變。
5.清理和重置:
在拖拽操作完成后,需要重置任何臨時(shí)狀態(tài)或樣式更改,以確保界面的一致性。
如果在拖拽過(guò)程中添加了額外的樣式或類(lèi)來(lái)提供視覺(jué)反饋,現(xiàn)在需要移除它們。
在實(shí)現(xiàn)這些操作時(shí),需要注意瀏覽器的兼容性問(wèn)題,因?yàn)椴煌臑g覽器可能在處理拖放事件時(shí)存在細(xì)微的差異。此外,為了提高用戶(hù)體驗(yàn),可以添加一些額外的功能,比如觸摸設(shè)備支持、拖拽手柄、占位符顯示等。
另外一種實(shí)現(xiàn)方式
HTML結(jié)構(gòu)
首先,我們創(chuàng)建一個(gè)包含可拖拽列表項(xiàng)的<ul>元素。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>自定義拖拽排序列表</title> <style> /* 樣式將在后面添加 */ </style> </head> <body> <ul id="sortable-list"> <li draggable="true">列表項(xiàng) 1</li> <li draggable="true">列表項(xiàng) 2</li> <li draggable="true">列表項(xiàng) 3</li> <li draggable="true">列表項(xiàng) 4</li> <li draggable="true">列表項(xiàng) 5</li> </ul> <script> // JavaScript代碼將在后面添加 </script> </body> </html>
CSS樣式
然后,我們添加一些CSS樣式來(lái)美化列表和拖拽時(shí)的視覺(jué)效果。
<style> #sortable-list { list-style-type: none; padding: 0; } #sortable-list li { margin: 0.5em 0; padding: 0.5em 1em; background-color: #f4f4f4; border: 1px solid #ddd; cursor: move; position: relative; /* 為了定位占位符 */ } /* 拖拽時(shí)的占位符樣式 */ #sortable-list li.placeholder { background-color: transparent; border: 1px dashed #666; margin: 0.5em 0; padding: 0; height: 2em; /* 根據(jù)需要調(diào)整占位符高度 */ display: none; /* 初始時(shí)隱藏占位符 */ } /* 拖拽時(shí)的列表項(xiàng)樣式 */ #sortable-list li.dragging { opacity: 0.5; } </style>
JavaScript實(shí)現(xiàn)
最后,我們編寫(xiě)JavaScript代碼來(lái)實(shí)現(xiàn)拖拽排序的功能
// 獲取列表元素 const list = document.getElementById('sortable-list'); // 初始化占位符 const placeholder = document.createElement('li'); placeholder.classList.add('placeholder'); // 為列表添加事件監(jiān)聽(tīng)器 list.addEventListener('dragstart', handleDragStart); list.addEventListener('dragover', handleDragOver); list.addEventListener('drop', handleDrop); // 拖拽開(kāi)始時(shí) function handleDragStart(e) { this.style.opacity = '0.4'; // 拖拽時(shí)的透明度 // 存儲(chǔ)拖拽元素的引用和數(shù)據(jù) dragSrcEl = this; e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('text/html', this.innerHTML); } // 拖拽在目標(biāo)上方時(shí) function handleDragOver(e) { if (e.preventDefault) { e.preventDefault(); // 阻止默認(rèn)行為以允許放置 } this.classList.add('over'); // 創(chuàng)建一個(gè)占位符并添加到目標(biāo)位置 const targetEl = e.target; const rect = targetEl.getBoundingClientRect(); const offset = rect.y + (rect.height / 2); const mouseY = e.clientY; if (mouseY < offset) { // 鼠標(biāo)在元素上半部分,將占位符插入到目標(biāo)元素之前 list.insertBefore(placeholder, targetEl); } else { // 鼠標(biāo)在元素下半部分,將占位符插入到目標(biāo)元素之后 let nextEl = targetEl.nextElementSibling; if (!nextEl) { // 如果沒(méi)有下一個(gè)元素,則將占位符添加到列表末尾 nextEl = placeholder; list.appendChild(nextEl); } else { list.insertBefore(placeholder, nextEl); } } // 顯示占位符 placeholder.style.display = 'block'; // 清理 const dragSrcEl = document.querySelector('.dragging'); const dragPlaceholder = document.querySelector('.placeholder'); if (dragSrcEl && dragPlaceholder && dragSrcEl !== targetEl) { dragPlaceholder.style.width = `${dragSrcEl.offsetWidth}px`; dragPlaceholder.style.height = `${dragSrcEl.offsetHeight}px`; } // 移除over類(lèi) this.classList.remove('over'); return false; } // 元素放置時(shí) function handleDrop(e) { if (e.stopPropagation) { e.stopPropagation(); // 阻止事件冒泡 } if (e.preventDefault) { e.preventDefault(); // 阻止默認(rèn)行為 } // 獲取拖拽源元素和目標(biāo)元素 const srcEl = document.querySelector('.dragging'); const targetEl = e.target; // 如果拖拽的不是列表項(xiàng)或放置在非列表項(xiàng)上,則退出 if (!(srcEl && targetEl && srcEl.tagName === 'LI' && targetEl.tagName === 'LI')) { return; } // 用源元素的HTML替換占位符 placeholder.innerHTML = e.dataTransfer.getData('text/html'); // 如果占位符不在目標(biāo)元素之前,將其移動(dòng)到目標(biāo)元素之后 if (placeholder !== targetEl.previousElementSibling) { list.insertBefore(srcEl, targetEl.nextElementSibling); } else { list.insertBefore(srcEl, targetEl); } // 清理 srcEl.style.opacity = '1'; srcEl.classList.remove('dragging'); placeholder.style.display = 'none'; return false; } // 為列表項(xiàng)添加可拖拽屬性并綁定事件 const listItems = list.querySelectorAll('li'); listItems.forEach(function(item) { item.draggable = true; item.addEventListener('dragstart', handleDragStart); item.addEventListener('dragover', handleDragOver); }); // 注意:由于事件監(jiān)聽(tīng)器是在每個(gè)列表項(xiàng)上單獨(dú)設(shè)置的,因此`this`在事件處理程序中將引用正確的元素。 // 如果使用事件代理,則需要通過(guò)`event.target`來(lái)獲取當(dāng)前操作的元素。
代碼解釋和分析
HTML: 創(chuàng)建了一個(gè)包含五個(gè)列表項(xiàng)的<ul>元素。
CSS: 定義了列表、列表項(xiàng)和拖拽時(shí)的樣式。包括一個(gè)占位符樣式,用于在拖拽時(shí)顯示將要放置的位置。
JavaScript:
handleDragStart: 當(dāng)拖拽開(kāi)始時(shí),存儲(chǔ)拖拽源元素的引用,并設(shè)置透明度以提供視覺(jué)反饋。
handleDragOver: 當(dāng)拖拽元素在目標(biāo)上方移動(dòng)時(shí),阻止默認(rèn)行為,并創(chuàng)建一個(gè)占位符來(lái)顯示將要放置的位置。根據(jù)鼠標(biāo)位置決定占位符應(yīng)該放在目標(biāo)元素之前還是之后。
handleDrop: 當(dāng)元素被放置時(shí),用源元素的HTML替換占位符,并重新排列DOM元素以反映新的順序。
注意:這個(gè)實(shí)現(xiàn)有幾個(gè)需要注意的地方:
占位符的顯示和隱藏是通過(guò)直接修改其display屬性來(lái)實(shí)現(xiàn)的。
拖拽源元素在dragstart事件中存儲(chǔ),并在drop事件中使用。
為了簡(jiǎn)化示例,這里沒(méi)有處理一些邊緣情況,比如拖拽到列表外部或同時(shí)拖拽多個(gè)元素。
代碼中使用了querySelector和querySelectorAll來(lái)選擇元素,這要求瀏覽器支持這些現(xiàn)代DOM方法。
當(dāng)然,我們可以為這個(gè)拖拽排序列表添加更多的自定義功能。
以下是一些建議的擴(kuò)展功能:
動(dòng)畫(huà)效果:為拖拽和放置操作添加平滑的動(dòng)畫(huà)效果。
觸摸支持:確保在觸摸設(shè)備上也能正常工作。
拖拽手柄:僅為列表項(xiàng)的一部分(如一個(gè)小圖標(biāo)或文本)添加拖拽功能,而不是整個(gè)列表項(xiàng)。
限制拖拽范圍:防止元素被拖拽到列表外部。
拖拽結(jié)束時(shí)的回調(diào):當(dāng)拖拽操作完成時(shí),觸發(fā)一個(gè)自定義的回調(diào)函數(shù)。
拖拽占位符定制:允許通過(guò)CSS類(lèi)或JavaScript自定義占位符的樣式。
禁用特定元素的拖拽:為某些列表項(xiàng)禁用拖拽功能。
實(shí)施這些自定義功能
以下是如何實(shí)施其中一些功能的代碼示例:
1. 動(dòng)畫(huà)效果
我們可以使用CSS過(guò)渡來(lái)為元素添加動(dòng)畫(huà)效果。例如,當(dāng)元素被放置時(shí),我們可以平滑地改變其位置。
#sortable-list li { transition: transform 0.3s ease; /* 添加過(guò)渡效果 */ }
然后在JavaScript中,而不是直接移動(dòng)元素,我們可以通過(guò)改變其transform屬性來(lái)移動(dòng)它。
2. 觸摸支持
為了支持觸摸設(shè)備,我們需要監(jiān)聽(tīng)觸摸事件而不是鼠標(biāo)事件。我們可以使用touchstart, touchmove, 和 touchend事件。
list.addEventListener('touchstart', handleDragStart); list.addEventListener('touchmove', handleDragOver); list.addEventListener('touchend', handleDrop);
請(qǐng)注意,觸摸事件的處理方式與鼠標(biāo)事件略有不同,特別是關(guān)于如何獲取觸摸點(diǎn)的位置。
3. 拖拽手柄
我們可以在每個(gè)列表項(xiàng)內(nèi)部添加一個(gè)小的手柄元素,并僅對(duì)該手柄設(shè)置draggable屬性。
<ul id="sortable-list"> <li><span class="handle">?</span> 列表項(xiàng) 1</li> <li><span class="handle">?</span> 列表項(xiàng) 2</li> <!-- ... --> </ul>
然后,我們只為手柄元素添加事件監(jiān)聽(tīng)器。
const handles = list.querySelectorAll('.handle'); handles.forEach(function(handle) { handle.draggable = true; handle.addEventListener('dragstart', handleDragStart); // ... 其他事件 });
在handleDragStart函數(shù)中,我們需要調(diào)整拖拽元素的引用,使其指向包含手柄的列表項(xiàng),而不是手柄本身。
4. 限制拖拽范圍
我們可以在handleDragOver函數(shù)中檢查拖拽元素是否在列表邊界內(nèi),并據(jù)此決定是否允許放置。
function handleDragOver(e) { // ... 其他代碼 // 檢查是否拖拽到列表外部 const rect = list.getBoundingClientRect(); if (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom) { // 如果在外部,則阻止放置 if (e.preventDefault) e.preventDefault(); return false; } // ... 其他代碼 }
5. 拖拽結(jié)束時(shí)的回調(diào)
我們可以定義一個(gè)回調(diào)函數(shù),并在handleDrop函數(shù)的末尾調(diào)用它。
function onDragEndCallback(srcEl, targetEl) { // 在這里執(zhí)行拖拽結(jié)束后的自定義操作 console.log('拖拽結(jié)束,源元素:', srcEl, '目標(biāo)元素:', targetEl); } function handleDrop(e) { // ... 其他代碼 // 調(diào)用回調(diào)函數(shù) onDragEndCallback(srcEl, targetEl); }
6. 拖拽占位符定制
我們已經(jīng)為占位符定義了一些基本的CSS樣式,但可以通過(guò)添加更多的類(lèi)或直接在JavaScript中修改樣式屬性來(lái)進(jìn)一步定制它。
占位符的定制可以通過(guò)CSS和JavaScript兩種方式來(lái)實(shí)現(xiàn)。以下是一些具體的方法:
通過(guò)CSS定制占位符
添加CSS類(lèi):在HTML中為占位符元素添加一個(gè)特定的類(lèi),然后為這個(gè)類(lèi)編寫(xiě)CSS樣式。
<!-- 假設(shè)你的占位符元素是這樣的 --> <li class="placeholder"></li>
/* 在CSS中為這個(gè)類(lèi)添加樣式 */ .placeholder { background-color: #f0f0f0; border: 1px dashed #ccc; /* 其他樣式屬性 */ }
使用偽元素:如果你的占位符是通過(guò)其他元素的狀態(tài)來(lái)表示的(例如,在拖拽時(shí)給一個(gè)元素添加.dragging-above或.dragging-below類(lèi)),你可以使用偽元素::before或::after來(lái)創(chuàng)建占位符的視覺(jué)效果。
.list-item.dragging-above::before, .list-item.dragging-below::after { content: ''; display: block; height: 20px; /* 占位符的高度 */ background-color: #f0f0f0; /* 其他樣式屬性 */ }
通過(guò)JavaScript定制占位符
動(dòng)態(tài)修改樣式屬性:在拖拽事件的處理函數(shù)中,你可以直接修改占位符元素的樣式屬性
function handleDragOver(e) { // ... 確定占位符的位置 // 修改占位符的樣式 placeholder.style.backgroundColor = '#f0f0f0'; placeholder.style.border = '1px dashed #ccc'; // 其他樣式屬性 }
2.切換CSS類(lèi):與直接修改樣式屬性類(lèi)似,你可以在JavaScript中通過(guò)切換CSS類(lèi)來(lái)改變占位符的樣式
function handleDragOver(e) { // ... 確定占位符的位置 // 切換占位符的CSS類(lèi) placeholder.classList.add('dragging'); // 或者 placeholder.classList.remove('default'); placeholder.classList.add('custom'); } function handleDrop(e) { // ... 拖拽結(jié)束后的處理 // 恢復(fù)占位符的默認(rèn)樣式 placeholder.classList.remove('dragging'); // 或者 placeholder.classList.remove('custom'); placeholder.classList.add('default'); }
7. 禁用特定元素的拖拽
我們可以為不想拖拽的列表項(xiàng)添加一個(gè)特定的類(lèi),并在設(shè)置事件監(jiān)聽(tīng)器時(shí)檢查這個(gè)類(lèi)。
<ul id="sortable-list"> <li draggable="true">列表項(xiàng) 1</li> <li draggable="true" class="no-drag">列表項(xiàng) 2</li> <!-- 禁用拖拽 --> <!-- ... --> </ul>
listItems.forEach(function(item) { if (!item.classList.contains('no-drag')) { item.draggable = true; item.addEventListener('dragstart', handleDragStart); // ... 其他事件 } });
總結(jié)
通過(guò)原生JavaScript和HTML5的拖放API,我們實(shí)現(xiàn)了一個(gè)自定義的拖拽排序列表。這個(gè)功能增強(qiáng)了用戶(hù)界面的交互性,提供了更好的用戶(hù)體驗(yàn)。在實(shí)際項(xiàng)目中,你還可以根據(jù)需要對(duì)這個(gè)功能進(jìn)行擴(kuò)展和優(yōu)化,比如添加動(dòng)畫(huà)效果、處理觸摸事件等。
到此這篇關(guān)于JavaScript實(shí)現(xiàn)自定義拖拽排序列表的文章就介紹到這了,更多相關(guān)JavaScript拖拽排序列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 利用JavaScript實(shí)現(xiàn)的10種排序算法總結(jié)
- 基數(shù)排序算法的原理與實(shí)現(xiàn)詳解(Java/Go/Python/JS/C)
- 如何利用JavaScript實(shí)現(xiàn)排序算法淺析
- JavaScript實(shí)現(xiàn)的七種排序算法總結(jié)(推薦?。?/a>
- JavaScript數(shù)組排序的六種常見(jiàn)算法總結(jié)
- JavaScript自定義數(shù)組排序方法
- Javascript自定義排序 node運(yùn)行 實(shí)例
- 自定義排序算法在JavaScript中的應(yīng)用小結(jié)
相關(guān)文章
百度UEditor編輯器如何關(guān)閉抓取遠(yuǎn)程圖片功能
這篇文章主要介紹了百度UEditor編輯器如何關(guān)閉抓取遠(yuǎn)程圖片功能,需要的朋友可以參考下2015-03-03用Javascript實(shí)現(xiàn)錨點(diǎn)(Anchor)間平滑跳轉(zhuǎn)
本文介紹的方法,實(shí)現(xiàn)了錨點(diǎn)(Anchor)間平滑跳轉(zhuǎn),效果非常不錯(cuò)。2009-09-09threejs太陽(yáng)光與陰影效果實(shí)例代碼
在Threejs中類(lèi)似于我們現(xiàn)實(shí)世界,物體顯示的顏色是由物體本身的顏色及光照的顏色相互疊加而得到的,這篇文章主要給大家介紹了關(guān)于threejs太陽(yáng)光與陰影效果的相關(guān)資料,需要的朋友可以參考下2022-04-04詳細(xì)談?wù)凧avaScript中循環(huán)之間的差異
JS循環(huán)語(yǔ)句也叫迭代語(yǔ)句,是一種特殊的語(yǔ)句,主要用于需要多次執(zhí)行的代碼塊,下面這篇文章主要給大家介紹了關(guān)于JavaScript中循環(huán)之間的差異的相關(guān)資料,需要的朋友可以參考下2021-08-08通過(guò)共享Promise解決前端重復(fù)請(qǐng)求的代碼示例
在處理前端重復(fù)請(qǐng)求問(wèn)題時(shí),通過(guò)共享?Promise?實(shí)現(xiàn)請(qǐng)求合并和結(jié)果復(fù)用是常見(jiàn)的高效解決方案,本文給大家介紹了詳細(xì)實(shí)現(xiàn)思路和代碼示例,需要的朋友可以參考下2025-03-03JavaScript自定義超時(shí)API代碼實(shí)例
這篇文章主要介紹了JavaScript自定義超時(shí)API代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04教你用js截取字符串開(kāi)頭、結(jié)尾及兩字符串之間的內(nèi)容
在js中可以通過(guò)indexOf()方法找到指定的字符位置,再使用length屬性獲得字符串的長(zhǎng)度,下面這篇文章主要給大家介紹了關(guān)于如何用js截取字符串開(kāi)頭、結(jié)尾及兩字符串之間的內(nèi)容的相關(guān)資料,需要的朋友可以參考下2022-11-11