Существует проблема с последней строкой внутри функции txtAgeBlur
. Почему я не могу удалить дочерний узел следующим образом?Почему удаление дочернего элемента вроде этого не работает?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Forms</title>
</head>
<body>
<form action="" name="form1">
<p>
Name
<input type="text" name="txtName">
</p>
<p>
Age
<input type="text" name="txtAge" size="3" maxlength="3"> \t
</p>
<p>
<input type="button" value="Check details" name="btnCheckForm">
</p>
</form>
<script>
var myForm = document.form1;
function btnCheckFormClick(e) {
var name = myForm.txtName.value;
var age = myForm.txtAge.value;
if (name === "" || age === "") {
alert("Please complete all of the form");
if (name === "")
myForm.txtName.focus();
else
myForm.txtAge.focus();
}
else
alert("Thanks for completing the form " + name);
}
var messageInserted = false;
function txtAgeBlur(e) {
//console.log(e.type);
var target = e.target;
var msg = document.createElement("span");
msg.id = "msg";
msg.appendChild(document.createTextNode("Please enter a valid age"));
if (isNaN(target.value)) {
if (!messageInserted) {
messageInserted = true;
target.parentElement.appendChild(msg);
}
target.focus();
target.select();
}
else if (messageInserted === true)
document.getElementsByTagName("p")[1].removeChild(msg); //problem
}
myForm.btnCheckForm.addEventListener("click", btnCheckFormClick);
myForm.txtAge.addEventListener("blur", txtAgeBlur);
</script>
</body>
</html>
Однако это удаляет дочерний элемент без каких-либо проблем. В чем разница между этим и приведенным выше примером?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Forms</title>
</head>
<body>
<script>
var msg = document.createElement("span");
msg.appendChild(document.createTextNode("Please enter a valid age"));
document.body.appendChild(msg);
var msg2 = document.querySelector("span");
console.log(msg === msg2);
document.body.removeChild(msg);
</script>
</body>
</html>
* МВП * ссылается на новый текстовый узел, который вы создали, а не предыдущий. Вы можете рассмотреть 'msg.parentNode.removeChild (msg)' во втором случае. – RobG
Почему они не то же самое? Во втором примере узел, назначенный переменной 'msg', кажется тем же самым узлом, который я создал с помощью' document.body.appendChild (msg); '. 'Console.log (msg === msg2);' сравнение возвращает 'true'. Почему в первом примере это не так? Я новичок, и я не могу понять разницу. – Peter
Функция txtAgeBlur вызывается каждый раз, когда вы покидаете поле возраста. Это означает, что во второй раз, когда вы его вызываете, переменная msg ссылается на новый текстовый индекс, как упоминал Роб, а не на текстовый узел в dom. Причина, по которой ваш второй пример работает, заключается в том, что переменная msg все еще ссылается на узел, который был вставлен в dom. –