1

我想更改 Firefox 在拖放操作中的行为(用于修复此WONTFIX 错误并使用我的插件应用这个有点旧的补丁)。如何通过 XUL 覆盖覆盖此方法?我尝试了一些这样的代码:

<?xml version="1.0"?>
<!DOCTYPE override SYSTEM "chrome://dragdrop/locale/overlay.dtd">
<overlay id="ondrop-overlay"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 

      <binding id="tabbrowser">
          <implementation>
              <method name="onDrop">
                <body>
                ...
                </body>
              </method>
          </implementation>
      </binding>

</overlay>

尽管

overlay chrome://browser/content/tabbrowser.xml chrome://dragdrop/content/tabbrowser.xul

在我的 chrome.manifest 中,但我没有任何成功。请帮助我,谢谢:)

4

1 回答 1

2

覆盖仅适用于 XUL 文档,不适用于 XBL 绑定(它是 XUL 功能,不受 XBL 支持)。虽然您可以将元素的绑定替换为tabbrowser您自己的从原始绑定继承的绑定,但解决问题的更好方法是覆盖浏览器窗口以在其上下文中运行您的代码。然后该代码将修改tabbrowser窗口的实例。所以chrome.manifest你会写:

overlay chrome://browser/content/browser.xul chrome://dragdrop/content/browserOverlay.xul

并在browserOverlay.xul

<?xml version="1.0"?>
<overlay id="ondrop-overlay"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 
  <script type="application/x-javascript" src="browserOverlay.js"/>
</overlay>

最后,browserOverlay.js看起来像这样:

window.addEventListener("load", function(event)
{
  var browser = window.getBrowser();

  // Replace browser.onDrop method by own function but keep the original so that it
  // can be called later.
  var origOnDrop = browser.onDrop;
  browser.onDrop = function(aEvent, aXferData, aDragSession)
  {
    if (...)
    {
      // Your own processing of the call (start a search)
      ...
    }
    else
    {
      // Let the original function handle the call
      origOnDrop.apply(this, arguments);
    }
  };
});

请注意,上面的代码避免使用全局变量,所有变量都在函数内声明。这通常是一个很好的做法,因为您在浏览器窗口的上下文中运行 - 任何全局变量都与浏览器自己的代码共享,并且其他扩展的代码也在此上下文中运行。为它们的全局变量选择相同名称的两段代码可能会导致令人讨厌的问题,不使用任何全局变量是避免这种情况的最佳方法。


编辑:您显然正在查看过时的代码(Gecko 1.8 分支)。当前代码没有onDrop方法,而是选项卡容器元素上的适当事件处理程序。您无法替换事件处理程序 - 但您也不需要,因为如果拖动的文本不是链接,它不会做任何事情。因此,您可以简单地添加自己的事件处理程序来处理这种情况。

window.addEventListener("load", function(event)
{
  var browser = window.getBrowser();
  browser.tabContainer.addEventListener("drop", function(event)
  {
    if (...)
    {
      // This is a search string, do something with it
      ...
      // Indicate that we processed the event
      event.stopPropagation();
    }
  }, false);
});
于 2012-05-17T20:19:34.400 回答