我创建了一个自定义Polymer元素,并试图在我的Chrome扩展中使用它。但是,我遇到了以下问题。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>
我-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
是所有这些都是阴影和事情。如果我在主机网页的控制台中运行document.querySelector('my-element').init()
,它将无误地执行。但是,在内容脚本中执行相同的代码会产生错误。
我试过将聚合物本身作为内容脚本。我碰到registerElement
的问题,但我解决了它,这要归功于this的问题。在这种情况下,我在我的content.js
中定义了window.Polymer
。我的元素的API变得完全可访问,但现在当我将它附加到主机网页的DOM时,它不会被渲染。
我不认为浏览器由于沙箱而在正常的http/https页面上遵循'chrome-extension://'链接,至少这样的链接在这里不起作用。您是否在清单中通过[web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources)公开了'my-element.html'? – wOxxOm
是的,我在我的清单中暴露了'my-element.html'和所有相关的css文件。该元素实际上被渲染,它的方法和用'Polymer({...})声明的属性可以通过'document.querySelector()'访问,但只能从主机网页访问,而不能从内容脚本访问。我想我应该不知何故在内容脚本中声明'my-element',但我不知道如何。 – optimistiks