【发布时间】:2015-07-21 11:12:55
【问题描述】:
我创建了一个自定义 Polymer 元素,并尝试在我的 Chrome 扩展程序中使用它。但是,我遇到了以下问题。
我无法从内容脚本访问我元素的 API。这就是我的意思。
我的元素的模板
<link rel="import" href="../polymer/polymer.html">
<dom-module id="my-element">
<template>
... some html...
</template>
<script src="js/my-element.js"></script>
</dom-module>
在 my-element.js 中
Polymer({
is: 'my-element',
init: function () {
console.log('init');
}
});
在 content.js 中
var link = document.createElement('link');
link.setAttribute('rel', 'import');
link.setAttribute('href', chrome.extension.getURL('my-element.html'));
link.onload = function() {
var elem = document.createElement('my-element');
document.body.appendChild(elem);
elem.init(); // Error: undefined is not a function
};
document.body.appendChild(link);
有趣的是,我可以看到my-element 在页面上正确呈现,以及它所有的影子 dom 和其他东西。如果我在主机网页的控制台中运行document.querySelector('my-element').init(),它会在没有错误的情况下执行。但是,在内容脚本中执行相同的代码会产生错误。
我尝试将 Polymer 本身包含为内容脚本。我遇到了registerElement 问题,但感谢this 问题我解决了。在这种情况下,我在content.js 中定义了window.Polymer。 My-element 的 API 变得完全可访问,但现在当我将它的影子 dom 附加到主机网页的 DOM 时,它不会呈现。
【问题讨论】:
-
由于沙盒,我认为浏览器不会在普通 http/https 页面上遵循
chrome-extension://链接,至少这样的链接不能按原样工作。您是否在清单中通过web_accessible_resources 暴露了my-element.html? -
是的,我在清单中暴露了
my-element.html和所有相关的 css 文件。该元素实际上是渲染的,它的使用Polymer({...})声明的方法和属性可以通过document.querySelector()访问,但只能从主机网页访问,而不是从内容脚本访问。我想我应该以某种方式从内容脚本中强制声明my-element,但我不知道如何。
标签: javascript google-chrome-extension polymer