繁体   English   中英

innerHTML创建一个新元素,而不是替换目标元素的innerHTML

[英]innerHTML creates a new element rather than replacing the innerHTML of the targeted element

我试图替换<i>元素的innerHTML,但似乎创建了一个额外的<i>元素,而不是替换和重写innerHTML。 <i>元素包含一个名为zmdi的库的类。 我的目标是更改此元素的类,以便在单击时更改图像。

这是我想要改变的HTML的元素: <i class="zmdi zmdi-mic zmdi-hc-2x" id = "micButton"></i>

我正在尝试将其更改为: <i class="zmdi zmdi-mic-off zmdi-hc-2x" id = "micButton"></i>

我尝试了几件事:

1.在记录时,我注意到在单击元素之前,它的innerHTML似乎没有任何价值。 单击后,它会记录我设置的innerHTML,它是:

<i class="zmdi zmdi-mic-off zmdi-hc-2x" id = "micButton"></i>

我不确定这是否与问题有关,但它似乎很奇怪,特别是因为我在HTML文件的底部调用了js文件,因此在初始化之前尝试调用该元素应该没有问题。

  1. 我尝试更改测试div的innerHTML。 测试div如下: <div class="blue" id="test">test div</div>当点击它时,innerHTML被改为<div class="red" id="test">test div</div>它按预期工作,但是在单击div之前的日志中,它的值只是test div而我预计它也会记录所有innerHTML。 另外,不知道为什么,但是这个确实用新的innerHTML成功地替换了它的innerHTML,而另一个没有。

这是一个显示问题的codepen: https ://codepen.io/mso122591/pen/JQWMYX

这是相关的HTML(注意:我正在使用哈巴狗)

doctype html
html(lang='en')
  head
    title= title
    meta(charset='utf-8')
    meta(name='viewport', content='width=device-width, initial-scale=1')
    <script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js'></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/material-design-iconic-font/2.2.0/css/material-design-iconic-font.min.css">
script.
      var room="#{room}";
link(rel='stylesheet', href='/style.css')
body
<h1>#{title} </h1>
<div class="blue" id="test">test div</div>
<div class= "menu">
 <div class= "buttons-container">
     <div class= "single-button-container">
        <i class="zmdi zmdi-mic zmdi-hc-2x" id = "micButton"></i>
     </div>
 </div>
<script src="/gameChat.js"></script>

这是相关的JS:

let micButton= document.getElementById('micButton');
 //Test Div
let test=document.getElementById('test');

//Onclick for element I am trying to change
micButton.addEventListener("click", function(event){
    console.log("before click",micButton.innerHTML);
    micButton.innerHTML= '<i class="zmdi zmdi-mic-off zmdi-hc-2x" id = 
"micButton"></i>';
    console.log("after click",micButton.innerHTML);
  });


//Onclick for the Test Div
    test.addEventListener("click", function(event){
    console.log(" test div before click",test.innerHTML);
    test.innerHTML= '<div class="red" id="test">test div</div>';
   console.log("test div after click",test.innerHTML);
  });

我认为这应该足以显示问题,但如果需要更多代码,请告诉我。

我最终通过使用.className而不是.innerHTMl并以这种方式设置类(这可能是一种更好的方式来实现它)来实现这一点。但是理解这里的问题会很棒。

尝试使用classList.add / classList.remove而不是innerHTML。 像这样的东西:

micButton.addEventListener("click", function(e){
    micButton.classList.add('new-class');
    micButton.classList.remove('old-class');
  });

关于实际问题 - innerHTML是content / child元素。 所以它不应该包含元素本身。 在这种情况下,innerHTML不是正确的解决方案,因为没有内容。 建议的类添加/删除是一个更好的解决方案。

通常innerHTML用于替换标记包含的实际文本。 当使用innerHTML并将其设置为<i class="zmdi zmdi-mic-off zmdi-hc-2x" id = "micButton"></i>你要求它做的是取当前的空字符串<i>并添加一个全新的<i>标签。 这在第一个按钮单击中演示。 您将看到文本消失,因为它已被标记替换。

目前更换类的现代方法是使用classList 第二种方法演示了如何使用它。

 let failButton = document.getElementById('failButton'); let micButton= document.getElementById('micButton'); //Onclick for element adding tag into tag failButton.addEventListener("click", function(event){ console.log("before click",failButton.innerHTML); failButton.innerHTML= '<i class="zmdi zmdi-mic-off zmdi-hc-2x" id = "failButton"></i>'; console.log("after click", failButton.innerHTML); }); //Onclick for element that works micButton.addEventListener("click", function(event){ document.getElementById("micButton").classList.add('zmdi-mic-off'); document.getElementById("micButton").classList.remove('zmdi-mic'); console.log(document.getElementById("micButton")); }); 
 <div class= "menu"> <div class= "buttons-container"> <div class= "single-button-container"> <i class="zmdi zmdi-mic zmdi-hc-2x" id = "failButton">Replace this with tag</i> </div> </div> <div class= "menu"> <div class= "buttons-container"> <div class= "single-button-container"> <i class="zmdi zmdi-mic zmdi-hc-2x" id = "micButton">Replace class in tag</i> </div> </div> 

