影子根 getElementsByClassName

2024-02-14

我正在使用 LitElement 创建自定义 Web 组件。我对此相当陌生,决定尝试制作图像幻灯片。我用了W3Schools 幻灯片作为参考 https://www.w3schools.com/howto/howto_js_slideshow.asp同时将其修改为 LitElement。 问题是,当我尝试使用 document.getElementByClassName 时,我没有得到任何东西。我很熟悉这个问题,因为我正在使用 Shadow DOM,所以我将其更改为 this.shadowRoot.getElementsByClassName。不幸的是,我被告知我想要使用的不是一个函数。当我使用 LitElement 和 Shadow dom 时,如何通过类名获取元素?如果您想看看我的组件是什么样子,这里是代码:

import { LitElement, html} from '@polymer/lit-element';

class ImageGalleryElement extends LitElement {

static get properties() { return {
    slideIndex: { type: Number },
  }};

constructor(){
    super();

    this.slideIndex=1;
    this.showSlides(this.slideIndex);
}

// Next/previous controls
plusSlides(n) {
    this.showSlides(this.slideIndex += n);
}

// Thumbnail image controls
currentSlide(n) {
    this.showSlides(this.slideIndex = n);
}

showSlides(n) {
    var i;
    console.dir(this.shadowRoot);
    var slides = this.shadowRoot.getElementsByClassName("mySlides");
    console.dir(slides);
    var dots = this.shadowRoot.getElementsByClassName("dot");
    if (n > slides.length) {this.slideIndex = 1} 
    if (n < 1) {this.slideIndex = slides.length}
    for (i = 0; i < slides.length; i++) {
        slides[i].style.display = "none"; 
    }
    for (i = 0; i < dots.length; i++) {
        dots[i].className = dots[i].className.replace(" active", "");
    }
    slides[this.slideIndex-1].style.display = "block"; 
    dots[this.slideIndex-1].className += " active";
}


render(){
return html`
    <style>
        * {box-sizing:border-box}

        /* Slideshow container */
        .slideshow-container {
            max-width: 1000px;
            position: relative;
            margin: auto;
        }

        /* Hide the images by default */
        .mySlides {
            display: none;
        }

        /* Next & previous buttons */
        .prev, .next {
            cursor: pointer;
            position: absolute;
            top: 50%;
            width: auto;
            margin-top: -22px;
            padding: 16px;
            color: white;
            font-weight: bold;
            font-size: 18px;
            transition: 0.6s ease;
            border-radius: 0 3px 3px 0;
            user-select: none;
        }

        /* Position the "next button" to the right */
        .next {
            right: 0;
            border-radius: 3px 0 0 3px;
        }

        /* On hover, add a black background color with a little bit see-through */
        .prev:hover, .next:hover {
            background-color: rgba(0,0,0,0.8);
        }

        /* Caption text */
        .text {
            color: #f2f2f2;
            font-size: 15px;
            padding: 8px 12px;
            position: absolute;
            bottom: 8px;
            width: 100%;
            text-align: center;
        }

        /* Number text (1/3 etc) */
        .numbertext {
            color: #f2f2f2;
            font-size: 12px;
            padding: 8px 12px;
            position: absolute;
            top: 0;
        }

        /* The dots/bullets/indicators */
        .dot {
            cursor: pointer;
            height: 15px;
            width: 15px;
            margin: 0 2px;
            background-color: #bbb;
            border-radius: 50%;
            display: inline-block;
            transition: background-color 0.6s ease;
        }

        .active, .dot:hover {
            background-color: #717171;
        }

        /* Fading animation */
        .fade {
            -webkit-animation-name: fade;
            -webkit-animation-duration: 1.5s;
            animation-name: fade;
            animation-duration: 1.5s;
        }

        @-webkit-keyframes fade {
            from {opacity: .4} 
            to {opacity: 1}
        }

        @keyframes fade {
            from {opacity: .4} 
            to {opacity: 1}
        }
    </style>
    <!-- Slideshow container -->
    <div class="slideshow-container">

        <!-- Full-width images with number and caption text -->
        <div class="mySlides fade">
            <div class="numbertext">1 / 3</div>
            <img src="../../img/img-snow-wide" style="width:100%">
            <div class="text">Caption Text</div>
        </div>

        <div class="mySlides fade">
            <div class="numbertext">2 / 3</div>
            <img src="../../img/img-nature-wide" style="width:100%">
            <div class="text">Caption Two</div>
        </div>

        <div class="mySlides fade">
            <div class="numbertext">3 / 3</div>
            <img src="../../img/img-mountains-wide" style="width:100%">
            <div class="text">Caption Three</div>
        </div>

        <!-- Next and previous buttons -->
        <a class="prev" @click="${this.plusSlides(-1)}" >&#10094;</a>
        <a class="next" @click="${this.plusSlides(1)}">&#10095;</a>
    </div>
    <br>

    <!-- The dots/circles -->
    <div style="text-align:center">
        <span class="dot" @click="${this.currentSlide(1)}"></span> 
        <span class="dot" @click="${this.currentSlide(2)}"></span> 
        <span class="dot" @click="${this.currentSlide(3)}"></span> 
    </div>
`;
}
} 
// Register the element with the browser
customElements.define('image-gallery-element', ImageGalleryElement);

