【问题标题】:Cannot get instance of TinyMCE in XUL Firefox extension无法在 XUL Firefox 扩展中获取 TinyMCE 的实例
【发布时间】:2016-05-10 18:47:46
【问题描述】:

我正在尝试在 JavaScript 中为 Firefox 扩展获取 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 对象。

有人知道我做错了什么吗?

【问题讨论】:

  • 没有代码,这个问题可能跑题了:寻求调试帮助的问题(“为什么这段代码不能按我想要的方式工作?”)必须包括:A ) 期望的行为; B) 一个特定的问题或错误 C) 重现它所需的最短代码所有在问题本身 .没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable ExampleWhat topics can I ask about here?How to Ask
  • 更好。但是,很大程度上取决于您在扩展程序中使用的window。除非您在扩展程序中明确定义了window,否则它可能不是您认为的那样。几乎可以肯定,它与控制台中的 window 不是同一个对象。 window 是否在您运行的上下文中定义?
  • 我希望从您那里获得的大部分内容(包括代码)是您如何在扩展程序中定义/获得 window 对象,您正在运行代码的上下文(内容脚本/主扩展代码),以及您正在编写的kind of Firefox extension
  • 从您将其标记为 XUL 的事实来看,它可能Overlay/XULRestartless 扩展名。但是,很多人在其他问题上都感到困惑。所以,应该确认它不是 Add-on SDKWebExtensions 附加组件(特别是考虑到后两者在这一点上更常见)?

标签: javascript firefox-addon tinymce xul tinymce-4


【解决方案1】:

最可能的问题是您的扩展程序中的 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 插件时遇到的问题。

注意:如果您希望与multi-process Firefox(Electrolysis 或 e10s)原生兼容,那么访问当前文档的内容会更加复杂。有一些 shims 可以让您的代码在多进程 Firefox 中继续工作一段时间,但它们可能/将会最终消失。

参考资料:

  1. nsIWindowMediator
  2. Working with windows in chrome code
  3. SDK:window/utils
  4. SDK:windows

这个答案的大部分内容是从我之前的答案中复制而来的,包括this linkhere

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多