Javascript更改内部HTML

Posted

技术标签:

【中文标题】Javascript更改内部HTML【英文标题】:Javascript change inner HTML 【发布时间】:2020-06-19 15:01:30 【问题描述】:

我想根据复选框的状态更改标签的值

function private() 
  var checkBox = document.getElementById("private");// Get the checkbox
  var text = document.querySelector('label[for="private"]');// Get the output text

  if (checkBox.checked == true)
  
    text.innerhtml = "Public";
   else 
    text.innerHTML = "Private";
  
<label class="switch">
  <input id="private" type="checkbox" onclick="private()" />
  <span class="slider"></span>
</label>
<label for="private"></label>

为什么这不起作用?

【问题讨论】:

这能回答你的问题吗? What do querySelectorAll and getElementsBy* methods return? @HereticMonkey 它有帮助,但它无论如何都不起作用 【参考方案1】:

querySelectorAll返回一个节点列表,所以你需要指定你想要的元素比如:

function private() 
  var checkBox = document.getElementById("private");// Get the checkbox
  var text = document.querySelectorAll('label[for="private"]')[0];// Get the output text

  if (checkBox.checked == true)
  
    text.innerHTML = "Public";
   else 
    text.innerHTML = "Private";
  
<label class="switch">
  <input id="private" type="checkbox" onclick="private()" />
  <span class="slider"></span>
</label>
<label for="private"></label>

或者也许只是使用querySelector 而不是只返回第一个匹配项:

function private() 
  var checkBox = document.getElementById("private");// Get the checkbox
  var text = document.querySelector('label[for="private"]');// Get the output text

  if (checkBox.checked == true)
  
    text.innerHTML = "Public";
   else 
    text.innerHTML = "Private";
  
<label class="switch">
  <input id="private" type="checkbox" onclick="private()" />
  <span class="slider"></span>
</label>
<label for="private"></label>

【讨论】:

我已经完成了,但没有任何改变...您是否修改了其他任何内容以使其正常工作? @Fox 不,您可以在我的回答中看到完整的工作代码示例。您是否检查过浏览器的控制台是否有错误?您在问题中发布的代码是否准确、完整地反映了您的问题? 控制台说:“私有不是函数” @Fox 在某处听起来像是错字 当然...但是我检查了它,没有错字!函数会与 id 名称冲突吗?【参考方案2】:

您需要使用querySelector() 而不是querySelectorAll()。通过获取所有元素,您将不得不遍历项目列表(即使只有 1 个)。

function private() 
  var checkBox = document.getElementById("private");// Get the checkbox
  var text = document.querySelector('label[for="private"]');// Get the output text

  if (checkBox.checked == true)
  
    text.innerHTML = "Public";
   else 
    text.innerHTML = "Private";
  
<label class="switch">
  <input id="private" type="checkbox" onclick="private()" />
  <span class="slider"></span>
</label>
<label for="private"></label>

【讨论】:

那么您还有其他问题。检查您的控制台日志。您可以在此处的代码 sn-p 中清楚地看到它正在运行。 上面写着Uncaught TypeError: private is not a function at HTMLInputElement.onclick @Fox 与您发布的正确回答的问题无关,这是一个骗局。如果您还有其他问题,请提出其他问题。【参考方案3】:

我建议以下三件事可以解决您的问题:

event 对象传递给您的函数。这包含有关click 事件的所有信息,包括点击了什么元素。这意味着您不必搜索 DOM。 不要不要标签包装表单控件。这不是标签的工作方式。请改用section 标签之类的东西。 当提供for 属性时,表单控件及其标签会自动连接。另一个可以通过control.labels[0]label.htmlFor 找到。这就是为什么您要遵守不使用标签包装控件的标准

通过这些调整,并添加一个 三元 条件语句来确定要显示的文本,代码将如下所示:

<section class="switch">
  <input id="private" type="checkbox" onclick="private(event)" />
  <span class="slider"></span>
</section>

<label for="private"></label>

function private(e) 
  var checkBox = e.currentTarget,
  label = checkBox.labels[0];

  label.textContent = checkBox.checked ? "Public" : "Private";

示例:

function private(e) 
  var checkBox = e.currentTarget,
  label = checkBox.labels[0];
  
  label.textContent = checkBox.checked ? "Public" : "Private";
<section class="switch">
  <input id="private" type="checkbox" onclick="private(event)" />
  <span class="slider"></span>
</section>

<label for="private"></label>

【讨论】:

以上是关于Javascript更改内部HTML的主要内容,如果未能解决你的问题,请参考以下文章

使用 javascript 更改 div 宽度并移动内部 div

JavaScript,当变量作为参数传递时更改函数内部的变量值[重复]

检测 <td> 的内部 html 何时随 javascript 或 jquery 更改

更改跨度文本值 JavaScript/jQuery

从javascript更改div元素的属性[重复]

如何更改 Meteor 加载 Javascript 文件的顺序?