在函数中访问影子根

Accesing shadow root inside a function

提问人:The Dead Man 提问时间:9/30/2021 最后编辑:The Dead Man 更新时间:10/1/2021 访问量:199

问:

我已经使用香草 javascript 创建了简单的 Web 组件,按照

问题出在我的我想访问hideNonVisibleDivs()shadowRoot

这是我的功能。

var visibleDivId = null;
var i, divId, div;

console.log('shadowroot', this); // display the global shadow root element

function divVisibility(divId) {
     hideNonVisibleDivs.bind(this)(divId); //binding this context
}

function hideNonVisibleDivs(divId) {
    //I want to access a shadow root here using this
    console.log('shadowroot', this); //undefined
}

var panels = this.shadowRoot.querySelectorAll("#tab-info> .share-tab")
panels.forEach(function(el) {
        divVisibility.bind(this)(this.getAttribute('custom-id')); //bind this context

    });
});

什么是预期?

在里面,我想访问 shadowRoot 作为 out side 函数(全局 shadowroot)的 shadowRoot,这意味着这一点。hideNonVisibleDivs(divId)

javascript html 这个 Web 组件

评论

0赞 Pointy 9/30/2021
您链接的文档中的第 1 步说使用 JavaScript 类语法创建一个类。你的班级在哪里?
0赞 The Dead Man 10/1/2021
@Pointy这里需要所有代码吗?关键是我如何访问全局 shadowRoot,它可以在我的函数之外访问
0赞 Pointy 10/1/2021
影子根不是一个全局概念;它是组件的一部分。
0赞 The Dead Man 10/1/2021
无论如何,我已经解决了这个问题
0赞 Danny '365CSI' Engelman 10/1/2021
你可能已经解决了它;但是使用 告诉我,你很可能不理解类中的范围和方法。Your 是一个函数,而不是类上的方法。如果这是一种方法,您将免费获得正确的“this”范围,而没有任何老式的mumbo-jumbo。这就是为什么我们要求完整的 Web 组件;然后,我们可以发现您有经验的 JavaScript 技能不使用现代模式的地方。binddivVisibiltybind

答:

0赞 Michael G 9/30/2021 #1

我能提供的最简单的解决方案是停止使用 .
每个函数调用的含义都会发生变化,这就是为什么您在代码中的任何时候都难以理解它所指的内容。
thisthis

例如,您的函数无法工作。divVisibility()

console.log( 'shadowroot', this ); //{this} is a shadowroot

//...

function divVisibility(divId) {

     //shadow root {this} cannot be accessed at all from here

     hideNonVisibleDivs.bind(this)(divId); //binding this context
                           //^Refers to divVisibility

}

尝试在不使用任何地方的情况下重写代码。请改用变量名称,例如“shadowroot”。(不幸的是,在不了解您的代码的情况下,我不知道这个建议有多大用处。this

评论

0赞 The Dead Man 10/1/2021
你根本没有提供解决方案,在添加你的asnwer之前检查第一个Web组件
0赞 Michael G 10/1/2021
@TheDeadMan问题在于 divVisibility() 中更改的含义。如果他停止使用 ,他的代码将起作用。(正如我在解决方案中所说。thisthis
0赞 The Dead Man 10/1/2021
别担心,我已经解决了这个问题
0赞 Michael G 10/1/2021
@TheDeadMan 请发布并接受您的答案,或删除您的问题。