æä»¬ç createWritable()
æ¨¡å¼æµè¯ç¤ºä¾æä¾äºä¸ä¸ª <button>
æ¥éæ©è¦åå
¥çæä»¶ï¼ä¸ä¸ªææ¬ <input>
åæ®µï¼ä½ å¯ä»¥å¨å
¶ä¸è¾å
¥ä¸äºè¦åå
¥æä»¶çææ¬ï¼ä»¥å第äºä¸ª <button>
æ¥å°ææ¬åå
¥æä»¶ã
å¨ä¸é¢çæ¼ç¤ºä¸ï¼å°è¯éæ©æä»¶ç³»ç»ä¸çææ¬æä»¶ï¼æè¾å ¥æ°æä»¶åï¼ï¼å¨è¾å ¥å段ä¸è¾å ¥ä¸äºææ¬ï¼ç¶åå°ææ¬åå ¥æä»¶ãæå¼æä»¶ç³»ç»ä¸çæä»¶ä»¥æ£æ¥åå ¥æ¯å¦æåã
æ¤å¤ï¼å°è¯åæ¶å¨ä¸¤ä¸ªæµè§å¨æ ç¾é¡µä¸æå¼é¡µé¢ãå¨ç¬¬ä¸ä¸ªæ ç¾é¡µä¸éæ©è¦åå
¥çæä»¶ï¼ç¶åç«å³å°è¯å¨ç¬¬äºä¸ªæ ç¾é¡µä¸éæ©è¦åå
¥çå䏿件ãä½ åºè¯¥ä¼æ¶å°ä¸æ¡éè¯¯æ¶æ¯ï¼å 为æä»¬å¨ createWritable()
è°ç¨ä¸è®¾ç½®äº mode: "exclusive"
ã
ä¸é¢æä»¬å°æ¢ç´¢ä»£ç ã
HTML两个 <button>
å
ç´ åææ¬ <input>
åæ®µå¦ä¸æç¤ºï¼
<ol>
<li>éæ©è¦åå
¥çæä»¶ï¼<button class="select">éæ©æä»¶</button></li>
<li>
<label for="file-text">è¾å
¥è¦åå
¥æä»¶çææ¬ï¼</label>
<input type="text" id="file-text" name="file-text" disabled />
</li>
<li>å°ä½ çææ¬åå
¥æä»¶ï¼<button class="write" disabled>åå
¥ææ¬</button></li>
</ol>
ææ¬è¾å
¥å段ååå
¥ææ¬æé®æåéè¿ disabled
屿§è®¾ç½®ä¸ºç¦ç¨ââç´å°ç¨æ·éæ©è¦åå
¥çæä»¶æ¶ï¼å®ä»¬æåºè¢«ä½¿ç¨ã
li {
margin-bottom: 10px;
}
JavaScript
æä»¬é¦å
è·å坹鿩æä»¶æé®ãåå
¥ææ¬æé®åææ¬è¾å
¥å段çå¼ç¨ãæä»¬è¿å£°æä¸ä¸ªå
¨å±åé writableStream
ï¼å®å°åå¨å¯¹å¯åæµçå¼ç¨ï¼ç¨äºå¨å建åå°ææ¬åå
¥æä»¶ãæä»¬æåå°å
¶è®¾ç½®ä¸º null
ã
const selectBtn = document.querySelector(".select");
const writeBtn = document.querySelector(".write");
const fileText = document.querySelector("#file-text");
let writableStream = null;
æ¥ä¸æ¥ï¼æä»¬å建ä¸ä¸ªå为 selectFile()
ç弿¥å½æ°ï¼å½æä¸éæ©æé®æ¶ï¼æä»¬å°è°ç¨è¯¥å½æ°ãå®ä½¿ç¨ Window.showSaveFilePicker()
æ¹æ³åç¨æ·æ¾ç¤ºæä»¶éæ©å¨å¯¹è¯æ¡ï¼å¹¶ä¸ºä»ä»¬éæ©çæä»¶å建æä»¶å¥æãå¨è¯¥å¥æä¸ï¼æä»¬è°ç¨ createWritable()
æ¹æ³æ¥å建ä¸ä¸ªæµï¼ä»¥å°ææ¬åå
¥æéæä»¶ã妿è°ç¨å¤±è´¥ï¼æä»¬ä¼å°é误记å½å°æ§å¶å°ã
æä»¬å createWritable()
ä¼ éä¸ä¸ªå
å«ä»¥ä¸é项çé项对象ï¼
keepExistingData: true
ï¼å¦ææéæä»¶å·²åå¨ï¼åå¨å¼å§åå
¥ä¹åï¼å°å
¶ä¸å
å«çæ°æ®å¤å¶å°ä¸´æ¶æä»¶ä¸ã
mode: "exclusive"
ï¼è¡¨ç¤ºåªè½åæ¶å¨æä»¶å¥æä¸æå¼ä¸ä¸ªåå
¥å¨ãå¦æç¬¬äºä¸ªç¨æ·å 载示ä¾å¹¶å°è¯éæ©æä»¶ï¼ä»ä»¬å°æ¶å°é误ã
æåï¼æä»¬å¯ç¨è¾å ¥å段ååææ¬æé®ï¼å 为å®ä»¬æ¯ä¸ä¸æ¥æéè¦çï¼å¹¶ç¦ç¨éæ©æä»¶æé®ï¼ç®åä¸éè¦ï¼ã
async function selectFile() {
// å建æ°å¥æ
const handle = await window.showSaveFilePicker();
// å建 FileSystemWritableFileStream æ¥åå
¥
try {
writableStream = await handle.createWritable({
keepExistingData: true,
mode: "exclusive",
});
} catch (e) {
if (e.name === "NoModificationAllowedError") {
console.log(`ä½ ç°å¨æ æ³è®¿é®è¯¥æä»¶ï¼å
¶ä»äººæ£å¨å°è¯ä¿®æ¹å®ã请ç¨åéè¯ã`);
} else {
console.log(e.message);
}
}
// å¯ç¨ææ¬å段ååå
¥æé®ï¼ç¦ç¨éæ©æé®
fileText.disabled = false;
writeBtn.disabled = false;
selectBtn.disabled = true;
}
æä»¬çä¸ä¸ä¸ªå½æ° writeFile()
ä½¿ç¨ FileSystemWritableFileStream.write()
å°è¾å
¥å段ä¸è¾å
¥çææ¬åå
¥æéæä»¶ï¼ç¶åæ¸
空è¾å
¥å段ãç¶åæä»¬ä½¿ç¨ WritableStream.close()
å
³éå¯åæµï¼å¹¶éç½®æ¼ç¤ºä»¥ä¾¿å次è¿è¡ââæ§ä»¶ç disable
ç¶æåæ¢åå
¶åå§ç¶æï¼å¹¶ä¸ writableStream
åé设置å null
ã
async function writeFile() {
// å°ææ¬åå
¥æä»¬çæä»¶å¹¶æ¸
ç©ºææ¬åæ®µ
await writableStream.write(fileText.value);
fileText.value = "";
// å
³éæä»¶å¹¶å°å
容åå
¥ç£çã
await writableStream.close();
// ç¦ç¨ææ¬å段ååå
¥æé®ï¼å¯ç¨éæ©æé®
fileText.disabled = true;
writeBtn.disabled = true;
selectBtn.disabled = false;
// å° writeableStream éæ°è®¾ç½®ä¸º null
writableStream = null;
}
为äºä½¿æ¼ç¤ºè¿è¡ï¼æä»¬å¨æé®ä¸è®¾ç½®äºäºä»¶çå¬å¨ï¼ä»¥ä¾¿å¨æ¯ä¸ªæé®è¢«ç¹å»æ¶è¿è¡ç¸å ³ç彿°ã
selectBtn.addEventListener("click", selectFile);
writeBtn.addEventListener("click", writeFile);
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4