无法在XUL Firefox扩展中获取TinyMCE的实例

Cannot get instance of TinyMCE in XUL Firefox extension

本文关键字:获取 TinyMCE 实例 扩展 XUL Firefox      更新时间:2023-09-26

我正试图在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加载项通常在未定义全局windowdocument对象的范围内运行(是否定义它们取决于当前运行的代码部分的输入方式)。即使定义了它们,它们通常也不会定义为您期望的windowdocument(当前选项卡的window/document)。您可能需要为最近访问的窗口/选项卡获取对这两个对象的引用。

如果存在浏览器窗口(在某些情况下,您可能在不存在浏览器窗口的情况下运行,例如在启动时),您可以使用获得对最新浏览器windowdocumentgBrowser的引用

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

缺少全局windowdocument对象,或者让它们引用你所期望的以外的东西,这是许多人在编写Firefox插件时遇到的问题。

注意:如果您希望与多进程Firefox(Electrolysis,或e10s)本机兼容,那么访问当前文档的内容将更加复杂。有一些垫片可以让你的代码在一段时间内继续使用多进程Firefox,但它们最终可能会消失。

参考文献:

  1. nsIWindowMediator
  2. 使用chrome代码中的窗口
  3. SDK:窗口/utils
  4. SDK:windows

这个答案的大部分是从我以前的答案中复制的,包括这个链接和这里