The getElementsByClassName()方法仅适用于 HTML 文档或元素。

The shadowRoot是一个文档片段通过继承 https://dom.spec.whatwg.org/#interface-shadowroot,不是文档,也不是 HTML 元素。

相反,你应该使用querySelectorAll().

对于以下情况,行为相同:

  • getElementsByTagName()
  • getElementsByClassName()

Note 1

getElementById()在使用以下命令创建的(内存中)节点上不可用document.createElement

测试选择器方法:https://jsfiddle.net/WebComponents/9yrtn8vb/ https://jsfiddle.net/WebComponents/9yrtn8vb/

Note 2

请注意,分档内容是不为所动对于 Shadow DOM,它仍然保留在 light DOM 中

当你move从 lightDOM(在主 DOM 中)到 ShadowRoot 的元素,
Live Nodelist 将被清空

let pieces = document.getElementsByTagName("[TAGNAME here]");
console.warn(tags);// lists all tags
this.shadowRoot.append(...this.children);
console.warn(tags);// empty
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

影子根 getElementsByClassName 的相关文章

  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • WebGL iOS 渲染为浮点纹理

    我正在尝试在 iOS Safari 上的 WebGL 中渲染浮点纹理 而不是在本机应用程序中 我已经设法让 iOS 读取手动 例如从 JavaScript 创建的浮点纹理 但是当我创建浮点类型的帧缓冲区并使用 GPU 渲染到其中时 它不起作
  • 使用javascript在谷歌地图中绘制多边形

    我想在谷歌地图中绘制多边形 我正在使用示例代码http jsfiddle net rvsMH 1 http jsfiddle net rvsMH 1 但它不起作用并且没有获取数组或纬度 经度值 我不知道出了什么问题
  • jqgrid 在编辑框中选择不正确的下拉选项值

    我正在使用表单编辑 表单中有两个选择框 一个选择框是国家 地区 另一个选择框是州 州选择框取决于所选的国家 地区 并将动态填充 例如 Country 美国 期权价值 1 英国 期权价值 2 美国的状态 阿拉巴马州 选项值 1 加利福尼亚州
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 标点符号加载“动画”,javascript?

    我正在寻找一种好方法来显示一些标点符号加载 动画 我想要的是这样的 This will display at second 1 Waiting for your input This will display at second 2 Wai
  • Angular - Safari 无法正确显示 DOM

    我是 Angular 的新手 使用 Angular 4 我尝试通过在关联的组件类文件中设置属性来更新特定元素 但是 除非我尝试强制重新绘制网页 通过调整窗口大小等 否则页面不会更新 我打开检查器 看到 DOM 已更改 但显示与元素检查器中的
  • Sequelize 4.3.2 n:m(多对多)关联:未处理的拒绝 SequelizeEagerLoadingError

    我有 3 个模型 用户 项目 UserProject module exports function sequelize DataTypes var User sequelize define User title DataTypes ST
  • JavaScript 逻辑赋值是如何工作的?

    在 javascript 中 如果我们有一些代码 例如 var a one var b q a alert b 逻辑 OR 运算符会将 a 的值分配给 b 并且警报将为 一 这仅限于作业还是我们可以在任何地方使用它 似乎空字符串被视为与未定
  • jquery:如何检查div中的所有单选按钮是否被选中

    我的 html 看起来像这样 div div
  • Backbone.js 与 Google 地图 - 有关此问题和侦听器的问题

    我有一个为 Google Maps v3 创建的模块 我正在尝试将其转换为 Backbone js 视图构造函数 到目前为止 这是我的视图模块 我将解释代码后遇到的问题 pg views CreateMap Backbone View ex
  • Hydrate with RTK Query 确实会抛出错误

    我有一个非常简单的组件来显示来自本地 API 的数据 使用 Nextjs API 路由制作 我使用 RTK 查询来获取数据 const api createApi reducerPath data baseQuery fetchBaseQu
  • 动态地将 .on() 方法与事件映射绑定

    我使用此语法来确保事件绑定动态添加li元素 ul list on click li function do something 我尝试使用这样的事件映射来存档相同的内容 ul list hammer css hacks false on s
  • select 元素是否具有标准值属性?

    这是一个简单的问题 但我找不到任何参考资料 所以就在这里 假设我有一个选择元素
  • React TypeError:x 不是函数

    我在子组件中从父组件调用函数 booksRefresh 但出现错误 类型错误 booksRefresh 不是函数 我不知道为什么 因为 booksRefresh 是一个函数 有人可以帮我解释为什么会出现这个错误吗 这是我的代码 import
  • Skrollr 添加空白

    我已经尝试了一切 我在谷歌上阅读了 4 5 页试图找到适合我的修复程序 已经筋疲力尽了 即使我使用 skrollr 示例 我的问题仍然存在 不是说他们做错了什么 我知道我只是没有正确理解它 因此 我上传了一个演示 仅在移动设备上展示这个尴尬
  • 如何在 WebView 中添加 JavaScript 函数并稍后在提交 reCAPTCHA 时从 HTML 调用它

    我在 WebView 中添加一个 JavaScript 函数 如下所示 Kotlin val webView findViewById R id webview as WebView webView getSettings setJavaS
  • 在 Javascript 中创建数组

    我对 javascript 不太熟悉 并且在用 javascript 制作 2d 或者也许我可能需要 3d 数组时遇到了一些麻烦 我目前需要收集 2 条信息 一个 ID 和一个值 因此我创建了以下内容 var myArray var id
  • 将 javascript 变量作为参数传递给 @url.Action()

    是否可以将javascript变量作为参数传递给 url Action 因为据我所知可能存在服务器和客户端问题 我的要求是我必须根据过滤器下载文件 并进行ajax调用不适用于下载文件 所以我对 url Action 进行了编码 但无法实现这
  • 开玩笑 setTimeout 不暂停测试

    it has working hooks async gt setTimeout gt console log Why don t I run expect true toBe true 15000 我已经查看了这个答案 Jest 文档和几

