Javascript 铬扩展内容脚本中的聚合物元素
我创建了一个自定义聚合元素,并尝试在我的Chrome扩展中使用它。但是,我遇到了以下问题 我无法从内容脚本访问元素的API。我的意思是 我的元素的模板Javascript 铬扩展内容脚本中的聚合物元素,javascript,google-chrome-extension,polymer,Javascript,Google Chrome Extension,Polymer,我创建了一个自定义聚合元素,并尝试在我的Chrome扩展中使用它。但是,我遇到了以下问题 我无法从内容脚本访问元素的API。我的意思是 我的元素的模板 <link rel="import" href="../polymer/polymer.html"> <dom-module id="my-element"> <template> ... some html... </template> <script src="js/my-element.
<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>
在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);
有趣的是,我可以看到我的元素
在页面上得到了正确的渲染,其中包含了所有的阴影dom和其他内容。如果我在宿主网页的控制台中运行document.querySelector('my-element').init()
,则执行时不会出错。但是,在内容脚本中执行相同的代码会产生错误
我尝试将聚合物本身作为内容脚本。我遇到了
registerement
问题,但多亏了这个问题,我才解决了这个问题。在本例中,我在我的content.js
中定义了window.Polymer
。“我的元素”的API变得完全可访问,但现在当我将其附加到宿主网页的dom中时,它的影子dom没有呈现出来。您正在访问内容脚本的沙箱:
内容脚本在称为隔离脚本的特殊环境中执行
世界。他们可以访问所注入页面的DOM,
但是不允许使用页面创建的任何JavaScript变量或函数。
对于每个内容脚本,它看起来就像没有其他JavaScript一样
在运行它的页面上执行。反之亦然:
页面上运行的JavaScript无法调用任何函数或访问任何
由内容脚本定义的变量
从
聚合组件的脚本在主机页中运行,因此内容脚本不可见
您可以将一个新的脚本标记插入到主机页中,并从扩展名中的.js文件中获取它,例如
var script = document.createElement('<script>');
script.src = chrome.extension.getURL('something.js');
document.appendChild(script);
var script=document.createElement(“”);
script.src=chrome.extension.getURL('something.js');
文件。追加子文件(脚本);
这将在主机页的上下文中运行something.js
,授予它对主机页中所有其他脚本(包括您的聚合组件)的访问权限,但也使其对内容脚本不可见。请特别注意在主机页中注入脚本的步骤
如果您不能够/不愿意将所有扩展逻辑推入该注入脚本,例如,因为您需要访问
chrome.*
api或主机页和内容脚本之间的其他通信,请查看。您正在访问内容脚本的沙箱:
内容脚本在称为隔离脚本的特殊环境中执行
世界。他们可以访问所注入页面的DOM,
但是不允许使用页面创建的任何JavaScript变量或函数。
对于每个内容脚本,它看起来就像没有其他JavaScript一样
在运行它的页面上执行。反之亦然:
页面上运行的JavaScript无法调用任何函数或访问任何
由内容脚本定义的变量
从
聚合组件的脚本在主机页中运行,因此内容脚本不可见
您可以将一个新的脚本标记插入到主机页中,并从扩展名中的.js文件中获取它,例如
var script = document.createElement('<script>');
script.src = chrome.extension.getURL('something.js');
document.appendChild(script);
var script=document.createElement(“”);
script.src=chrome.extension.getURL('something.js');
文件。追加子文件(脚本);
这将在主机页的上下文中运行something.js
,授予它对主机页中所有其他脚本(包括您的聚合组件)的访问权限,但也使其对内容脚本不可见。请特别注意在主机页中注入脚本的步骤
如果您不能够/不愿意将所有扩展逻辑推入该注入脚本,例如,因为您需要访问
chrome.*
api或主机页和内容脚本之间的其他通信,请查看。您正在访问内容脚本的沙箱:
内容脚本在称为隔离脚本的特殊环境中执行
世界。他们可以访问所注入页面的DOM,
但是不允许使用页面创建的任何JavaScript变量或函数。
对于每个内容脚本,它看起来就像没有其他JavaScript一样
在运行它的页面上执行。反之亦然:
页面上运行的JavaScript无法调用任何函数或访问任何
由内容脚本定义的变量
从
聚合组件的脚本在主机页中运行,因此内容脚本不可见
您可以将一个新的脚本标记插入到主机页中,并从扩展名中的.js文件中获取它,例如
var script = document.createElement('<script>');
script.src = chrome.extension.getURL('something.js');
document.appendChild(script);
var script=document.createElement(“”);
script.src=chrome.extension.getURL('something.js');
文件。追加子文件(脚本);
这将在主机页的上下文中运行something.js
,授予它对主机页中所有其他脚本(包括您的聚合组件)的访问权限,但也使其对内容脚本不可见。请特别注意在主机页中注入脚本的步骤
如果您不能够/不愿意将所有扩展逻辑推入该注入脚本,例如,因为您需要访问
chrome.*
api或主机页和内容脚本之间的其他通信,请查看。您正在访问内容脚本的沙箱:
内容脚本在称为隔离脚本的特殊环境中执行
世界。他们可以访问所注入页面的DOM,
但是不允许使用页面创建的任何JavaScript变量或函数。
对于每个内容脚本,它看起来就像没有其他JavaScript一样
在运行它的页面上执行。反之亦然:
页面上运行的JavaScript无法调用任何函数或访问