首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖/覆盖XUL方法

覆盖/覆盖XUL方法
EN

Stack Overflow用户
提问于 2012-05-17 19:43:45
回答 1查看 1.2K关注 0票数 1

我想改变火狐在拖放操作上的行为(为了修复这个WONTFIX bug,并在我的插件中应用这个有点旧的patch )。如何通过XUL覆盖覆盖this方法?我尝试了一些这样的代码:

代码语言:javascript
复制
<?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>

代码语言:javascript
复制
overlay chrome://browser/content/tabbrowser.xml chrome://dragdrop/content/tabbrowser.xul

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-18 04:19:34

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

代码语言:javascript
复制
overlay chrome://browser/content/browser.xul chrome://dragdrop/content/browserOverlay.xul

browserOverlay.xul

代码语言:javascript
复制
<?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应该是这样的:

代码语言:javascript
复制
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);
    }
  };
});

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

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

代码语言:javascript
复制
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);
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10635103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档