精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91蝌蚪国产九色| 激情综合电影网| 精品1区2区3区| 一区二区成人国产精品 | 国产欧美日韩综合一区在线播放| 日韩精品中文字幕在线| 国产成人黄色网址| 好吊日av在线| 久久久久国产免费免费| 亚洲一区二区免费| 97超碰人人干| 91精品亚洲| 亚洲日本中文字幕| 美女被爆操网站| 秋霞国产精品| 午夜精品成人在线视频| 亚洲一区二区免费视频软件合集| 亚洲乱码国产乱码精品精软件| 视频一区国产视频| 欧美日韩国产第一页| 超薄肉色丝袜一二三| 操欧美女人视频| 91麻豆精品国产91久久久使用方法| 亚洲人成无码网站久久99热国产| 日本三级在线播放完整版| 97久久久精品综合88久久| 国产日本欧美在线观看| 特级毛片www| 影音先锋国产精品| 欧美成人性色生活仑片| 精品无码在线观看| 三级小说欧洲区亚洲区| 欧美成人激情免费网| 777一区二区| 电影亚洲一区| 日韩人在线观看| 玩弄中年熟妇正在播放| 成人影院www在线观看| 国产天堂亚洲国产碰碰| 久久久久久高清| 欧美一级在线免费观看 | 3d动漫精品啪啪一区二区下载 | 欧美二级三级| 日韩在线观看视频一区| 国产成人啪午夜精品网站男同| 国产日韩欧美自拍| 在线观看国产小视频| 日韩精品一二三区| 国产99在线|中文| 亚洲精品男人的天堂| 在线日本高清免费不卡| 久久久女女女女999久久| 日本青青草视频| 久久一本综合| 久久精品视频99| 中文字幕电影av| 午夜国产一区二区| 久久伊人精品视频| 午夜69成人做爰视频| 伊人久久大香线蕉综合四虎小说| 日韩在线资源网| 三上悠亚在线观看视频| 外国成人激情视频| 久久久www成人免费精品| brazzers精品成人一区| xvideos.蜜桃一区二区| 亚洲激情在线观看| 极品白嫩丰满美女无套| 免费成人高清在线视频theav| 亚洲欧洲高清在线| аⅴ天堂中文在线网| 91日韩免费| 久久99久久99精品免观看粉嫩| 九九视频免费看| 中文高清一区| 国产精品久久久久99| 在线观看毛片av| 国产精品一区二区视频| 国产在线一区二区三区四区| 天天躁日日躁狠狠躁喷水| 久久久久久久网| gogogo免费高清日本写真| 在线免费观看的av| 欧美日韩激情视频| 五月婷婷六月丁香激情| 天堂久久av| 亚洲精品美女久久| 手机看片国产日韩| 综合久久精品| 午夜精品视频网站| 羞羞色院91蜜桃| 岛国一区二区在线观看| 欧美日韩国产三区| 国产福利在线播放麻豆| 精品欧美一区二区三区| 激情网站五月天| 日本精品视频| 一区二区三区精品99久久| 男女羞羞免费视频| 久久天天综合| 成人h视频在线观看| 国际av在线| 亚洲午夜在线视频| 一区二区三区 日韩| 国产伦理久久久久久妇女| 国产一区二区欧美日韩| 久久免费少妇高潮99精品| 日韩精品乱码免费| 国产精品国产一区二区| 亚洲欧美视频一区二区| 五月天精品一区二区三区| av中文字幕网址| 蜜桃视频欧美| 久久久久久久色| 国产尤物在线观看| 久久精品免费在线观看| 麻豆tv在线播放| 成人在线视频国产| 在线视频免费一区二区| 青青操免费在线视频| 激情综合网激情| 日韩欧美在线电影| av日韩电影| 亚洲国产精品久久| 欧美日韩一级在线观看| 久久精品国产在热久久| 日韩av电影免费播放| 老牛影视精品| 亚洲第一福利在线观看| 欧美成人片在线观看| 激情综合亚洲精品| 亚洲精品一区国产精品| 国产亚洲一区二区手机在线观看| 亚洲精品国产欧美| 国产精品第108页| 国产成人丝袜美腿| 日本a在线天堂| 欧美特黄不卡| 美日韩精品免费视频| 97在线公开视频| 中文字幕欧美一| 亚洲午夜激情影院| 久久在线视频免费观看| 国产精品吴梦梦| 在线免费av电影| 欧美三级日韩在线| 91av手机在线| 精品无人码麻豆乱码1区2区 | 韩国久久久久| 99国产在线视频| 午夜影院免费在线| 日韩欧美在线观看一区二区三区| 亚洲国产精品免费在线观看| 精品亚洲国产成人av制服丝袜| 一区二区三区偷拍| 91精品国产一区二区在线观看| 精品国内亚洲在观看18黄| 一卡二卡在线视频| 亚洲视频在线观看一区| avtt中文字幕| 亚洲精品视频啊美女在线直播| 国产女主播一区二区三区| cao在线视频| 亚洲美女免费精品视频在线观看| 免费又黄又爽又猛大片午夜| 中文成人综合网| 中文字幕色网站| 亚洲无线视频| 免费国产在线精品一区二区三区| 婷婷午夜社区一区| 神马国产精品影院av| 国产情侣激情自拍| 亚洲国产成人高清精品| 捆绑凌虐一区二区三区| 天使萌一区二区三区免费观看| 亚洲欧美日韩国产yyy| 国产色99精品9i| 韩国精品久久久999| 九一国产在线| 这里只有精品视频在线观看| 久久午夜无码鲁丝片| 久久久久国产精品免费免费搜索| www.com黄色片| 黄色亚洲在线| 日本一区二区三区四区在线观看| 日日夜夜亚洲精品| 国内揄拍国内精品| 91青青在线视频| 欧美精品一区二区三区蜜臀| 中文字幕av第一页| 尤物在线观看一区| 波多野结衣av在线观看| 国产福利一区在线观看| 六月激情综合网| 亚洲成人av| 久久天天狠狠| 日本精品在线播放| 国产精品国语对白| 波多野结衣久久| 日韩在线精品一区| 爽爽视频在线观看| 91精品国产黑色紧身裤美女| 欧美h在线观看| 亚洲精品午夜久久久| 野外性满足hd| 懂色av一区二区在线播放| 欧美日韩怡红院| 亚洲精选一区| 在线观看成人免费| 国产一区二区观看| 国产在线精品一区二区三区》| 亚洲一区二区三区久久久| 欧美在线免费视频| 午夜av在线播放| 日日骚av一区| 国产午夜在线视频| 日韩av在线最新| 亚洲精品中文字幕成人片| 欧美日韩国产区一| 一级黄色在线视频| 午夜视频在线观看一区二区三区| 欧美成人777| 国产精品视频一区二区三区不卡| 国产夫妻性爱视频| 国产aⅴ综合色| 日本一二三四区视频| 日本vs亚洲vs韩国一区三区二区 | 精精国产xxxx视频在线野外| 欧美xxxx14xxxxx性爽| 69视频在线| 亚洲色图在线观看| 欧美捆绑视频| 精品一区二区三区四区| 人妻一区二区三区| 日韩欧美中文字幕一区| 国产色综合视频| 制服丝袜亚洲网站| 91午夜交换视频| 欧美日韩一级二级| 亚洲一区二区人妻| 欧美日韩精品欧美日韩精品一 | 欧美成人三级视频| 亚洲免费观看在线视频| 国产精品视频一区二区三| 国产精品久久久久久一区二区三区 | 成人av综合在线| 国产精品熟妇一区二区三区四区| 国产精品18久久久久| 男插女视频网站| 国产福利一区二区三区在线视频| 亚洲911精品成人18网站| 福利一区在线观看| 永久免费未满蜜桃| gogogo免费视频观看亚洲一| 久久久午夜精品福利内容| www.亚洲色图.com| 国产又爽又黄无码无遮挡在线观看| 99国产精品国产精品毛片| 无码人妻精品一区二区三区温州 | 久久伊人资源站| 天天操综合520| 日本精品视频一区| 日韩一区二区中文| 老汉色影院首页| 国产精品chinese| 国产3p露脸普通话对白| 香蕉成人久久| 性chinese极品按摩| 国产一区二区久久| 成人在线电影网站| 久久久久高清精品| 女人裸体性做爰全过| 一区二区三区欧美| 你懂的国产视频| 欧美日韩一区 二区 三区 久久精品| 国产又粗又猛又黄又爽无遮挡| 日韩美女视频一区二区在线观看| 性xxxfllreexxx少妇| 伊人成人开心激情综合网| 免费黄网站在线播放| 欧美国产一区二区三区| 超碰超碰人人人人精品| 成人av在线网址| 国产一区二区在线视频你懂的| 日韩在线三级| 国精品一区二区三区| 亚洲视频在线观看一区二区三区| 国产在线不卡视频| 国产精品嫩草av| 中文字幕在线不卡视频| 欧美成人精品欧美一级乱黄| 欧美视频三区在线播放| www.四虎在线观看| 国产亚洲美女久久| 久草在线视频网站| 国产精品视频内| 日韩伦理一区二区三区| 综合久久国产| 午夜在线a亚洲v天堂网2018| 亚洲精品中文字幕乱码无线| 久久亚洲精品小早川怜子| 日日骚一区二区三区| 一本到一区二区三区| 性生活视频软件| 主播福利视频一区| 久热在线观看视频| 91在线看网站| 久久伦理在线| 99精品免费在线观看| 国产99久久精品| 羞羞在线观看视频| 色综合天天综合在线视频| 亚洲第一天堂网| 久久久精品一区二区三区| 欧美第一视频| 精品亚洲一区二区三区四区五区高| 久久精品青草| 日本肉体xxxx裸体xxx免费| 2023国产一二三区日本精品2022| 少妇影院在线观看| 欧美日韩视频一区二区| 国产在线中文字幕| 欧美亚洲国产视频| 国产图片一区| 日本大片免费看| 国产在线精品免费| 亚洲色图27p| 欧美伊人久久大香线蕉综合69 | 久久成人18免费网站| 成人av色网站| 日韩欧美视频第二区| 性高湖久久久久久久久| 亚洲av成人片无码| 亚洲在线一区二区三区| av免费观看在线| 久久天天躁日日躁| 亚洲国产综合在线观看| 日本一区二区三区www| 日韩高清不卡一区| 69视频在线观看免费| 色婷婷综合视频在线观看| 三区在线视频| 欧美怡春院一区二区三区| 久久中文字幕导航| 浮妇高潮喷白浆视频| 成人不卡免费av| 日韩三级小视频| 日韩av在线导航| 中日韩脚交footjobhd| 久久天天狠狠| 日本va欧美va瓶| 开心激情五月网| 欧美一区二区三区公司| 手机电影在线观看| 国产精品久久精品视| 99精品视频免费全部在线| 国产福利短视频| 在线观看日产精品| 1024免费在线视频| 91香蕉电影院| 精品动漫一区| 六月婷婷七月丁香| 欧美日韩性生活| 国产婷婷视频在线 | 精品日韩欧美一区| 亚洲另类第一页| 一区二区三区影院| 天天躁日日躁狠狠躁喷水| 日本成人黄色片| 色综合咪咪久久网| 中文字幕一二三| 精品国产户外野外| 最新国产在线观看| av免费观看久久| 丝袜美腿亚洲综合| 日韩精品一区二区亚洲av性色| 欧美xxxx在线观看| 免费v片在线观看| 亚洲一区二区在线免费观看| 国产精品自拍毛片| 国产一级做a爱片久久毛片a| 这里只有精品久久| 一区二区三区高清在线观看| 免费观看精品视频| 综合激情成人伊人| 五月天婷婷社区| 成人中文字幕在线观看| 亚洲狼人精品一区二区三区| 国产又粗又黄又猛| 欧美精品一区二区三区一线天视频| 日韩天堂在线| 国产一级不卡视频| 欧美国产激情二区三区 | 亚洲日本中文| 91九色丨porny丨国产jk| 中文字幕欧美激情| 人妻偷人精品一区二区三区| 国产精品视频999| 夜夜嗨一区二区| 国产激情无码一区二区三区|