您可以使用JQuery toggleClass()来缩短所有这些代码:

https://jsfiddle.net/DIRTY_SMITH/vz04m3ph/43/

$("#test").click(function(){
  $(this).toggleClass( "red" )
});
$(".single-button-container > i").click(function(){
  $(this).toggleClass("zmdi-mic")
  $(this).toggleClass("zmdi-mic-off")
});

注: toggleClass(.red)的工作,因为你已经.red.blue在你的CSS。 CSS将最后一种样式应用于元素。 该元件开始接触只有类.blue然后切换.red和关闭。

添加到<div>使用innerHtml 的元素创建一个新行?</div><div id="text_translate"><p> 我有一个工具,它应该是一种创建清单的简单方法,它可以工作,但是当我将它用于带有两个复选框的东西时会发生什么,它会在每个复选框之间创建一个新行,有没有办法阻止它从这样做? 我的代码在这里是/否</p><p></p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"><div class="snippet-code"><pre class="snippet-code-html lang-html prettyprint-override"> &lt;:DOCTYPE html&gt; &lt;html&gt; &lt;h1&gt;Create a checklist&lt;/h1&gt; &lt;div&gt; &lt;input type="text" placeholder="Text for object" id="txt" /&gt; &lt;button onclick="addYN()"&gt;Add yes/no&lt;/button&gt; &lt;/div&gt; &lt;/html&gt; &lt;div style="background-color; grey." id="prv"&gt;&lt;/div&gt; &lt;script&gt; var pv = document;getElementById("prv"). var txt = document;getElementById("txt"). function getVarYn() { let tx = txt;value; return ( "&lt;div&gt;&lt;p&gt;" + tx + "&lt;/p&gt; &lt;p&gt; yes&lt;/p&gt; &lt;input type = 'checkbox'/&gt; &lt;p&gt;no &lt;/p&gt; &lt;input type = 'checkbox'/&gt; &lt;/div&gt; " ). } function addYN() { var t = txt;value. pv.innerHTML = pv;innerHTML + getVarYn(); } &lt;/script&gt;</pre></div></div><p></p></div>

[英]Adding to a <div> element using innerHtml creates a new line?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 替换整个元素而不是innerHTML? 为什么 `innerHTML` 属性属于 JavaScript `Element` class 而不是 `HTMLElement`? 添加到<div>使用innerHtml 的元素创建一个新行?</div><div id="text_translate"><p> 我有一个工具,它应该是一种创建清单的简单方法,它可以工作,但是当我将它用于带有两个复选框的东西时会发生什么,它会在每个复选框之间创建一个新行,有没有办法阻止它从这样做? 我的代码在这里是/否</p><p></p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"><div class="snippet-code"><pre class="snippet-code-html lang-html prettyprint-override"> &lt;:DOCTYPE html&gt; &lt;html&gt; &lt;h1&gt;Create a checklist&lt;/h1&gt; &lt;div&gt; &lt;input type="text" placeholder="Text for object" id="txt" /&gt; &lt;button onclick="addYN()"&gt;Add yes/no&lt;/button&gt; &lt;/div&gt; &lt;/html&gt; &lt;div style="background-color; grey." id="prv"&gt;&lt;/div&gt; &lt;script&gt; var pv = document;getElementById("prv"). var txt = document;getElementById("txt"). function getVarYn() { let tx = txt;value; return ( "&lt;div&gt;&lt;p&gt;" + tx + "&lt;/p&gt; &lt;p&gt; yes&lt;/p&gt; &lt;input type = 'checkbox'/&gt; &lt;p&gt;no &lt;/p&gt; &lt;input type = 'checkbox'/&gt; &lt;/div&gt; " ). } function addYN() { var t = txt;value. pv.innerHTML = pv;innerHTML + getVarYn(); } &lt;/script&gt;</pre></div></div><p></p></div> JS-innerHTML更改为新元素 附加 innerHTML 为第一个元素创建一个间隙 不使用innerHTML替换dhtml元素 修改使用innerHTML创建的元素的innerHTML 使用 innerHTML 将新字符串分配给 HTML 元素 创建元素的回调 function 返回带有空 innerHTML 的元素 用javascript提醒innerHTML元素
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM