Javascript 页面重定向后如何调用Chrome扩展功能?

Javascript 页面重定向后如何调用Chrome扩展功能?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在构建一个Javascript(浏览器中)Instagram机器人。然而,我遇到了一个问题 如果运行此脚本,将调用第一个函数,并将页面重定向到“”,然后立即调用第二个函数(在页面更改为新URL之前的上一个URL上)。有没有办法在第二个URL完全加载后调用第二个函数 我已经尝试将其设置为Window setInterval()方法,并使用Window.onload和一些其他方法来延长时间。然而,我似乎什么也做不到。有人有解决办法吗 这是我的第一个chrome扩展,也是我的第一个真正的项目,所以

我正在构建一个Javascript(浏览器中)Instagram机器人。然而,我遇到了一个问题

如果运行此脚本,将调用第一个函数,并将页面重定向到“”,然后立即调用第二个函数(在页面更改为新URL之前的上一个URL上)。有没有办法在第二个URL完全加载后调用第二个函数

我已经尝试将其设置为Window setInterval()方法,并使用Window.onload和一些其他方法来延长时间。然而,我似乎什么也做不到。有人有解决办法吗

这是我的第一个chrome扩展,也是我的第一个真正的项目,所以我可能错过了一些简单的东西

manifest.json

    {
  "name": "Inject Me",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Injecting stuff",
  "homepage_url": "http://danharper.me",
  "background": {
    "scripts": [
      "background.js"
    ],
    "persistent": true
  },
  "browser_action": {
    "default_title": "Inject!"
  },
  "permissions": [
    "https://*/*",
    "http://*/*",
    "tabs"
  ]
}
inject.js

  (function() {

  let findUrl = () => {
    let hashtag = "explore/tags/samplehashtag/";
    location.replace("https://www.instagram.com/" + hashtag);
  }

  findUrl();
})();
background.js

    // this is the background code...

// listen for our browerAction to be clicked
chrome.browserAction.onClicked.addListener(function(tab) {
  // for the current tab, inject the "inject.js" file & execute it
  chrome.tabs.executeScript(tab.ib, {
    file: 'inject.js'
  });

});

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {

  chrome.tabs.executeScript(tab.ib, {
    file: 'inject2.js'
  });


});
inject2.js

(function() {

if (window.location.href.indexOf("https://www.instagram.com/explore/tags/samplehashtag/") != -1){
  let likeAndRepeat = () => {
    let counter = 0;
    let grabPhoto = document.querySelector('._9AhH0');

    grabPhoto.click();

    let likeAndSkip = function() {
      let heart = document.querySelector('.glyphsSpriteHeart__outline__24__grey_9.u-__7');
      let arrow = document.querySelector('a.coreSpriteRightPaginationArrow');

      if (heart) {
        heart.click();
        counter++;
        console.log(`You have liked ${counter} photographs`)
      }
      arrow.click();
    }

    setInterval(likeAndSkip, 3000);
    //alert('likeAndRepeat Inserted');
  };

  likeAndRepeat();

}
})();

从问题和示例中不清楚何时要运行函数。但是在chrome扩展中有一种叫做消息传递

通过消息传递,您可以将消息从一个文件传递到另一个文件,并类似地侦听消息。 因此,从您的用例来看,您可以侦听特定消息,然后启动您的方法

比如说

background.js

chrome.runtime.sendMessage({message: "FIRE_SOME_METHOD"})


popup.js

    chrome.runtime.onMessage.addListener(
    function(request) {

    if (request.message == "FIRE_SOME_METHOD")
      someMethod();
  });
编辑 另外,如果您想侦听URL更改,只需将提供的侦听器放在中即可


对不起,我不清楚。。基本上,我想在调用findUrl函数和新URL(在本例中为“instagram.com/explore/tags/samplehashtag”)后调用likeAndRepeat函数已完全加载。我不认为将此传递给另一个js文件将解决此问题。也许我只是没有正确看待此问题?我更新了我的答案,因此希望我正在尝试做的事情更加清楚:)我也更新了我的答案,请检查并尝试它是否解决了您的问题。嗯。。似乎还是不起作用。看来这条路绝对是对的。我应该把它放在我的background.js文件中,对吗?是的,你可以把它放在你的background.js文件中。当你的脚本重定向到新的URL时,内容脚本的当前实例将与旧URL上的旧页面一起销毁。这是因为您的
标签
不是标签,只是一个URL路径。我想您应该单击页面中使用元素的链接。单击()以便页面使用历史API进行自我导航,然后通过setTimeout进行暂停,或者使用MutationObserver等待新内容,最后单击like按钮。我使用元素时遇到的问题。单击实际上没有“提交”用于搜索字段的按钮。它在您键入时加载。因此,将字符串注入搜索栏实际上不能导致搜索表单提取结果。至少我没有试过。你可以用document.execCommand模拟用户键入。这很有趣。。你能提供一个你将如何做到这一点的例子吗??可能会让我的解决方案更干净。。搜索栏将位于instagram.com上
  chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
      console.log('updated tab');
  });