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