微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Javascript 自定义元素中获取元素 ID?

如何解决如何在 Javascript 自定义元素中获取元素 ID?

我使用本教程在所有页面中重复使用我的导航栏:Reusable HTML Components – FreeCodecamp 简而言之,他将 HTML 放在一个 .JS 文件中,并使用 <nameOfComponent> </nameOfComponent>

页面调用

但是要调整到移动设备的大小,我需要调用这个脚本:

function topNav_resize() {
var x = document.getElementById("myTopnav");
console.log("este é o conteudo da variavel x: " +x)
if (x.className === "topnav") {
 x.className += " responsive";
} else {
 x.className = "topnav";
}
}

但是 getElementById 为空

有谁知道为什么?或者有更好的方法吗?

这些是我遵循的教程:

How to do a reponsive Topnav w3school

Reuse Header & Footer FreeCodeCamp

解决方法

我不知道在哪里使用你的函数,它是监听器还是其他地方,但你可以在代码中使用 classList Toggle,就像那样

<div id="myTopnav"></div>
<button id="btn"></button>
//Calling your x in DOM
var x = document.getElementById('myTopnav');
//Calling button in DOM
var btn = document.getElementById('btn');

//Wrinting Eventlistner for button
function topNav_resize(){

//if else statement is not necessary toggle method automatically understands
 when it should remove and when add
x.classList.toggle("responsive")
}

//And After that we give this function a button 
btn.addEventListener('click',topNav_resize )

您也可以自行检查JSFIDDLE

,

自定义元素创建一个 shadowRoot(又名 shadowDOM)

这意味着 document.getElementById("ID") 不能访问 shadowDOM 中的任何元素(把它想象成一个 IFrame)

可以document.querySelector("my-element").shadowRoot.getElementById("id")(IFrames做不到)

但是... 需要 mode:"open" 并且此元素设置 mode:"closed"

这意味着“外部”世界不允许查询 shadowDOM

closed 根很少使用...因为它完全锁定。

如果您可以访问源代码,请将其重写为:

connectedCallback(){
  this.attachShadow({mode:"open"}).append(headerTemplate.content);
}

为什么没有在 constructor 中完成,我不知道

constructor(){
  super().attachShadow({mode:"open"}).append(headerTemplate.content);
}

应该没问题,见:https://dev.to/dannyengelman/web-component-102-the-5-lessons-after-learning-web-components-101-h9p

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。