簡體   English   中英

為什么輸入值不會更新? 當我點擊發送按鈕時?

[英]Why the input value wont update ? when i click the send button?

我嘗試運行它第一次工作的代碼,但在第二次它不會工作我不知道為什么? 我想以一種我可以一遍又一遍地發送多條消息的方式做到這一點

 var message = document.querySelector('.container'); var btn = document.getElementById('btn'); var inpt = document.getElementById('txt'); function AddMessage() { if (String(inpt.value) != '' && isNaN(inpt.value) == true) { message.innerHTML += `<p>${inpt.value} </p>`; inpt.value = ''; } }
 input { outline: none; }
 <div class="container"> <input type="text" value="" id="txt"> <button id="btn" onclick="AddMessage()">send</button> <p>whats your name ?</p> </div>

由於您的輸出元素是所有其他元素的包裝器,因此當您這樣做時,您將覆蓋所有這些元素:

message.innerHTML += `<p>${inpt.value} </p>`;

在視覺上(甚至可能直觀地)這沒有明顯的效果。 但它所做的是創建不再對應於您的btninpt變量的全新元素。 這使您與不代表屏幕上任何內容的陳舊對象進行交互。

可能最簡單的方法是創建一個更具體的輸出元素。 例如,在容器中添加另一個<div>並輸出:

 var message = document.getElementById('message'); // reference new element var btn = document.getElementById('btn'); var inpt = document.getElementById('txt'); function AddMessage() { if (String(inpt.value) != '' && isNaN(inpt.value) == true) { message.innerHTML += `<p>${inpt.value} </p>`; inpt.value = ''; } }
 input { outline: none; }
 <div class="container"> <input type="text" value="" id="txt"> <button id="btn" onclick="AddMessage()">send</button> <p>whats your name ?</p> <div id="message"></div> <!-- new element --> </div>

這一行message.innerHTML += ...

等於message.innerHTML = message.innerHTML + ... ,它為message.innerHTML分配了一些新的東西,換句話說,它重寫了內容,因此btn and inpt的引用丟失了,原件被覆蓋了。

 var message = document.querySelector('.container'); var btn = document.getElementById('btn'); var inpt = document.getElementById('txt'); var output = document.getElementById('output'); function AddMessage() { console.log('addMessage') if (String(inpt.value) != '' && isNaN(inpt.value) == true) { output.innerText=inpt.value; inpt.value = '' } }
 input { outline: none; }
 <div class="container"> <input type="text" value="" id="txt" placeholder="write your message here"> <button id="btn" onclick="AddMessage()">send</button> <p>whats your name ?</p> <p id="output"></p> </div>

.innerHTML的問題

您正在分配給.innerHTML 這會重新創建元素的后代(請參閱innerHTML "On setting..." ):

 const oldReference = document.getElementById("element"); document.body.innerHTML += ""; // Assigning to innerHTML const newReference = document.getElementById("element"); const isSameElement = oldReference === newReference; console.log({ isSameElement });
 <div id="element">

如您所見,舊的引用btninpt不會是當前在 DOM 中的元素。

旁注:解析.innerHTML可能非常耗時,並且將其與用戶輸入一起使用是一個安全問題

安全注意事項

特別是對於用戶輸入,您不應該使用.innerHTML ,因為這是一種將腳本插入網頁的簡單方法:

 document.body.addEventListener("click", evt => { if (!evt.target.closest("button")) return; const input = document.querySelector("input"); document.body.innerHTML += input.value; });
 pre{padding:2px 4px;border:1px solid;width:min-content}
 <input><button>Insert</button> <p>Try to input this:</p> <pre><code>&lt;img src="" onerror="console.log('any script here!')"></code></pre> <p>Then look into your browser console.

.innerHTML的替代品

如果要添加元素,可以使用document.createElement()Element.append()Node.textContent

 const input = document.querySelector("input"); document.querySelector("button").addEventListener("click", evt => { const p = document.createElement("p"); p.textContent = input.value; document.body.append(p); input.value = ""; const currentInput = document.querySelector("input"); console.log("Is same input?", input === currentInput); });
 <input><button>Insert</button> <p>Also try adding some HTML, for example: <code>&lt;span>Test&lt;/span>

您只能更新內部 html 以獲取答案,而不是帶有輸入的完整塊

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <style> input{ outline: none; } </style> <div class="container"> <input type="text" value="" id="txt"> <button id="btn" onclick="AddMessage()">send</button> <p>whats your name ?</p> <p id="answer"></p> </div> <script> var message = document.querySelector('.container'); var btn = document.getElementById('btn'); var inpt = document.getElementById('txt'); var answer = document.getElementById('answer'); function AddMessage(){ if( String(inpt.value) != '' && isNaN(inpt.value) == true ) { answer.innerHTML = `<p>${inpt.value} </p>`; inpt.value = ''; } } </script> </body> </html>


 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <style> input{ outline: none; } </style> <div class="container"> <input type="text" value="" id="txt" name="txt"> <button id="btn" onclick="AddMessage()">send</button> <p>whats your name ?</p> <ul id="list"> </ul> </div> <script> var message = document.querySelector('.container'); var btn = document.getElementById('btn'); var inpt = document.getElementById('txt'); var list = document.getElementById('list'); let myList = ""; function AddMessage(){ if( String(inpt.value) !== '' && isNaN(inpt.value) == true ) { myList +=`<li>${inpt.value}</li>`; list.innerHTML = myList; } } </script> </body> </html>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM