精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

30 個有用的 JavaScript 代碼片段(下)

開發 前端
今天這篇文章,接上昨天的《30 個有用的 JavaScript 代碼片段(上)》,我們把剩下的18個代碼片段分享在這篇文章中。

今天這篇文章,接上昨天的30 個有用的 JavaScript 代碼片段(上),我們把剩下的18個代碼片段分享在這篇文章中。

現在,我們就開始這篇文章的內容吧。

13. 創建一個 <img> DOM 元素

// Code snippet to render <img> DOM element on the fly
const loadImage = (url) => new Promise((resolve, reject) => {
    const img = new Image();
    img.addEventListener('load', () => resolve(img));
    img.addEventListener('error', (err) => reject(err));
    img.src = url;
});
// __USAGE Example__
var uploadFileInput=document.createElement('input');
uploadFileInput.type='file';
uploadFileInput.id='uploadFileInput';
document.body.appendChild(uploadFileInput);


function readFileAsDataURL(file) {
    return new Promise((resolve,reject) => {
        let fileredr = new FileReader();
        fileredr.onload = () => resolve(fileredr.result);
        fileredr.onerror = () => reject(fileredr);
        fileredr.readAsDataURL(file);
    });
}


uploadFileInput.addEventListener('change', async (evt)=> {
  var file = evt.currentTarget.files[0];
    if(!file) return;


    var b64str = await readFileAsDataURL(file);
    var _img = await loadImage(b64str);
    _img['style']['width']=`${_img.naturalWidth}px`;
    _img['style']['height']=`${_img.naturalHeight}px`;
    _img['style']['margin']='2px auto';
    _img['style']['display']='block';
    document.body.appendChild(_img);
}, false);

注意:雖然大多數 HTML 元素節點的屬性(例如 <div> <p>)是可訪問的并且不需要“load”事件的偵聽器,但 <img> 是此規則的一個例外(另一個唯一的例外是 < 腳本>)

因此,如果 document.createElement('img') 沒有返回 Promise:

var loadedImg=document.createElement('img');
loadedImg.src=<dataURL>; // dataURL refers to the encoded image data

變量loadedImg不會被渲染,因為在分配屬性src時它仍然是未定義的。

14. 刪除所有嵌套子節點

const removeAllChildNodes = ((parentEle) => parentEle.children.length > 0  ? parentEle.removeChild(parentEle.children[0]) : null);
// __USAGE Example__
const _scale = window.devicePixelRatio*2;
const size = 250;
const fontSize=size/_scale;


var canvasDisplay=document.createElement('div');
canvasDisplay['style']['width']=`${size+4}px`;
canvasDisplay['style']['height']=`${size+4}px`;
canvasDisplay['style']['margin']='1px auto';
document.body.appendChild(canvasDisplay);


var iconBtn_1=document.createElement('button');
iconBtn_1.type='button';
iconBtn_1.value='??';
iconBtn_1.innerText='??';
document.body.appendChild(iconBtn_1);


var iconBtn_2=document.createElement('button');
iconBtn_2.type='button';
iconBtn_2.value='??';
iconBtn_2.innerText='??';
document.body.appendChild(iconBtn_2);


function setIcon(icon) {
  var canvas=document.createElement('canvas');
  canvas.width=size;
  canvas.height=size;
  canvas['style']['margin']='1px auto';
  canvas['style']['width']=`${fontSize}px`;
  canvas['style']['height']=`${fontSize}px`;
  canvas['style']['border']='1px dotted #6c757d';
  canvas['style']['background']='transparent';


  var ctx=canvas.getContext('2d');
  ctx.scale(_scale,_scale);
  ctx.font = `${fontSize}px Segoe Ui Emoji`;
  ctx.textAlign = 'center';
  ctx.textBaseline='middle';
  ctx.globalAlpha=1.0;
  ctx.fontVariantCaps='unicase';
  ctx.filter='none';
  ctx.globalCompositeOperation='source-over';
  ctx.imageSmoothingEnabled=true;
  ctx.imageSmoothingQuality='high';
  ctx.letterSpacing='0px';
  ctx.lineWidth=0;
  ctx.shadowColor='rgba(0, 0, 0, 0)';
  ctx.strokeStyle='#000000';
  ctx.fillStyle='#ffffff';


  const _x=((canvas.width/_scale)/2);
  const _y=((canvas.height/_scale)/2);
  ctx.fillText(icon, _x, _y);


  removeAllChildNodes(canvasDisplay);
  canvasDisplay.appendChild(canvas);
}


iconBtn_1.addEventListener('click', ()=> {
  setIcon(iconBtn_1.value);
});
iconBtn_2.addEventListener('click', ()=> {
  setIcon(iconBtn_2.value);
});

使用示例:

注意:函數removeAllChildNodes()使用遞歸來刪除所有嵌套元素。這對于防止先前不需要的子節點與后續附加的子節點累積是必要的,如下所示:

15. 選擇文本并將其復制到剪貼板 — 表單輸入和其他 HTML DOM 元素

