【问题标题】:NAV tag content does not work after replacing INNERHTML替换 INNERHTML 后 NAV 标签内容不起作用
【发布时间】:2020-03-16 06:24:44
【问题描述】:

我有一个包含 UL 列表项的现有 NAV 标签。当 NAV 标签内容保持原样时,原始 HTML 工作。当我用我自己的 HTML 替换 INNERHTML 时,它类似于原始 HTML AS-IS,逐字逐句地,NAV 将不再像原始 HTML 那样下降。我检查了每一个字母和单词。我确实注意到其中一个 ANCHOR HREF 确实包含 #。这是原始资产净值中的内容。

<nav id="nav">
<ul>
<li class="current"><a href="index.html">Welcome</a></li>
<li class="submenu">
<a href="#">Show Me</a>
<ul>
<li><a href="hybrid/index.html">The Hybrid</a></li>
</ul>
</li>
</ul>
</nav>

我的代码就是这样显示的


var pstrHTML = "<ul>"
+ "<li class='current'><a href='index.html'>Welcome</a></li>"
+ "<li class='submenu'>"
+ "<a href='#'>Show Me</a>"
+ "<ul>"
+ "<li><a href='hybrid/index.html'>The Hybrid</a></li>"
+ "</ul>"
+ "</li>"
+ "</ul>";
document.getElementById("nav").innerHTML = pstrHTML;

如果我在 SHOW ME 列表项上粘贴一个包含 WINDOW.ALERT 的 ONCLICK,它会在单击时生成一个 ALERT。所以我知道 INNERHTML 是通过 ONPAGELOAD 工作的。但无论出于何种原因,NAV 都无法匹配原始 HTML。

【问题讨论】:

  • 您已将事件侦听器附加到原始元素,innerHTML 创建新元素以显示。尽管这些新元素看起来相同,但它们与附加事件的原始元素不同。如果您无法使用 append / appendChild / insertBefore / insertAdjacentElement / insertAdjacentHTML 方法操作内容,那么您必须将事件委托给祖先元素(在 nav 上)。

标签: javascript css innerhtml nav


【解决方案1】:

由于您正在删除元素,因此绑定到它的事件也将被删除。

要使事件持久化,您可以将事件绑定到文档而不是带有document.AddEventListener() 的元素。然后我们需要检查目标是否有 id #ShowMe

document.AddEventListener("click",function(e) {
   if(e.target = "#idOfYourElement"){
      // do something
   }
});

在下面运行工作演示;

document.getElementById("nav").addEventListener("click", function(e) {
  if (e.target = "#ShowMe") {
    alert("Hello World!");
    var pstrHTML = "<ul>" +
      "<li class='current'><a href='index.html'>Welcome</a></li>" +
      "<li class='submenu'>" +
      "<a id='ShowMe' href='#'>Show Me</a>" +
      "<ul>" +
      "<li><a href='hybrid/index.html'>The Hybrid</a></li>" +
      "<li><a href='hybrid/index.html'>New Element 1</a></li>" +
      "<li><a href='hybrid/index.html'>New Element 2</a></li>" +
      "</ul>" +
      "</li>" +
      "</ul>";
    document.getElementById("nav").innerHTML = pstrHTML;
  }
});
<nav id="nav">
  <ul>
    <li class="current"><a href="index.html">Welcome</a></li>
    <li class="submenu">
      <a id="ShowMe" href="#">Show Me</a>
      <ul>
        <li><a href="hybrid/index.html">The Hybrid</a></li>
      </ul>
    </li>
  </ul>
</nav>

document.AddEventListener() 相当于 jquery 中的$(document).on("action","#id",function(){ });

编辑:包括 Teemu 的答案,这也可以;

document.getElementById("nav").addEventListener("click", function(e) {
  if (e.target = "#ShowMe") {
     // do something
  }
});

【讨论】:

  • 不一定是document,任何共同的祖先都可以,越接近越好。
  • 所以,我做了一些相当愚蠢和简单的事情。这是一个非常简单的网站。无论出于何种原因,如果 HTML5 上的 NAV 对象在页面加载后被触摸,则 NAV 对象会失败。因此,我在 MS ACCESS 中编写了一个简单的 VBA 应用程序,打开网站上记录到 LIST/TABLE 中的每个页面,然后使用所有页面的标准 HTML 模型修改整个 NAV 部分。我花了很多时间尝试各种 JSCRIPT 代码,然后才决定使用 VBA 来更新 NAV 预部署。感谢所有的帮助。
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 2014-11-01
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多