【问题标题】:What's the difference between Chrome console and in-page javascript?Chrome 控制台和页内 javascript 有什么区别?
【发布时间】:2017-05-30 07:34:59
【问题描述】:

此 JavaScript 语句在 5 个月前在以前的 Chrome 版本中有效(作为 Chrome 扩展 content.js 的一部分):

require(["function-widget-1:share/util/service/createLinkShare.js"]).prototype.makePrivatePassword=function(){return prompt("Some Massage:","")};

但现在(在最新的 Chrome 中,作为 Chrome 扩展 content.js 的一部分)它是无效的,并且错误消息是“未捕获的 ReferenceError:未定义要求”。

但是,如果我在 Chrome 控制台(如在开发人员工具中)键入相同的语句,它现在(在最新的 Chrome 中)仍然有效。

所以我的问题是: 这两种情况有何不同?

【问题讨论】:

  • require 不是我的 Chrome 中已定义的函数...您确定您自己没有在某处包含 require 实现吗?
  • @deceze 我相信它包含在扩展程序应该工作的页面中
  • 控制台有一个上下文选择器。默认情况下,它是页面本身。为了让您的扩展程序能够访问页面上下文,您需要在脚本元素中注入代码,否则内容脚本无法访问页面功能,因为它在隔离环境中运行。
  • @wOxxOm 谢谢,但我想我确实通过包含 . manifest.json文件/内容js部分中的js文件
  • 注入内容脚本和在脚本元素中注入代码有很大的不同。

标签: javascript google-chrome google-chrome-extension


【解决方案1】:

您所看到的称为"Isolated world"

内容脚本在称为孤立世界的特殊环境中执行。他们可以访问被注入页面的 DOM,但不能访问页面创建的任何 JavaScript 变量或函数。它查看每个内容脚本,就好像它正在运行的页面上没有执行其他 JavaScript。反过来也是如此:页面上运行的 JavaScript 不能调用任何函数或访问任何由内容脚本定义的变量。

本质上,内容脚本运行在一个完全独立的 JS 上下文(想想“虚拟机”)中,附加到同一个 DOM 树并且看不到彼此的代码。

在使用开发工具控制台时,您可以通过其上方的下拉菜单(最初显示为“顶部”)切换 JS 上下文。它应该列出已经存在的内容脚本上下文。

可以跨越边界,让一些代码在页面自己的上下文中运行;这种技术通俗地称为“注入脚本”(不要与内容脚本的程序化注入混淆)或“页面级脚本”,并且被 this question 规范地涵盖。

但是,跨越此边界的任何代码都变得难以通信 - 因为它变得无法与页面自己的代码区分开来,如前所述,这些代码对内容脚本是不可见的。涉及此问题的几个问题:with content scriptwith background

【讨论】:

  • 非常感谢!这正是我正在寻找的。 AMD 样式 'require()' 是通过在网页头部导入的 '
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
相关资源
最近更新 更多