30 個有用的 JavaScript 代碼片段(上)
在過去的幾個月里,我在開發離線瀏覽器工具時,我自己反復搜索我的JavaScript 文件以檢索舊的代碼片段。
因此,我認為使用以下常用 JavaScript 方法的編譯列表作為參考可能會讓那些與我有類似用例的其他人受益。
我總共整理了30個我認為比較有用的 JavaScript 代碼段,因為文章篇幅的原因,我分了上下兩篇,今天這篇文章中有12個代碼段,剩下的18個在下篇內容中跟大家分享。
1.文件內容上傳
var selectContent=document.getElementById("selectContent");
var contentForSelection=document.getElementById("contentForSelection");selectContent.onchange=function(e) {
if (!window.FileReader) {
alert("Your browser does not support HTML5 'FileReader' function required to open a file.");
} else {
let fileis = this.files[0];
let fileredr = new FileReader();
fileredr.onload = function (fle) {
let filecont = fle.target.result;
contentForSelection.value=filecont;
};
//fileredr.readAsArrayBuffer(fileis);
fileredr.readAsText(fileis);
}
};
在上面的示例中,由于我選擇導入的文件是文本格式,因此使用方法 readAsText 而不是 readAsArrayBuffer。使用 readAsArrayBuffer 的實例包括讀取圖像流或讀取 ZIP 存檔文件。成功導入后,文件內容將自動呈現到元素 id 為“contentForSelection”的文本區域中。
2. 保存文件內容
var saveBtn=document.getElementById("saveBtn");
var cnotallow=document.getElementById("contentForSelection");
saveBtn.notallow=function() {
let txtCnotallow=contentForSelection.value;
if (!window.Blob) {
alert("Your browser does not support HTML5 'Blob' function required to save a file.");
} else {
let textblob = new Blob([txtContent], {
type: "text/plain"
});
let dwnlnk = document.createElement("a");
dwnlnk.download = "output.txt";
dwnlnk.innerHTML = "Download File";
if (window.webkitURL != null) {
dwnlnk.href = window.webkitURL.createObjectURL(textblob);
}
dwnlnk.click();
}
};
上述代碼片段通常在在線筆記應用程序中實現,以便用戶導出其輸出。或者,在數據/代碼格式化程序等網絡實用程序中,通常也會提供[保存]功能,以允許用戶將后續格式化的文本內容保存到本地存儲文件中。
3.復制到剪貼板
復制到剪貼板是基于瀏覽器的設置中的另一個經典功能。通常,如果轉換后的輸出僅用于 1-Off 任務,則無需將輸出保存到文件,而使用以下 JS 代碼片段會更合適:
var copyBtn=document.getElementById("copyBtn");
var cnotallow=document.getElementById("contentForSelection");
copyBtn.notallow=function(evt) {
copyBtn.nextElementSibling.innerHTML="";
copyTransformedOutput("contentForSelection");
let smallEle=evt.currentTarget.nextElementSibling;
smallEle.innerHTML="<span style='color:green'> Copied to Clipboard!</span>";
};
function copyTransformedOutput(inputEleId) {
let copyText = document.getElementById(inputEleId);
copyText.select();
copyText.setSelectionRange(0, 99999); /* For mobile devices */
navigator.clipboard.writeText(copyText.value);
}
請注意,我選擇在成功復制代碼片段后顯示一條消息“已復制到剪貼板”。
因此,轉換后的輸出隨后可以粘貼到其他地方,而無需存儲到本地文件中以供使用。
4.查找并替換全部
雖然在最新的 JavaScript 控制臺中,此功能當前是內置的,但由于其實現的獨創性和簡單性,了解以下 JavaScript 函數仍然是相關且有用的:
function replaceAll(inputStr,toReplace,replaceWith) {
return inputStr.split(toReplace).join(replaceWith);
}
例如,如果我想在文本區域中將“id”替換為“ID”:
代碼片段的其余部分如下:
var replaceBtn=document.getElementById("replaceBtn");
replaceBtn.notallow=function() {
let toFind=document.getElementById("ToFind").value;
let replaceWith=document.getElementById("ReplaceWith").value;
contentForSelection.value=replaceAll(contentForSelection.value,toFind,replaceWith);
};
5. 生成隨機十六進制顏色
我發現這種 JavaScript 方法沒有得到充分重視的一種情況是,當我必須將多條駕駛路線渲染到同一個 Web 應用程序上時:
顯然微分了一個無限數。具有不同顏色的重疊駕駛路線對于任何觀看者來說都更容易比較和對比地圖可視化上顯示的各種路線。因此,動態生成不同的顏色是必要的,可以通過以下方式實現:
function generateRandomHexColor() {
let colorGenerated="#" + (Math.random() * 0xfffff * 1000000).toString(16).slice(0, 6);
if(colorGenerated !== "#0000ff" && colorGenerated !== "#ff0000") {
return colorGenerated;
}
colorGenerated="#" + (Math.random() * 0xfffff * 1000000).toString(16).slice(0, 6);
}
6. 突出顯示 JSON 語法
對于地圖服務提供商返回的每條路線,我都合并了路線 JSON 數據輸出的導出功能。因此,為了區分 JSON 對象中的 String、Float、Integer、Boolean 等對象類型,我選擇對其進行顏色編碼,如下所示:
上述效果可以通過CSS和JavaScript來實現。
JavaScript 代碼:
function syntaxHighlight(json) {
json = json.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
var cls = "number";
if (/^"/.test(match)) {
if (/:$/.test(match)) {
cls = "key";
} else {
cls = "string";
}
} else if (/true|false/.test(match)) {
cls = "boolean";
} else if (/null/.test(match)) {
cls = "null";
}
return "<span class='" + cls + "'>" + match + "</span>";
});
}
CSS代碼:
.string {
color: green;
}
.number {
color: darkorange;
}
.boolean {
color: blue;
}
.null {
color: magenta;
}
.key {
color: red;
}
7. 通知未保存的更改
window.addEventListener('beforeunload', (event) => {
event.preventDefault();
event.returnValue = '';
});
上面的代碼片段對于用戶在輸入字段中輸入了未保存的數據并且在頁面卸載時會丟失的情況特別有用。在上圖中,用戶上傳多個圖像文件后,瀏覽器會提示用戶是否已保存圖像輸出以防止數據丟失。
8. 異步上傳多個文件
function readFileAsB64(file) {
return new Promise((resolve,reject) => {
let fileredr = new FileReader();
fileredr.onload = () => resolve([fileredr.result, file.name]);
fileredr.onerror = (err) => reject(err);
fileredr.readAsDataURL(file);
});
}
var uploadFile=document.getElementById('uploadFile'); // input[type='file']
uploadFile.addEventListener('change', (ev) => {
if (!window.FileReader) {
alert('Your browser does not support HTML5 "FileReader" function required to open a file.');
} else {
let filesArr=ev.target.files;
let fileReaders=[];
for(let f in filesArr) {
if(!isNaN(f)) fileReaders.push(readFileAsB64(filesArr[f]))
}
Promise.all(fileReaders).then((outputArrs) => {
for(let o in outputArrs) {
if(!isNaN(o)) {
let fileArr=outputArrs[o]; // [fileredr.result, file.name]
/* TO DO LOGIC HERE */
let image = new Image();
image.src = fileArr[0];
image.title = fileArr[1];
image.height = 100;
document.body.appendChild(image);
}
}
});
}
});
上面的代碼片段確保在瀏覽器繼續執行注釋后的代碼邏輯之前,所有上傳的圖像文件都已編碼為 Base64 字符串(fileredr.readAsDataURL(file);):
/* TO DO LOGIC HERE */
9. insertAdjacentHTML — 開始之前 | 開始之后 | 前言 | 尾聲
回顧第 1) 點中的屏幕截圖,可以通過 insertAdjacentHTML(<position>,<HTML String>) 將 HTML 附加到元素:
<Element>.insertAdjacentHTML('beforeend'|'afterbegin'|'beforeend'|'afterend', <HTML String>);
下面是每個選項相對于 <Element>(即 <p></p>)所指的位置的說明:
<!-- beforebegin -->
<p>
<!-- afterbegin -->
foo
<!-- beforeend -->
</p>
<!-- afterend -->
由于在第 1 點)中,目標是附加額外的表行 (<tr></tr>),因此使用了 beforeend 位置。
10. 檢查 JSON 字符串是否有效
由于我在業余時間創建的大多數離線瀏覽器實用程序都要求用戶上傳數據文件,其中一些文件需要為 JSON 格式,因此這是一種對 JSON 文件進行數據格式驗證檢查的簡單直接的方法是:
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
// returns a Boolean
11. 將原始 HTML 字符串編碼為 Unicode 實體
function encodeHTMLChars(rawStr) {
return rawStr.replace(/[\u00A0-\u9999<>\&]/g, ((i) => `&#${i.charCodeAt(0)};`));
}
要將文本 <img> 顯示到 HTML 頁面上,必須按如下方式對字符串進行編碼:
var inputHTMLStr='<img>';
var encodedHTMLStr=encodeHTMLChars(inputHTMLStr);
console.log(encodedHTMLStr);
// Output: <img>
當需要在網頁上顯示 HTML 代碼片段時,這通常會派上用場,因為其原始形式(即“<img>”)會被瀏覽器自動解釋為 HTML DOM 元素,而不是用于顯示的原始文本。
12. 將 XML 轉換為 JSON
2 個最未被充分利用的 JavaScript API 包括:DOMParser() 和 DOMParser.parseFromString()
盡管 xml-js 和 xml2js 等 npm 包很容易獲得,但該邏輯可以通過純 JavaScript 實現,如下所示:
function convertXMLtoJSON(xmlObj) { // adapted from https://davidwalsh.name/convert-xml-json
var obj = {};
if (xmlObj.nodeType == 1) {
if (xmlObj.attributes.length > 0) {
obj['@attributes'] = {};
for (var j = 0; j < xmlObj.attributes.length; j++) {
var attribute = xmlObj.attributes.item(j);
obj['@attributes'][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xmlObj.nodeType == 3) {
obj = xmlObj.nodeValue;
}
// Iterate through all child nodes
// Use recursive to assign nested nodes
if (xmlObj.hasChildNodes()) {
for(var i = 0; i < xmlObj.childNodes.length; i++) {
var item = xmlObj.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof(obj[nodeName])==='undefined') {
obj[nodeName] = convertXMLtoJSON(item);
} else {
if (typeof(obj[nodeName].push)==='undefined') {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(convertXMLtoJSON(item));
}
}
}
return obj;
}
/* USAGE: Sample xmlText */
var xmlText = '<bookstore><book>' +
'<title>Everyday Italian</title>' +
'<author>Giada De Laurentiis</author>' +
'<year>2005</year>' +
'</book></bookstore>';
var xmlParser=new DOMParser();
var xmlObj=xmlParser.parseFromString(xmlText, 'text/xml');
var jsnotallow=convertXMLtoJSON(xmlObj);
console.log(jsonObj);
// Output: {"bookstore":{"book":{"title":{"#text":"Everyday Italian"},"author":{"#text":"Giada De Laurentiis"},"year":{"#text":"2005"}}}}
聲明:上述代碼邏輯最初由 David Walsh 在 Convert XML to JSON 中實現。
我認為有用且值得分享,所以就把它加載進來了。
總結
以上就是我今天這篇文章想與你分享的30個有用的JavaScript 代碼片段中的前面12個代碼段,剩下的18個將在下篇文章中與你分享。
今天內容到此結束,希望對你有所幫助,最后,感謝你的閱讀。