function selectCopyText(nodeId) {
    let isVal=true;
    let node = document.getElementById(nodeId);
    try {
        node.select();
        try { node.setSelectionRange(0, 99999);} catch(err0) {}
    } catch(err) {
        isVal=false;
        if (document.body.createTextRange) {
            const range = document.body.createTextRange();
            range.moveToElementText(node);
            range.select();
        } else if (window.getSelection) {
            const selection = window.getSelection();
            const range = document.createRange();
            range.selectNodeContents(node);
            selection.removeAllRanges();
            selection.addRange(range);
        } else { console.warn("Could not select text in node: Unsupported browser."); }
    } finally { navigator.clipboard.writeText(isVal ? node.value : node.innerText);}
}
const strToCopy = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Viverra accumsan in nisl nisi scelerisque eu ultrices. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Sodales ut etiam sit amet nisl purus.';


var _copyBtn=document.createElement('button');
_copyBtn.type='button';
_copyBtn.value='toCopy';
_copyBtn.innerText='Copy Textarea';


var _textarea=document.createElement('textarea');
_textarea.id='toCopy';
_textarea['style']['resize']='none';
_textarea['style']['width']='100%';
_textarea['style']['height']='100px';
_textarea['style']['display']='block';
_textarea.value=strToCopy;
document.body.appendChild(_copyBtn);
document.body.appendChild(_textarea);


var _copyBtn2=document.createElement('button');
_copyBtn2.type='button';
_copyBtn2.value='toCopy2';
_copyBtn2.innerText='Copy DIV';


var _div=document.createElement('_div');
_div.id='toCopy2';
_div['style']['width']='100%';
_div['style']['height']='100px';
_div['style']['display']='block';
_div['style']['border']='1px dashed #000000';
_div.innerText=strToCopy;
document.body.appendChild(_copyBtn2);
document.body.appendChild(_div);


_copyBtn.addEventListener('click', ()=> {
  selectCopyText(_copyBtn.value);
});
_copyBtn2.addEventListener('click', ()=> {
  selectCopyText(_copyBtn2.value);
});

使用示例:

雖然“復制到剪貼板”是最普遍需要的 JavaScript 功能之一,但還值得注意的是,所需的文本內容同樣可能包含在表單元素中,例如 - <input type='text'> <textarea > 或嵌入 HTML DOM 元素中,例如 <div> <p>。

因此,此函數解決了通過檢查 HTMLInputElement 或 HTMLDivElement 中是否存在文本內容來確定如何在 JavaScript 中實現文本選擇的問題。

然后分別選擇屬性.value 和.innerText。

16. 將 JSON 對象數組轉換為 CSV 文本

function rowJSONToCSV(rowJSONObj) {
    let csvOutputStr='';
    let allHeaders={};
    for(let obj of rowJSONObj) {
      for(let k in obj) { allHeaders[k]=''; }
    }
    let allHeadersArr=Object.keys(allHeaders);
    let headerStr=JSON.stringify(allHeadersArr);
    headerStr=headerStr.substring(1,headerStr.length-1);
    csvOutputStr+=headerStr + '\n';


    for(let obj of rowJSONObj) {
      let allValuesArr=[];
      for(let headerField of allHeadersArr) {
        let rowVal=obj[headerField];
        (typeof rowVal !== 'undefined') ? allValuesArr.push(rowVal) : allValuesArr.push('NULL')
      }
      let rowStr=JSON.stringify(allValuesArr);
      rowStr=rowStr.substring(1,rowStr.length-1);
      csvOutputStr+=rowStr + '\n';
    }
    return Promise.resolve(csvOutputStr);
}
var uploadFileInput=document.createElement('input');
uploadFileInput.type='file';
uploadFileInput.id='uploadFileInput';
document.body.appendChild(uploadFileInput);


function readFileAsText(file) {
    return new Promise((resolve,reject) => {
        let fileredr = new FileReader();
        fileredr.onload = () => resolve(fileredr.result);
        fileredr.onerror = () => reject(fileredr);
        fileredr.readAsText(file);
    });
}
uploadFileInput.addEventListener('change', async (evt)=> {
    var file = evt.currentTarget.files[0];
    if(!file) return;


    var jsonStr = await readFileAsText(file);
    var inputJSONObj = JSON.parse(jsonStr);
    var divOne = document.createElement('div');
    divOne['style']['font-family']='Consolas';
    divOne['style']['height']='250px';
    divOne['style']['weight']='100%';
    divOne['style']['margin']='2px auto';
    divOne['style']['overflow']='auto';
    divOne['style']['border']='1px dashed #17a2b8';
    var csvStrOutput=await rowJSONToCSV(inputJSONObj);
    divOne.innerText=csvStrOutput;
    document.body.appendChild(divOne);
}, false);

使用示例

演示示例數據文件的鏈接:icd10_data.json

輸出 CSV 文件的鏈接:icd10_data.csv

基本原理

