我正试图在Firefox扩展的JavaScript中获得tinyMCE编辑器的实例。
当我在控制台中键入window.tinyMCE
时,它返回一个对象;但是,当试图在Firefox扩展中获得JavaScript中的tinyMCE编辑器实例时,我使用window.content.tinyMCE
并获得undefined
例如,我正在尝试查看带有Firefox扩展的页面上是否存在tinyMCE编辑器。这是我的代码:
if (window.content.tinyMCE) {
alert('its there!');
}
页面上存在TinyMCE编辑器,但不会提醒上述代码。当我执行alert(window.content.tinyMCE)
时,它会提醒undefined
。
在XUL中,Window.content
为主要内容窗口返回一个Window对象。https://developer.mozilla.org/en-US/docs/Web/API/Window/content
Window对象肯定在那里,因为当我在控制台中键入window.tinyMCE
时,它会返回tinyMCE对象。
有人知道我做错了什么吗?
最有可能的问题是扩展中的window
不是您期望的window
对象。
Firefox加载项通常在未定义全局window
和document
对象的范围内运行(是否定义它们取决于当前运行的代码部分的输入方式)。即使定义了它们,它们通常也不会定义为您期望的window
或document
(当前选项卡的window
/document
)。您可能需要为最近访问的窗口/选项卡获取对这两个对象的引用。
如果存在浏览器窗口(在某些情况下,您可能在不存在浏览器窗口的情况下运行,例如在启动时),您可以使用获得对最新浏览器window
、document
和gBrowser
的引用
if (window === null || typeof window !== "object") {
//If you do not already have a window reference, you need to obtain one:
// Add/remove a "/" to comment/un-comment the code appropriate for your add-on type.
/* Add-on SDK:
var window = require('sdk/window/utils').getMostRecentBrowserWindow();
//*/
//* Overlay and bootstrap (from almost any context/scope):
var window=Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
//*/
}
if (typeof document === "undefined") {
//If there is no document defined, get it
var document = window.content.document;
}
if (typeof gBrowser === "undefined") {
//If there is no gBrowser defined, get it
var gBrowser = window.gBrowser;
}
如果您正在运行代码以响应事件(例如按钮command
事件),则可以使用获得当前window
var window = event.view
缺少全局window
和document
对象,或者让它们引用你所期望的以外的东西,这是许多人在编写Firefox插件时遇到的问题。
注意:如果您希望与多进程Firefox(Electrolysis,或e10s)本机兼容,那么访问当前文档的内容将更加复杂。有一些垫片可以让你的代码在一段时间内继续使用多进程Firefox,但它们最终可能会消失。
参考文献:
nsIWindowMediator
- 使用chrome代码中的窗口
- SDK:窗口/utils
- SDK:windows
这个答案的大部分是从我以前的答案中复制的,包括这个链接和这里