随机推荐

  • C# Web 浏览器选择列表项单击

    我正在尝试使用以下方法从选择列表框中选择项目 var elements webBrowser1 Document GetElementsByTagName select foreach HtmlElement element in elem
  • 什么相当于 C# 中的 Microsoft.VisualBasic.Collection?

    我有一个方法 它需要一个存储过程名称和一个Microsoft VisualBasic Collection http msdn microsoft com en us library microsoft visualbasic collec
  • 在 Laravel 4 中缓存视图输出

    我知道 Blade 已经缓存了所有 Blade 视图的已编译 PHP 但我想更进一步 我正在开发的一个网站被模块化为组件视图 然后在默认控制器中拼凑在一起 每个 小部件 都有自己的视图 很少更改内容 少数频繁更新的除外 因此 我想缓存这些很
  • Jvectormap 在 div 变化时非常小

    我有两个 div 一个是世界地图 另一个是美国地图 当在世界地图上单击美国时 我想隐藏该 div 并将美国地图带入视图 这是可行的 但地图很小 即使缩放按钮的位置表明 div 的大小是它应该的大小 有任何想法吗 如果我从一开始就将两个 di
  • 获取php中两个日期之间的周数

    我想获取给定两个日期的周数 即从 2012 01 01 到 2012 12 31 周数应该恰好落在上面指定的范围内 您可以为此提供建议吗 像这样的东西应该可以正常工作
  • 如何使用 VisualSVN Server 将现有 Visual Studio 解决方案置于源代码管理之下?

    我有一个现有的 Visual Studio 2013 解决方案 我想使用 VisualSVN Server 将其置于源代码控制之下 我安装了 VisualSVN Server 并创建了一个新的空白存储库 他们的入门 https www vi
  • MuPdf 内存不足

    您好 我在项目中使用 MuPdf 库来查看文档 问题是 当您在平板电脑上的 11 英寸 Activity 中打开 3 7 个文档时 我会出现内存溢出 当您加载新文档时 对先前文档的所有引用都会被销毁 但内存中文档的图像不会被删除 对象在 1
  • 如何在软键盘顶部的建议中添加单词

    有什么办法可以在软键盘的建议中添加单词吗 对于特定的 Edittext 字段 我想将名称列表添加到 android 2 0 中软键盘顶部弹出的建议中 有谁知道这是否可能 Here http android git kernel org p
  • 侧边栏增强插件已安装但不起作用

    系统配置 Sublime Text3 内部版本 3065 Ubuntu 14 04 我想在浏览器中添加预览 发现侧边栏增强功能 Be https github com titoBouzout SideBarEnhancements是最好的插
  • SQL Server DATE 作为字符串检索到 pandas 中

    当我将 日期 变量从 SQL Server 拉入 Python Pandas 时 它作为 对象 出现 我已经安装并尝试了多个驱动程序 代码中显示了尝试过的注释驱动程序 每次都有相同的结果 import pandas as pd import
  • 如何将位图纹理的每个像素渲染到 macOS 上屏幕的每个本机物理像素?

    由于现代 macOS 设备默认选择使用缩放后的 HiDPI 分辨率 位图图像在屏幕上会变得模糊 有没有办法将位图逐像素渲染到显示屏的真实本机物理像素 任何 CoreGraphics OpenGL 或 Metal API 都可以在不改变屏幕显
  • 更改位图的色调,同时保留整体亮度

    我正在尝试编写一个函数 让我可以对位图进行红移或蓝移 同时保留图像的整体亮度 基本上 完全红移的位图将具有与原始亮度相同的亮度 但完全呈红色 即所有像素的 G 和 B 值都相等 蓝色着色相同 但 R 和 G 相等 频谱偏移的程度需要在 0
  • 绝对定位和CSS粘性页脚

    这是我的问题 我使用的布局具有粘性页脚 使用 cssstickyfooter com 方法 在我的容器 div 中 我有一个内容 div 其中包含其他四个 div 像这样 div class container div class cont
  • 何时使用.NET BufferedStream 类?

    The MSDN 网站 http msdn microsoft com en us library system io bufferedstream aspx states 缓冲区是内存中的一个字节块 用于缓存数据 从而减少 拨打运营商电话
  • iBeacon 广告 ID 是否唯一?

    我们正在讨论在跨国多个地点使用 iBeaons 进行大规模部署方案 有人提出的问题是 iBeacons 宣传其存在的 ID 是否是唯一的 因为我们的客户希望真正确保应用程序仅响应特定的 iBeacons 而不响应冒充相同 ID 的其他内容
  • 反转字符串中每个单词中的字母

    我有一个包含空格分隔单词的字符串 我想颠倒每个单词中的字母而不颠倒单词的顺序 我想my string成为ym gnirts 这应该有效 words explode string words array map strrev words ec
  • 在大型数据集上改变窗口大小的滚动平均值

    我想计算向量的滚动平均值 其中窗口随着向量中的每个条目而增长 基本上 我想要所有元素的平均值i th i 1 th i 2 th 依此类推 为了使它更清楚 我将提供一个示例和一个适用于较小数据集但不能很好扩展的解决方案 library zo
  • 来自 application.html.erb 的 Rails 渲染实例变量

    我正在关注 Agile Web Development with Rails 4 这本书 我对渲染的部分感到有点困惑 问题的简单版本是 在 application html erb 文件中它说 render cart 这很令人困惑 因为我认
  • Redis 概念:在内存中还是在数据库中?

    基于http redis io topics faq http redis io topics faq Redis 是一个内存中但持久在磁盘上的数据库 那么我可以知道redis将键 值保存在内存中还是磁盘中 或两者 Redis写入值时 同时
  • 影子根 getElementsByClassName

    我正在使用 LitElement 创建自定义 Web 组件 我对此相当陌生 决定尝试制作图像幻灯片 我用了W3Schools 幻灯片作为参考 https www w3schools com howto howto js slideshow