按照慣例,我傾向于使用插件 json2csv.js(最初來自 https://www.npmjs.com/package/json2csv)來進行 JSON 到 CSV 的轉換。

然而,對于超過 50MB 的大文件,遞歸算法超出了其最大堆棧限制,當我嘗試將文件上傳到我開發的 Web 實用程序時,我發現了這一點:https://tableau-data-utility。onrender.com/ 在 [?? Spatial?CSV] 選項卡上

由于地理空間數據集往往超過 50MB,實現上述將 JSON 轉換為 CSV 的函數解決了遞歸問題。

局限性

僅適用于深度級別為 1 的嵌套 JSON 對象。如果輸入深度級別更高的 JSON 對象,則效果不佳。例如,以下內容將失敗,因為第一個條目“喜歡”的深度級別 = 2

[
   { 
    "firstName":"John", 
    "lastName":"Doe",
    "likes": {
     "pets": ["dogs","cats"]
    }
   },
   { 
    "firstName":"Anna", 
    "lastName":"Smith" 
   }
]

17.DOMContentLoaded 事件監聽器

if (document.readyState === 'complete' || document.readyState !== 'loading' && !document.documentElement.doScroll) {
  callback();
} else {
  document.addEventListener('DOMContentLoaded', async() => {
    /* TO DO LOGIC HERE */
  });
}
<!DOCTYPE html>
  <html>  
    <meta charset='UTF-8'>
    <head>Demo (5)</head>  
    <body>  
      <p>?? Refresh webpage to run function "doSomething()".</p>
      <script>
        if (document.readyState === 'complete' || document.readyState !== 'loading' && !document.documentElement.doScroll) {
          callback();
        } else {
          document.addEventListener('DOMContentLoaded', async() => {
            function doSomething() {  
              alert('Hello!');  
            }
            doSomething();
          });
        }
</script>
    </body>
</html>
<!DOCTYPE html>
  <html>  
    <meta charset='UTF-8'>
    <head> 
      <head>Demo (5)</head>
      <script>  
         function doSomething() {  
            alert('Hello!');  
         }  
</script>  
    </head>  
    <body onload='doSomething()'>  
      <p>?? Refresh webpage to run function "doSomething()".</p>
    </body>
</html>

使用示例

當網頁加載后需要立即執行某個功能時,一種可能的方法是將 onload 事件嵌入到 <body> 標記中:

注意:一個常見的錯誤是執行 windows.onload 中嵌套的函數:

<!DOCTYPE html>
  <html>  
    <meta charset='UTF-8'>
    <head> 
      <head>Demo (5)</head>
      <script>
        windows.onload = function() {
          function doSomething() {  
              alert('Hello!');  
             }
        };
</script> 
    </head>  
    <body>  
      <p>?? Refresh webpage to run function "doSomething()".</p>
    </body>
</html>

因此,為了對所有嵌入的 JavaScript 代碼片段進行稍微更有條理的分區,請使用以下命令:

document.addEventListener('DOMContentLoaded', function() { ... });

可以考慮改為:

18. 將多個事件綁定到 HTML 元素

// Binding multiple events to a single element
function addMultipleEvents(eventsArray, targetElem, handler) {
  eventsArray.map((event) => targetElem.on(event, handler));
}


// Alt Version: Using 'addEventListener'
function addMultipleEvents(eventsArray, targetElem, handler) {
  eventsArray.map((event) => targetElem.addEventListener(event, handler));
}
// Noting the coordinates when map is pan or zoom etc.
// Built with Leaflet.js
var mapUrl="https://stamen-tiles.a.ssl.fastly.net/toner-hybrid/{z}/{x}/{y}.png";


var map = L.map("map");
var basemap=L.tileLayer(mapUrl, {
    detectRetina: true,
    maxZoom: 19,
    minZoom: 11,
    attributionControl: false
}).addTo(map);
function renderImageBounds() {
  imgBounds=map.getBounds();
  imgBounds_Left.innerHTML=imgBounds._southWest.lng;
  imgBounds_Right.innerHTML=imgBounds._northEast.lng;


  imgBounds_Bottom.innerHTML=imgBounds._southWest.lat;
  imgBounds_Top.innerHTML=imgBounds._northEast.lat;
}
function addMultipleEvents(eventsArray, targetElem, handler) {
  eventsArray.map((event) => targetElem.on(event, handler));
}
addMultipleEvents(['zoomend', 'dragend', 'viewreset', 'moveend', 'load', 'resize'], map, renderImageBounds);

使用示例

在我之前構建的網絡實用程序中,合并了跟蹤所顯示地圖的地理坐標的功能,如下所示:

19.清除瀏覽器緩存

清除單個網頁瀏覽器緩存的 JavaScript 如下:

const supportsLocalStorage = () => {
    if (!('localStorage' in window)) return false;
    try {
        localStorage.setItem('check', 'true');
        localStorage.getItem('check');
        localStorage.removeItem('check');
        return true;
    } catch (e) {
        return false;
    }
};
const hasLocalStorage = supportsLocalStorage();
/* Assume there is a <button id='clearCache' type='button'></button> */
/* HTML element in the DOM */
/*const clearCacheBtn = document.getElementById('clearCache');*/
/*clearCacheBtn.addEventListener('click', async()=> {*/
    requestAnimationFrame(() => {
        if (hasLocalStorage) {
            localStorage.clear();
            location.reload();
        }
    });
/*});*/

用例演示

在某些網頁上,以前的用戶輸入會有意保留在瀏覽器緩存中。 例如,在 JSONEditor.com 上:

但是,當通過 JavaScript 控制臺以編程方式清除瀏覽器緩存時:

20. 以編程方式觸發 HTML 事件

// Note: Compatible for both IE8, IE9+ and other modern browsers
function triggerEvent(el, type) {
    let e = ( ('createEvent' in document) ? document.createEvent('HTMLEvents') : document.createEventObject() );
    if ('createEvent' in document) { 
      e.initEvent(type, false, true);
      el.dispatchEvent(e);
    } else { 
      e.eventType = type;
      el.fireEvent('on' + e.eventType, e);
    }
}

用例演示

假設以下 HTML 標記文檔:

<!DOCTYPE html>
<html>
  <head><title>Demo trigger() Method</title></head>
  <body>
      <div class='box-1'><h1>0</h1></div>
      <button id="btn1">Increase #1</button>
      <div class='box-2'><h1>0</h1></div>
      <button id='btn2'>Increase #2</button>
      <script>
        /* TO-DO */
</script>
  </body>
</html>

上面的triggerEvent()函數可以在上面的2個<script>標簽之間實現,如下所示:

function triggerEvent(el, type) {
    let e = ( ('createEvent' in document) ? document.createEvent('HTMLEvents') : document.createEventObject() );
    if ('createEvent' in document) { 
      e.initEvent(type, false, true);
      el.dispatchEvent(e);
    } else { 
      e.eventType = type;
      el.fireEvent('on' + e.eventType, e);
    }
}
document.querySelector('#btn1').addEventListener('click', () => {
  increase(document.querySelector('.box-1>h1'));
});
document.querySelector('#btn2').addEventListener('click', () => {
  triggerEvent(document.querySelector('#btn1'), 'click');
  increase(document.querySelector('.box-2>h1'));
});
function increase(obj) {
    let text = parseInt(obj.textContent, 10);
    obj.textContent = text + 1;
}

雖然, jQuery 插件有包裝函數 trigger() ,它輸出相同的結果。

<!-- import jQuery plugin -->
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js'></script>
// Sample jQuery code snippet at /* TO-DO */ between the 2 <script> tags:
$('#btn1').click(() => {
  increase($('.box-1>h1'));
});
$('#btn2').click(() => {
  $('#btn1').trigger('click');
  increase($('.box-2>h1'));
});
function increase(obj) {
  let text = parseInt(obj.text(), 10);
  obj.text(text + 1);
}

在首選更輕量級替代方案的情況下,可以考慮使用 functiontriggerEvent()。

21. 將 async-await 與 for 循環結合使用

下面的代碼片段調用 JSON API,其中每次迭代都會解析不同的參數 (i),以按順序檢索 JSON 響應。

(async()=> {
    // Assume a <table id='datatable'></table> is in the HTML DOM
    const datatableTbody = document.querySelector('#datatable tbody');
    for (let i=1;i<=15;i++) {
      const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${i}`);
      const result = await response.json();
      datatableTbody.insertAdjacentHTML('beforeend', '<tr><td>'+Object.values(result).join('</td><td>')+'</td></tr>');
    }
})();

用例演示

通常,當呈現數據記錄以進行顯示時,每條記錄都是通過 API 調用獲取的。 通過API返回所需的記錄,完整的代碼片段如下:

<!DOCTYPE html>
<html>
  <head>
    <title>async-await in a for-loop</title>
    <style>
      table {
        font-family: arial, sans-serif;
        border-collapse: collapse;
        width: 100%;
      }
      td, th {
        border: 1px solid #dddddd;
        text-align: left;
        padding: 4px;
      }
      table tbody tr:nth-child(odd) {
        background-color: #f1f1f1;
      }
</style>
  </head>
  <body>
  <table id='datatable'>
    <thead>
      <tr><th>userId</th><th>id</th><th>title</th><th>completed</th></tr>
    </thead>
    <tbody></tbody>
  </table>
  <script>
     (async()=> {
        const datatableTbody = document.querySelector('#datatable tbody');
        for (let i=1;i<=15;i++) {
          const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${i}`);
          const result = await response.json();
          datatableTbody.insertAdjacentHTML('beforeend', '<tr><td>'+Object.values(result).join('</td><td>')+'</td></tr>');
        }
    })();
