在CrossRider内部创建的全局变量's的appAPI.ready()函数对页面不可用
Global variable created inside CrossRider's appAPI.ready() function not available to page?
我正在尝试使用CrossRider创建一个Chrome扩展,并且正在努力创建一个全局变量。
如果点击按钮,我的扩展基本上会动态地将一些JavaScript文件附加到页面上,我还需要它来创建一个全局变量并设置一些属性。
我尝试了以下方法:
appAPI.ready(function($) {
console.log('inside crossrider extension ready()');
window.foobar = 'barfoo';
return;
});
当我刷新页面时,消息inside crossrider extension ready()
会打印到控制台,所以我知道扩展已经加载并工作,但当我尝试在控制台中执行window.foobar
或foobar
时,会抛出一个错误,说它未定义。
这是我第一次创建扩展,那么我缺少什么呢?为什么我在CrossRider的appAPI.ready()
函数中创建的全局变量在它之外不可用?
我找不到重复的目标,所以我将解释发生了什么。
我不知道Crossrider的术语,但当Chrome扩展在页面中执行代码时,这被称为内容脚本。
但是,代码并不是在与页面本身相同的上下文中执行的。它被称为一个孤立的世界,这意味着window
对象是不共享的。
内容脚本在一个称为孤立世界的特殊环境中执行。他们可以访问被注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。它查看每个内容脚本,就好像在它运行的页面上没有其他JavaScript执行一样。反过来也是如此:在页面上运行的JavaScript无法调用任何函数或访问内容脚本定义的任何变量。
因此,如果要设置页面可访问的变量,则需要在页面上下文中进行设置。怎样有很多方法,但它们都相当于在页面中插入一个<script>
元素。
var script = document.createElement('script');
script.textContent = "window.foobar = 'barfoo';";
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
所有这些都假设您无法控制所讨论的页面。若您这样做了,还有其他方法来传递页面,因为DOM是共享的。例如,如果页面侦听自定义DOM事件,则可以引发该事件。
- jQuery加载的async和ready函数不工作
- 如何通过documents.ready函数中的javascript自动按键(ctrl+shift+i)
- 停止对document.ready函数的重定向/刷新
- ready函数在每个页面中触发
- 函数从$(document).ready外部调用在$(document).ready中定义的函数
- 如果没有document.ready(),我怎么能拥有多个javascript函数呢
- 重载像$(document).ready这样的函数是错误的
- $(document)中的多个javascript函数.ready不工作
- JavaScript执行从函数声明开始,而不是从$(document).ready()开始
- 编写没有加载和.ready函数的JavaScript
- 在 $( 文档 ).ready 函数中使用字符串名称调用 javascript 函数
- 调用 Document.ready 外部的 AJAX 函数
- 在CrossRider内部创建的全局变量's的appAPI.ready()函数对页面不可用
- jQuery的事件处理程序运行良好,但应该't,因为它's不在ready()函数中
- 函数在例如$(document).ready()上注册时的通知
- 如何在document.ready(function)时运行隐藏函数和动画
- 超越了在document.ready()中编写简单函数
- Javascript on click事件在函数中不起作用,但在document.ready()中起作用
- 为什么document.ready中的事件处理程序函数有效但无效;取出后不起作用
- 如何调用函数ready()中的函数