chrome扩展执行脚本等待ajax响应完成

时间:2017-07-15 15:12:56

标签: javascript google-chrome

在Chrome扩展程序中,在executeScript函数中单击按钮,此按钮使用ajax呈现内容,我想等待内容加载,然后单击另一个按钮: 在background.js脚本中我有:

chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
    chrome.tabs.update(tabs[0].id, {url: tabs[0].url}, function () {
        chrome.tabs.executeScript({
            file: "scriptInjection.js"
        }, function (output) {
            if (output == 'test1') {
                sendData (output);
                //clearStorage();
            } else if (output == 'test2') {
                sendData (output);
                clearStorage();
            }
        });
    });
});

我在scriptInjection.js尝试了很多事情,例如我创建一个像这样的暂停函数: 在scriptInjection.js文件中我有:

function pause(milliseconds) {
    let dt = new Date();
    while ((new Date()) - dt <= milliseconds) {
    }
}

if (document.URL == "...") {
    all = document.querySelectorAll('span.fc-title');

    for (let i = 0; i < all.length; i++) {
        if (all[i].innerText == 'company') {
            all[i].click();
            var result = true;
            break;
        }
    }
    if (result === true) {
        pause(2000);
        reserve();
        output = 'test1';
    } else {
        document.querySelector("#calendar > div.fc-toolbar > div.fc-right > div > button.fc-next-button.fc-button.fc-state-default.fc-corner-right > span").click();
        all = document.querySelectorAll('span.fc-title');

        for (let i = 0; i < all.length; i++) {
            if (all[i].innerText == 'company') {
                all[i].click();
                var result = true;
                break;
            }
        }
        if (result === true) {              
            pause(2000);
            reserve();
            output = 'test1';
        }
    }
}

但是通过这种方式,脚本不会等到加载ajax内容,我使用setInterval作为保留功能,但它仍无法正常工作。 我在scriptInjection.js文件的scriptInjection.js文件中使用MutationObserver,但这不起作用:

      var observer = new MutationObserver(function () {
        reserve();
      });
      observer.observe(document.documentElement, {attributes: true, childList: true, characterData: true});

和保留功能:

function reserve(){
              let Shifts = document.getElementsByName("shifts");
              if (Shifts.length !== 0) {
                  for (let i = 0; i < Shifts.length; i++) {
                      Shifts[i].click();
                      break;
                  }
                  document.querySelector("#Btn").click();
              }

}

我读了这个链接,使用变异观察者“fjaguero.com/blog/using-mutationobservers-to-build-a-simple-extension/” 但我不知道在我使用内容脚本或执行脚本文件时,在chrome扩展中将变异观察者放在哪里?

1 个答案:

答案 0 :(得分:1)

我不会在内容脚本上使用executeScript功能。此外,始终更喜欢在内容和后台脚本之间使用the communication