当前位置: 首页 > 面试题库 >

Firefox插件pageMod,捕获contentScriptFile中完成的Ajax

辛星宇
2023-03-14
问题内容

我的问题是我需要知道何时在页面上完成AJAX。我需要在我通过pageMod加载的contentScriptFile中知道这一点。我的插件需要在每次修改页面时运行:因此基本上是在加载页面时以及每次有AJAX调用时运行。

我尝试了这个:

$(document).ajaxComplete(function() {
     alert("AJAX call completed");
});

但它不起作用。

有没有办法做到这一点?

编辑:来自main.js的我的页面mod代码:

pageMod.PageMod({
     include: "*",
     contentScriptFile: [self.data.url("jquery-1.9.1.min.js"), 
     self.data.url("script.js")],

     onAttach: function(worker){

      var apiKey = require("sdk/simple-prefs").prefs.apiKey;
      var ignoreList = require("sdk/simple-prefs").prefs.ignoreList;

      worker.port.emit("prefSet", [ignoreList, apiKey]);

      }

});

问题答案:

不要将其放在内容脚本中:我不确定如何识别脚本的内容窗口。我不太了解SDK。但是看面积CONTENT_WINDOW_OF_CONTENT_SCRIPT

const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components;
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/devtools/Console.jsm');

var observers = {
    'http-on-modify-request': {
        observe: function (aSubject, aTopic, aData) {
            console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
            var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
            var requestUrl = httpChannel.URI.spec
            var goodies = loadContextAndGoodies(aSubject, true);
            if (goodies.contentWindow) {
               if (goodies.contentWindow == CONTENT_WINDOW_OF_CONTENT_SCRIPT) {
                    //do something here
               }
            }
        },
        reg: function () {
            Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false);
        },
        unreg: function () {
            Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request');
        }
    }
};

然后在相同的范围内添加此辅助函数:

function loadContextAndGoodies(request, return_goodies) {
  var loadContext = null;

  if (request instanceof Ci.nsIRequest) {
      try {
          if (request.loadGroup && request.loadGroup.notificationCallbacks) {
              loadContext = request.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext);
          }
      } catch (ex) {
        console.exception('request loadGroup with notificationCallbacks but oculd not get nsIloadContext', ex);
      }
      if (!loadContext) {
        try {
            if (request.notificationCallbacks) {
                loadContext = request.notificationCallbacks.getInterface(Ci.nsILoadContext);
            }
        } catch (ex) {
          console.exception('request has notificationCallbacks but could not get nsILoadContext', ex);
          /* start - noit's backup try, it might be redundant (im not sure) as Wladamir Palant didn't have this way*/
          try {
            var interfaceRequestor = httpChannel.notificationCallbacks.QueryInterface(Ci.nsIInterfaceRequestor);
            loadContext = interfaceRequestor.getInterface(Ci.nsILoadContext);
          } catch (ex) {
            console.exception('backup method failed:' ex);
          }
          /* end - my backup try, it might be redundant as Wladamir Palant didn't have this way*/
        }
      }
  } else {
    console.warn('request argument is not instance of nsIRequest')
  }

  if (return_goodies) {
    if (!loadContext) {
      return null;
    }

    var contentWindow = loadContext.associatedWindow;
    var DOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor)
                                     .getInterface(Ci.nsIWebNavigation)
                                     .QueryInterface(Ci.nsIDocShellTreeItem)
                                     .rootTreeItem
                                     .QueryInterface(Ci.nsIInterfaceRequestor)
                                     .getInterface(Ci.nsIDOMWindow);
    var gBrowser = DOMWindow.gBrowser;
    if (gBrowser) {
      var tab = gBrowser._getTabForContentWindow(contentWindow.top);
      var browser = tab.linkedBrowser;
    } else {
      var tab, browser = null;
    }
    var goodies = {
      loadContext: loadContext,
      DOMWindow: DOMWindow,
      gBrowser: gBrowser,
      contentWindow: contentWindow,
      browser: browser,
      tab: tab
    };

    return goodies;
  } else {
    return loadContext;
  }
}

开始观察

要开始观察所有请求,请执行此操作(例如,在启动插件时)

for (var o in observers) {
    observers[o].reg();
}

停止观察

停止观察很重要(确保至少在插件关闭时运行此命令,由于内存原因,您不想让观察者注册)

for (var o in observers) {
    observers[o].unreg();
}


 类似资料:
  • 问题内容: 当从父页面完全加载iframe的内容时,是否可以捕获? 问题答案: 元素有一个 事件。 您如何聆听该事件取决于您,但是通常最好的方法是: 1)以编程方式创建iframe 通过确保在iframe开始加载 之前附加监听器,可以确保始终调用您的监听器。 __ 2)内联javascript ,是您可以在HTML标记内使用的另一种方法。 3)您也可以将事件侦听器附加在标记内 的元素之后,但请记住

  • JavaEye的Firefox插件为你提供更多功能扩展。下载后用firefox打开该文件即可安装,适用版本Firefox3+,在Windows/Ubuntu上测试通过。 JavaEye的插件安装好后,你会在firefox的地址栏左边发现多了2个按钮: 在查看JavaEye的收藏箱的时候,支持下列鼠标事件: 1. 鼠标左键在当前窗口打开收藏链接 2. 鼠标中键在新的标签页打开收藏链接 3. 鼠标右键

  • 问题内容: 我有一个相当简单的Angular应用程序,可以在我的开发机上正常运行,但是在部署它后却出现此错误消息(在浏览器控制台中)失败: 除此之外,没有其他消息。页面首次加载时会发生这种情况。 我正在运行ASP.NET MVC5,Angular 1.2RC3,并通过git推送到Azure。 谷歌搜索还没有发现任何有趣的东西。 有什么建议? 编辑: 我正在使用TypeScript,并用该变量定义依

  • 我向我的IntelliJ插件添加了一个自动完成功能,如下所示: 我如何格式化我要放在编辑器上的新方法?我不需要自定义格式,只需要IntelliJ的默认格式

  • 问题内容: 有人可以告诉我如何使用Java为我的客户firefox配置文件禁用插件吗?我发现有几个网站显示要添加加载项,但是关于禁用插件一无所获。 我的Firefox配置文件: 问题是默认情况下启用了某些插件。Adobe Acrobat,Google Update,Java,Microsoft Office,Flash,Director和Silverlight的Shockwave。 我需要禁用其中

  • 问题内容: 有人可以告诉我如何使用Java为我的客户firefox配置文件禁用插件吗?我发现有几个网站显示要添加加载项,但是关于禁用插件一无所获。 我的Firefox配置文件: 问题是默认情况下启用了某些插件。Adobe Acrobat,Google Update,Java,Microsoft Office,Flash,Director和Silverlight的Shockwave。 我需要禁用其中