开发者问题收集

聚合物:在自定义元素中使用 querySelector 而不是“this.$”。

2014-11-08
3805

编辑: 刚刚找到此链接,它以某种方式解释了它。 使用 querySelector 查找 Polymer 模板内的嵌套元素返回 null

尽管如此,我还是希望能够回答我关于这个特定代码的问题。

/编辑

我认为这是一个相当直接和简约的问题:

我在聚合物中有一个自定义元素:

<polymer-element name="my-test">
    <template>
        <div id="content">
            <h3 id="test">My Test</h3>
            <p id="paragraph">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi dolore consectetur, mollitia eos molestias totam ea nobis voluptatibus sed placeat, sapiente, omnis repellat dolores! Nihil nostrum blanditiis quasi beatae laborum quisquam ipsum!</p>
            <button id="button">Clicke Me!</button>
        </div>

    </template>
    <script>
    Polymer('my-test', {
        ready: function() {
            var button = this.$.button;
            button.addEventListener("click", function() {
                alert("alert");
            });
        }
    });
    </script>
</polymer-element>

问题是,我宁愿使用

var button = document.querySelector(#button);

而不是

var button = this.$.button;

因为它看起来更直观和更具声明性。但每当我这样做时,我都会收到一条错误消息:

"Uncaught TypeError: Cannot read property 'addEventListener' of null " in Chrome and

 Firefox instead says: "TypeError: button is null"

因此,任何帮助都值得赞赏!:)

2个回答

您的按钮位于 Polymer 元素内,由于 Polymer 元素的内容位于其影子 DOM 内,因此无法通过这种方式找到该元素。如果您的 <my-test> 元素不在另一个元素的影子 DOM 内,您可以使用 this.shadowRoot.querySelector('#button');document.querySelector('* /deep/ #button');document.querySelector('my-test::shadow #button');/deep/ 穿透所有影子 DOM 边界 ::shadow 仅穿透一个。

Günter Zöchbauer
2014-11-08

实际上以下行:

var button = document.querySelector(#button);

应为:

var button = document.querySelector('#button');

请注意引号。

The Alpha
2014-11-08