[英]How to add innerHTML to class on mouseover?
当我在 hover 上时,我想将 innerHTML 添加到我的 class 而不更改文本。
例如,我有一个带有 class="food" 的<p>
元素列表,当我使用 hover 它时,我希望它从说“Chicken”到“Chicken [EAT]”到 go。
这是我到目前为止所拥有的,但是当我 hover 段落时,它按预期更改为最后一个食物项目。
var food = document.getElementsByClassName("food"); var len = food.length; for (i = 0; i < len; i++) { addEvent(food[i]); var foodName = food[i].innerHTML; function addEvent(food) { food.addEventListener("mouseover", function(event) { event.target.innerHTML = foodName + " [EAT]"; }); } }
<p class="food">Snackbar</p> <p class="food">Apple</p> <p class="food">Pear</p> <p class="food">Chicken</p> <p class="food">Peas</p>
第一步var foodName = food.textContent;
在 addEvent 里面
也不要在循环内声明函数(不是问题的原因,但不是好的做法)
也使用 textContent 而不是 innerHTML
var food = document.getElementsByClassName("food"); var len = food.length; function addEvent(food){ var foodName = food.textContent; food.addEventListener("mouseover", function(event){ event.target.textContent = foodName + " [EAT]"; }); } for( i = 0; i < len; i++){ addEvent(food[i]); }
<p class="food">Snackbar</p> <p class="food">Apple</p> <p class="food">Pear</p> <p class="food">Chicken</p> <p class="food">Peas</p>
如果您只想显示“[EAT]”,您可以使用 CSS 轻松完成,无需 JS:
.food:hover::after { content: " [EAT]"; }
<p class="food">Snackbar</p> <p class="food">Apple</p> <p class="food">Pear</p> <p class="food">Chicken</p> <p class="food">Peas</p>
var food = document.getElementsByClassName("food"); var len = food.length; for (i = 0; i < len; i++) { addEvent(food[i]); var foodName = food[i].innerHTML; function addEvent(food) { food.addEventListener("mouseover", function(event) { event.target.innerHTML = event.target.innerHTML+ " [EAT]"; }); food.addEventListener("mouseleave", function(event){ event.target.innerHTML = event.target.innerHTML.replace(" [EAT]",''); }); } }
<p class="food">Snackbar</p> <p class="food">Apple</p> <p class="food">Pear</p> <p class="food">Chicken</p> <p class="food">Peas</p>
这最终是因为范围界定问题。 您在 for 循环中调用了一个方法,但是您引用了一个范围为封闭 function 的变量,或者在这种情况下是全局变量,因为没有 function (请参阅注释),因此分配的最终值是最后一次传递for 循环。 将var foodName
的声明更改为let foodName
也可以通过将变量限定为循环来解决问题。 另一种选择是将您需要的内容传递给addEvent
并将 function 移出 for 循环。
var food = document.getElementsByClassName("food"); var len = food.length; for (i = 0; i < len; i++) { var foodName = food[i].innerHTML; addEvent(food[i], foodName); } function addEvent(food, name) { food.addEventListener("mouseover", function(event) { event.target.innerHTML = name + " [EAT]"; }); }
<p class="food">Snackbar</p> <p class="food">Apple</p> <p class="food">Pear</p> <p class="food">Chicken</p> <p class="food">Peas</p>
你这么近! 问题是您在闭环问题中遇到了经典变量。 您的一个i
变量在循环的所有迭代中都被共享,并且因为您的鼠标悬停回调 function 引用i
,所以该变量不会被垃圾收集并保留在 memory 中,只要具有 mouseoever 回调的 DOM 元素位于 ZC1C425268E68385D1AB5074C17A94F100 而且因为回调在循环完成后才会运行,所以它们都引用循环完成时的相同i
值,这就是为什么你总是得到最后一个食物的原因。
只需将变量声明从var
更改为let
即可解决问题。 let
创建“块级” scope - 循环的每次迭代都会为循环变量创建自己的 scope,因此不是所有迭代共享相同的i
值,而是每次迭代都有自己的i
值。
var food = document.getElementsByClassName("food"); var len = food.length; for (i = 0; i < len; i++) { addEvent(food[i]); let foodName = food[i].innerHTML; function addEvent(food) { food.addEventListener("mouseover", function(event) { event.target.innerHTML = foodName + " [EAT]"; }); } }
<p class="food">Snackbar</p> <p class="food">Apple</p> <p class="food">Pear</p> <p class="food">Chicken</p> <p class="food">Peas</p>
innerHTML
我得到它; 许多教程网站使用它,因为他们没有专业的理解。 某些浏览器在添加到 DOM 时未正确注册 XML,因此如果您尝试引用通过innerHTML
添加的id
,即使您确信不是在 DOM 中,它也不会注册并且看起来好像它不在 DOM 中。
您要求更改文本,但我也会回答您继承的第二个问题。
在 DOM 中操作textNode
时,您应该使用element.firstChild.nodeValue
尽管获取和/或设置更简单的方法是使用textContent
。
假设您的其他代码是正确的,您将要使用:
event.target.textContnt = foodName + " [EAT]";
关于从 JavaScript 和/或 AJAX 添加 HTML 我只是在这里发布了一个专业的答案:
尝试(仅限 CSS)
.food:hover::after { content: ' [EAT]' }
<p class="food">Snackbar</p> <p class="food">Apple</p> <p class="food">Pear</p> <p class="food">Chicken</p> <p class="food">Peas</p>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.