</script>

22. 將字符串轉換為帕斯卡大小寫(帶空格)

由于 JavaScript 沒有內置函數將每個單詞的首字母轉換為大寫,因此可以應用以下代碼片段:

const toPascalCase = (str) => ( (str.toLowerCase()).replace(/\w+/g, ((str) => ( str.charAt(0).toUpperCase()+str.substr(1) ).replace(/\r/g, '')) ) );
// Usage:
// let str = 'HeLLO world';
// console.log(toPascalCase(str));
// Result: 'Hello World'

用例演示

當從 API 返回的字母大小寫不一致時,為了視覺一致性,以帕斯卡大小寫顯示某些標簽可能更合適。 

例如,在我的一個業余項目中——一個 Bus ETA Web 應用程序,檢索所有公交車站描述的 API 的字母大小寫不一致:

23. 將 Uint8Array 轉換為 Base64 字符串

除了純文本之外,JavaScript 還讀取其他格式的文件輸入,例如 ArrayBuffers(尤其是多媒體上傳)。 從 ArrayBuffer 檢索文件數據作為 Base64 編碼字符串 (DataURL) 的函數如下:

// Uint8Array to Base64 Encoded String
const convertBitArrtoB64 = (bitArr) => ( btoa( bitArr.reduce((data, byte) => data + String.fromCharCode(byte), '') ) );

