querySelector 在聚合物就绪事件后找不到元素
querySelector doesn't find elements after polymer-ready event
我有一个自定义元素(我们称之为 'el-barto')。它在另一个模板的模板内。
现在。我可以使用 querySelector document.querySelector('el-barto')
到 select 使用 chrome 开发工具控制台没有任何问题。
但是相同的查询 returns 如果从 js 文件完成则什么也没有。
$(document).ready(function() { document.querySelector('el-barto'); });
人们说:为 polymer-ready
添加事件侦听器,我也这样做了:
...
document.addEventListener('polymer-ready', function() {
console.log('yey, poly is ready!');
console.log(document.querySelector('el-barto'));
});
...
这会打印:
yey, poly is ready!
null
所以我继续设置超时,就像这样:
...
document.addEventListener('polymer-ready', function() {
console.log('yey, poly is ready!');
setTimeout(function(){
console.log(document.querySelector('el-barto'));
},100);
});
...
你知道什么?
yey, poly is ready!
<el-barto>...</el-barto>
(我注意到,小于 100 毫秒的超时 returns 对于查询 select 为空)。
现在,我不会再左右设置超时了。
我是不是做错了什么?
甚至更多。
如果我使用查询select或类似:
document.querySelector('#main').content.querySelector('#sub-main').content.querySelector('#sub-sub-main').content.querySelector('el-barto')
它会在不设置超时的情况下工作。但问题是为什么在 100 毫秒后我可以找到 'el-barto' 而无需这么长的查询?我的目标是在不使用那些长查询 selectors.
的情况下找到这些元素
当所有内容实际上都在 DOM 中时,'polymer-ready'
事件不会触发。它仅确认页面加载时存在的所有元素均已导入并升级。此外,仅仅因为元素被升级并不意味着 DOM 被完全操纵(尽管如果你没有做太多复杂的事情通常是这样)。如果您的自定义元素根据属性动态添加到 DOM,则尤其如此。
过早查询 DOM 对于任何操纵 DOM 的库或框架来说总是危险的。如果库具有复杂的初始化过程,则尤其如此。如果您的其他脚本 and/or 元素需要 <el-barto>
存在,请考虑在 <el-barto>
的 domReady
函数中触发一个事件。这将通过祖先冒泡 DOM,让您 知道 <el-barto>
已升级并存在(及其直系子女)。
无论您选择哪个祖先,您都可以使用 addEventListener
简单地监听您的事件并添加您的查询,或者更好的是,从事件对象中获取 <el-barto>
。
Polymer('el-barto', {
... other el-barto code ...
domReady: function() {
this.fire('el-barto-ready');
}
... other el-barto code ...
});
其他任何地方...
[ancestor].addEventListener('el-barto-ready', function() {
console.log(document.querySelector('el-barto');
});
我有一个自定义元素(我们称之为 'el-barto')。它在另一个模板的模板内。
现在。我可以使用 querySelector document.querySelector('el-barto')
到 select 使用 chrome 开发工具控制台没有任何问题。
但是相同的查询 returns 如果从 js 文件完成则什么也没有。
$(document).ready(function() { document.querySelector('el-barto'); });
人们说:为 polymer-ready
添加事件侦听器,我也这样做了:
...
document.addEventListener('polymer-ready', function() {
console.log('yey, poly is ready!');
console.log(document.querySelector('el-barto'));
});
...
这会打印:
yey, poly is ready!
null
所以我继续设置超时,就像这样:
...
document.addEventListener('polymer-ready', function() {
console.log('yey, poly is ready!');
setTimeout(function(){
console.log(document.querySelector('el-barto'));
},100);
});
...
你知道什么?
yey, poly is ready!
<el-barto>...</el-barto>
(我注意到,小于 100 毫秒的超时 returns 对于查询 select 为空)。
现在,我不会再左右设置超时了。
我是不是做错了什么?
甚至更多。
如果我使用查询select或类似:
document.querySelector('#main').content.querySelector('#sub-main').content.querySelector('#sub-sub-main').content.querySelector('el-barto')
它会在不设置超时的情况下工作。但问题是为什么在 100 毫秒后我可以找到 'el-barto' 而无需这么长的查询?我的目标是在不使用那些长查询 selectors.
的情况下找到这些元素当所有内容实际上都在 DOM 中时,'polymer-ready'
事件不会触发。它仅确认页面加载时存在的所有元素均已导入并升级。此外,仅仅因为元素被升级并不意味着 DOM 被完全操纵(尽管如果你没有做太多复杂的事情通常是这样)。如果您的自定义元素根据属性动态添加到 DOM,则尤其如此。
过早查询 DOM 对于任何操纵 DOM 的库或框架来说总是危险的。如果库具有复杂的初始化过程,则尤其如此。如果您的其他脚本 and/or 元素需要 <el-barto>
存在,请考虑在 <el-barto>
的 domReady
函数中触发一个事件。这将通过祖先冒泡 DOM,让您 知道 <el-barto>
已升级并存在(及其直系子女)。
无论您选择哪个祖先,您都可以使用 addEventListener
简单地监听您的事件并添加您的查询,或者更好的是,从事件对象中获取 <el-barto>
。
Polymer('el-barto', {
... other el-barto code ...
domReady: function() {
this.fire('el-barto-ready');
}
... other el-barto code ...
});
其他任何地方...
[ancestor].addEventListener('el-barto-ready', function() {
console.log(document.querySelector('el-barto');
});