我正在开发 Chrome 的扩展程序。我希望解析“原始”Gmail 邮件(当前查看的邮件)的内容。
我尝试使用 jQuery.load() 如下
$(windows).load(function() { alert(GLOBALS); });
并将其放在内容脚本中,但它也不起作用。我正在使用 Chrome 的开发人员工具,它在调用alert(GLOBALS);
alert(GLOBALS);
未捕获的 ReferenceError:未定义 GLOBALS
虽然,当使用开发人员工具的控制台时,在控制台中输入GLOBALS它会返回一个数组。
GLOBALS
任何线索如何从内容脚本访问 GLOBALS?
1内容脚本在隔离环境中运行。要访问(页面的window)任何全局属性,您必须注入一个新<script>元素,或者使用事件侦听器来传递数据。
window
<script>
请参阅此答案,例如在<script>页面上下文中注入元素。
contentscript.js("run_at": "document_end"在清单中):
"run_at": "document_end"
var s = document.createElement('script'); s.src = chrome.extension.getURL('script.js'); (document.head||document.documentElement).appendChild(s); s.onload = function() { s.remove(); }; // Event listener document.addEventListener('RW759_connectExtension', function(e) { // e.detail contains the transferred data (can be anything, ranging // from JavaScript objects to strings). // Do something, for example: alert(e.detail); });
script.js- 位于扩展目录中,这将被注入页面本身:
script.js
setTimeout(function() { /* Example: Send data from the page to your Chrome extension */ document.dispatchEvent(new CustomEvent('RW759_connectExtension', { detail: GLOBALS // Some variable from Gmail. })); }, 0);
由于此文件是通过 chrome-extension: URL 从 DOM 中加载的,因此必须将“script.js”添加到清单文件的 web_accessible_resources 部分。否则 Chrome 将拒绝加载脚本文件。
您应该在网页中运行尽可能少的逻辑,并在内容脚本中处理大部分逻辑。这有多种原因。首先,任何注入页面的脚本都在与网页相同的上下文中运行,因此网页可以(有意或无意地)修改 JavaScript/DOM 方法,从而使您的扩展程序停止工作。其次,内容脚本可以访问额外的功能,例如 chrome.* API 的有限子集和跨域网络请求(前提是扩展程序已声明这些权限)。