用例演示

對于某些庫,所有處理的文件輸入僅輸出為 Uint8Array。 一個例子是 FFmpeg.wasm(歸功于吳杰羅姆),我在一個網絡應用程序中實現了它,用于對音頻編解碼器進行轉碼。 在這個副項目中的用法如下:

// `data` is output as Uint8Array 
// assuming input format is mp3, `outputFileExt`='mp3'
const data = ffmpeg.FS('readFile', `output${outputFileExt}`);
let b64Str = convertBitArrtoB64(data);


// assuming converted output format is mp4, `outputFileMimeType` = 'mp4'
let encodedData=`data:${outputFileMimeType};base64,${b64Str}`;


// To generate download link and save output
let dwnlnk = document.createElement('a');
dwnlnk.download = `${saveFilename}${outputFileExt}`;
dwnlnk.href = encodedData;
dwnlnk.click();

24.將Base64字符串轉換為Uint8Array

反之,Uint8Array→DataURL轉換的逆過程如下:

// Base64 Encoded String to Uint8Array
const convertB64ToBitArr = (b64Str) => ( Uint8Array.from(atob( (b64Str.includes(';base64,') ? (b64Str.split(','))[1] : b64Str) ), (v) => v.charCodeAt(0)) );

25.獲取瀏覽器垂直滾動條寬度

function getScrollbarWidth() {
    const docEle=document.documentElement;
    const cssOverflowY=docEle.style.overflowY; // stores prev value
    docEle.style.overflowY='scroll'; // force scrollbar to appear
    const scrollbarWidth = window.innerWidth - docEle.clientWidth;
    docEle.style.overflowY=cssOverflowY; // reset to prev value


    return scrollbarWidth;
}
const sbWidth=getScrollbarWidth(); // 17


/* comments */
// In which case, scrollbar width is 17px for my browser 
// and width of elements should factor in this value in its css attributes

26. 將年、月和日添加到 Date() 對象

雖然 JavaScript 沒有特定于 Date() 對象的時間單位減法/加法的內置方法,但可以使用輔助方法來構造以下實用函數。

function addYears(date, n) {
    const dateCopy = new Date(date);
    dateCopy.setFullYear(dateCopy.getFullYear() + n);
    return dateCopy;
}
function addMonths(date, n) {
    const dateCopy = new Date(date);
    dateCopy.setMonth(dateCopy.getMonth() + n);
    return dateCopy;
}
function addDays(date, n) {
    const dateCopy = new Date(date);
    dateCopy.setDate(dateCopy.getDate() + n);
    return dateCopy;
}

使用示例:

const currentDate=new Date();
console.log(`Current date: ${currentDate}`);
console.log(`Current date + 11 years: ${addYears(currentDate, 11)}`);
console.log(`Current date + 11 months: ${addMonths(currentDate, 11)}`);
console.log(`Current date + 11 days: ${addDays(currentDate, 11)}`);


/* Sample output */
// Current date: Fri Sep 22 2023 23:52:57 GMT+0800 (Singapore Standard Time)
// Current date + 11 years: Fri Sep 22 2034 23:52:57 GMT+0800 (Singapore Standard Time)
// Current date + 11 months: Thu Aug 22 2024 23:52:57 GMT+0800 (Singapore Standard Time)
// Current date + 11 days: Tue Oct 03 2023 23:52:57 GMT+0800 (Singapore Standard Time)

27.從數組中刪除無效值,例如null和undefined

const removeInvalidVals = ((arr) => arr.filter(ele => (ele !== null && typeof ele !== 'undefined') ? true : false));

上面的函數從數組中刪除空值和未定義的值。 一個常見的用例是從 API 調用的 JSON 響應中排除無效值。

使用示例:

let arr = [1, 3, undefined, 5, null, null, 8];
arr = removeInvalidVals(arr);
console.log(arr);


/* Expected output */
// [1, 3, 5, 8]

28. 數組中的唯一值

操作數組的另一個方便的實用函數是刪除其中的重復值 。

const uniqueArr = ((arr) => (Array.from(new Set(arr))));

使用示例:

let arr = [1, 1, 3, 2, 5, 3, 4, 7, 7, 7, 8];
arr = uniqueArr(arr);
console.log(arr);


/* Expected output */
// [1, 3, 2, 5, 4, 7, 8]

29. 通過解析字符串創建新的 HTML DOM 元素

HTML <template> 標簽用于保存 HTML 內容以供稍后呈現。 下面的函數 htmlToElement() 不是使用 createElement() 在 JavaScript 中從頭開始創建元素,而是直接從 HTML 字符串創建子節點。

function htmlToElement(html) {
    if (!(document.createElement("template").content)) {
        alert('Your browser does not support "template".');
        return;
    }
    let documentFragment = document.createDocumentFragment();
    let template = document.createElement('template');
    template.innerHTML = html.trim();
    for (let i = 0, e = template.content.childNodes.length; i < e; i++) {
        documentFragment.appendChild(template.content.childNodes[i].cloneNode(true));
    }
    return documentFragment;
}

使用示例

<!DOCTYPE html>
<html lang='en'>
  <head><meta charset='utf-8'></head>
  <body>
    <div id='pageContainer'></div>
  </body>
</html>
<!DOCTYPE html>
<html lang='en'>
  <head><meta charset='utf-8'></head>
  <body>
    <div id='pageContainer'></div>
  </body>
</html>

30. 打印網頁

/* Assume there is a <button> HTML element in the DOM */
// <button id='printPage' type='button'>Print</button>
const printPageBtn = document.getElementById('printPage');
printPageBtn.addEventListener('click', ()=> {
    requestAnimationFrame(() => {
        window.print();
    });
});

演示:

總結

到這里,我們的30個有用的JavaScript的代碼片段就分享完了,希望這些代碼能夠幫助到你。

責任編輯:華軒 來源: web前端開發
相關推薦

2023-10-09 14:48:06

2023-05-22 15:53:06

JavaScrip代碼素材

2023-06-16 16:34:25

JavaScripWeb 開發

2023-11-03 16:02:00

JavaScript開發

2023-05-30 15:11:16

JavaScrip開發功能

2022-12-19 15:23:51

JavaScrip開發語言

2023-06-13 15:15:02

JavaScript前端編程語言

2012-11-27 10:23:18

CSSWeb開發

2012-01-17 13:54:02

PHP

2022-07-22 10:06:17

JavaScript代碼

2011-07-11 10:16:07

JavaScript

2019-10-10 16:49:18

Python鏡音雙子腳本語言

2024-06-21 11:02:16

2023-02-15 16:19:59

JavaScript技巧API

2022-06-27 19:01:04

Python應用程序數據

2023-12-26 14:28:08

JavaScript開發

2024-01-04 16:46:58

JavaScript開發

2021-09-17 15:31:47

代碼JavaScript數組

2021-09-03 10:08:53

JavaScript開發 代碼

2024-08-02 17:19:36

點贊
收藏

51CTO技術棧公眾號

首页欧美精品中文字幕| 国产尤物久久久| 黄网动漫久久久| 欧美日韩三区四区| 一区二区三区在线免费观看视频 | 天堂中文字幕在线观看| 精品日韩毛片| 欧美成人精品高清在线播放| 国产av无码专区亚洲精品| 1区2区3区在线观看| 国产电影一区在线| 日本欧美一级片| 91精品国产闺蜜国产在线闺蜜| 看全色黄大色大片免费久久久| 欧美主播一区二区三区美女| 国产91porn| 精品亚洲综合| 久久综合久久99| 91精品国产乱码久久久久久蜜臀 | 免费无码不卡视频在线观看| 日本中文字幕在线看| 成人av网址在线观看| 国产精品免费一区| 看片网址国产福利av中文字幕| 97精品中文字幕| 亚洲毛片一区二区| 2025中文字幕| 香蕉成人在线| 欧美在线一区二区三区| 毛片在线播放视频| 2024最新电影免费在线观看| 国产精品网友自拍| 欧美尤物一区| 日本黄在线观看| 丁香啪啪综合成人亚洲小说| 成人网在线观看| 波多野结衣在线观看一区| 亚洲久色影视| 久久久久久成人| √天堂中文官网8在线| 久久精品国产www456c0m| 亚洲精品自产拍| 少妇一级淫免费观看| 日本成人手机在线| 欧美日产在线观看| 中文字幕 91| 色8久久影院午夜场| 欧美色xxxx| 亚洲中文字幕无码一区二区三区| 嫩草在线视频| 国产三级精品在线| 日本一区二区三区免费观看| 日av在线播放| 久久综合九色综合97婷婷女人| 国产嫩草一区二区三区在线观看| 精品国产九九九| 国产精品白丝jk黑袜喷水| 亚洲xxxx3d| 午夜精品久久久久久久99热黄桃| 国产乱一区二区| 亚洲永久在线观看| 精品人妻av一区二区三区| 国产成人在线影院| 国产一区二区中文字幕免费看| 亚洲大尺度网站| 成年人网站91| 农村寡妇一区二区三区| 国产小视频在线播放| 国产日韩亚洲欧美综合| 亚洲图色在线| 91蜜桃在线视频| 一区二区三区中文字幕在线观看| 青青视频免费在线| 午夜dj在线观看高清视频完整版| 亚洲一区二区中文在线| 欧美 日韩 亚洲 一区| 三妻四妾完整版在线观看电视剧 | 日韩欧美高清在线播放| 久久精品国产久精国产一老狼| 色偷偷www8888| 国产精品观看| 人体精品一二三区| 中文字幕丰满人伦在线| 国产一区欧美日韩| 国精产品一区二区| 第一页在线观看| 亚洲精品v日韩精品| 少妇无码av无码专区在线观看| 另类图片综合电影| 91精品婷婷国产综合久久竹菊| 污网站免费观看| 精品久久美女| 欧美激情久久久| 久久久久久无码精品大片| 极品美女销魂一区二区三区| 国产精品一区二区三区四区五区 | 久久久久久久免费视频了| 神马影院一区二区三区| 欧洲一区二区三区| 在线影视一区二区三区| 女人扒开双腿让男人捅| 久久爱www成人| 欧美精品在线观看91| 国产无人区码熟妇毛片多| 久久av中文字幕片| 久久精品人成| 99视频免费在线观看| 欧美性猛交xxxx乱大交3| 不卡中文字幕在线观看| 亚洲系列另类av| 欧美国产日韩中文字幕在线| 中文字幕乱码中文字幕| hitomi一区二区三区精品| 中文字幕久精品免| 欧美日韩女优| 日韩av在线免费观看| 卡通动漫亚洲综合| 免费av网站大全久久| 精品无码久久久久久久动漫| 在线视频中文字幕第一页| 欧美伊人久久久久久久久影院 | 77成人影视| 中文字幕精品久久| www.毛片.com| 成人污视频在线观看| 视频一区二区视频| 欧美成人福利| 亚洲人成毛片在线播放| 日韩av电影网址| 国产精品一区二区免费不卡| 一区二区在线观看网站| 国产综合色在线观看| 日韩精品免费视频| 天天操天天射天天爽| 国产一区日韩二区欧美三区| 一区二区三区四区视频在线观看| 欧美极品影院| 亚洲男女自偷自拍图片另类| 日韩网红少妇无码视频香港| 大白屁股一区二区视频| 成人小视频在线观看免费| 国产精品国产亚洲精品| 精品国产一区av| 中文字幕在线观看视频一区| 国产午夜精品理论片a级大结局| 日韩激情免费视频| 羞羞色国产精品网站| 97超碰国产精品女人人人爽| 特黄视频在线观看| 精品国产乱码久久久久久虫虫漫画| 国产chinesehd精品露脸| 综合在线一区| 肥熟一91porny丨九色丨| 在线观看av免费| 日韩精品一区二区三区四区视频| 中文字幕在线观看成人| 国产精品一区二区久久不卡| 无码熟妇人妻av在线电影| 91综合久久爱com| 亚州成人av在线| 爽爽视频在线观看| 色婷婷av一区二区| 精品熟妇无码av免费久久| 久久国产生活片100| 手机看片日韩国产| 91麻豆精品激情在线观看最新 | 亚洲精品毛片| 久久综合久中文字幕青草| 国产成人精品免费看视频| 亚洲香肠在线观看| 亚洲av网址在线| 男人的j进女人的j一区| 9999在线观看| 国产成人夜色高潮福利影视| 欧美一级bbbbb性bbbb喷潮片| 国产理论电影在线观看| 91精品欧美福利在线观看 | 欧美午夜性色大片在线观看| 免费成人深夜天涯网站| 国产一区二区免费视频| 极品美女扒开粉嫩小泬| 不卡视频在线| 99热在线国产| 台湾成人免费视频| 欧美另类69精品久久久久9999| 黄色a在线观看| 欧美在线免费播放| 欧美黄片一区二区三区| 久久久青草青青国产亚洲免观| 青青草原国产在线视频| 亚洲日本视频| 一区二区三区国| 欧美深夜视频| 国产在线不卡精品| 九色porny视频在线观看| 中日韩午夜理伦电影免费 | 国产老女人精品毛片久久| 成人毛片视频网站| 羞羞答答成人影院www| 精品视频一区二区| 欧美一区=区三区| 26uuu久久噜噜噜噜| 成人影欧美片| 国产亚洲欧洲在线| 韩国av免费在线| 欧美日本一区二区| 五月天婷婷久久| 亚洲一区二区三区激情| 激情五月深爱五月| 91论坛在线播放| 古装做爰无遮挡三级聊斋艳谭| 天堂av在线一区| 国产精品久久久久7777| 久久精品影视| 日本一区二区三区免费看| 免费萌白酱国产一区二区三区| 成人黄色免费片| 亚洲日本网址| 欧美资源在线观看| 国产理论电影在线| 久久成人国产精品| av片在线免费观看| 亚洲男人第一av网站| 国产成人手机在线| 欧美xfplay| aaa一区二区三区| 欧美日本免费一区二区三区| 亚洲s码欧洲m码国产av| 污片在线观看一区二区| 久久免费少妇高潮99精品| 亚洲欧美日韩小说| 久草福利资源在线| 国产精品国产自产拍高清av| www.黄色在线| 国产肉丝袜一区二区| caopeng视频| 久久久久亚洲综合| 成年人网站免费在线观看| 99久久精品99国产精品| 国产美女视频免费观看下载软件| 成人免费高清在线| 大尺度做爰床戏呻吟舒畅| 国产99久久久国产精品潘金| 第一页在线视频| 丰满少妇久久久久久久| 亚洲一二三四五| 成人99免费视频| 玖玖爱在线精品视频| av影院午夜一区| 日本xxxx裸体xxxx| 久久亚洲影视婷婷| 欧美三级视频网站| 国产精品福利一区二区| 任我爽在线视频| 亚洲三级电影全部在线观看高清| 精品国产视频在线观看| 亚洲天堂免费看| 欧美极品视频在线观看| 亚洲不卡一区二区三区| 欧美福利视频一区二区| 懂色av影视一区二区三区| 精品免费囯产一区二区三区 | 国产做受高潮69| 午夜影院一区| 国产精品99久久久久久人 | 欧美日韩亚洲综合在线 | 亚洲精品成人图区| 国产精品高潮视频| 亚洲一区有码| 国产精品有限公司| 九九综合久久| 一本—道久久a久久精品蜜桃| 欧美日韩1080p| 日本a级片免费观看| 免费高清在线视频一区·| 亚洲男人天堂2021| 不卡欧美aaaaa| 色综合99久久久无码国产精品| 中文字幕视频一区二区三区久| 1024手机在线视频| 狠狠操狠狠色综合网| 亚洲一区中文字幕在线| 日韩美女视频一区二区在线观看| 亚洲欧美日韩动漫| 日韩中文在线观看| а√在线中文在线新版| 国产欧美日韩精品丝袜高跟鞋| 亚洲精品一区在线| 日本一区二区三区精品视频| 欧美福利专区| 免费在线观看毛片网站| 韩日av一区二区| 四虎影成人精品a片| 樱花草国产18久久久久| 中文字幕 国产精品| 欧美成人性战久久| 高h视频在线| 久久久久成人精品| 麻豆久久久久| 蜜桃视频日韩| 极品少妇一区二区三区| 性欧美1819| 久久亚洲一区二区三区四区| 九九热精彩视频| 欧美日韩一级片在线观看| 欧美一级特黄aaaaaa大片在线观看| 国产午夜精品视频| 国产拍在线视频| 亚洲jizzjizz日本少妇| 精品美女视频| 成熟了的熟妇毛茸茸| 高清在线不卡av| 国产又粗又硬又长又爽| 在线欧美日韩精品| 天天射天天操天天干| 超薄丝袜一区二区| 福利一区二区三区视频在线观看| 国模一区二区三区私拍视频| 中文字幕日韩欧美精品高清在线| www.日本xxxx| 久久一夜天堂av一区二区三区| 久草成人在线视频| 欧美一区二区三区喷汁尤物| 91在线视频免费看| 国产精品91在线观看| 亚洲老女人视频免费| 免费在线观看视频a| 国产白丝网站精品污在线入口| 久久嫩草捆绑紧缚| 日本在线视频免费| 337p日本欧洲亚洲大胆色噜噜| bestiality新另类大全| 成人欧美一区二区三区黑人孕妇 | 免费国产a级片| 成人三级伦理片| 国产一级黄色av| 欧美大片一区二区| av网址在线| 亚洲iv一区二区三区| 中文在线日韩| 性鲍视频在线观看| 亚洲精品v日韩精品| 亚洲h视频在线观看| 欧美日韩第一页| 91午夜精品| 国产精品无码av在线播放| 成人午夜在线免费| 一级aaa毛片| 亚洲男人第一网站| 午夜av成人| 一本—道久久a久久精品蜜桃| 国产在线国偷精品免费看| 天天综合天天做| 精品裸体舞一区二区三区| 爱情岛论坛亚洲品质自拍视频网站| 国产一区免费在线| 亚洲一区二区动漫| 性欧美一区二区| 欧美麻豆精品久久久久久| 麻豆av在线导航| 99c视频在线| 在线视频亚洲| 成人黄色a级片| 制服丝袜亚洲色图| 大香伊人久久| 日韩av高清| 国产一区二区影院| 久久久久久久中文字幕| 日韩电影在线观看永久视频免费网站| 超碰国产一区| 一区二区三区四区视频在线观看| 国产成人综合网站| 波多野结衣 久久| 俺去亚洲欧洲欧美日韩| 亚洲欧美日本国产| 久草资源站在线观看| 国产精品免费av| www.五月婷| 欧美主播福利视频| 香蕉视频官网在线观看日本一区二区| 国产探花一区二区三区| 欧美日韩一区二区免费在线观看 | 黄色国产小视频| 亚洲人成网站精品片在线观看| 国产18精品乱码免费看| 国产精品老女人视频| 欧美日韩三级| 成人在线一级片| 日韩欧美一卡二卡| 成人性生活视频| 欧美大片免费播放| 久久久久久久久久久电影| japanese国产| 国产91露脸中文字幕在线| 亚洲电影影音先锋| 免费观看av网站| 日韩精品一区二区在线| 激情久久99| 99热成人精品热久久66| 亚洲人成人一区二区在线观看 |