我正在尝试使用内容脚本导航网页。但是,该函数一直在运行,因为每次页面更改时它都会通过脚本运行。我想知道是否有更好的方法来做这件事,因为它是一种资源匮乏,并且由于不断更新而不允许用户与页面交互。
这里是有问题的代码,抱歉,如果它看起来很奇怪。我在jQuery中没有超过几周的知识。
$(document).ready(function(){
console.log("Made it here" + window.location.href);
loc = window.location.href;
match = loc.match('http://url.com/uc/');
if (match) {
window.location = "http://url.com/uc/health/index/1";
console.log("2 here");
window.location = "http://url.com/uc/health/communication/createSelectTemplate";
console.log("3 here");
chrome.storage.local.get('formOption', function(result) {
document.getElementById('formTemplate').value = result.formOption;
document.forms[0].submit();
});
}
});
我必须在使用值之前导航三个窗口的原因是因为制作此网站的任何人都有超时cookie并且在上一个加载之前无法调用这些页面。 这是一个内容脚本,因此所有代码都在下一页。也许如果有办法检查确切的网址?但是当我玩那一段时间后,电脑并没有区分。
urlhere.com/uc/
和
urlhere.com/uc/health/index/1
答案 0 :(得分:2)
每次导航时(例如,在分配window.location
后立即),您的脚本停止执行都会随页面一起卸载,并且当下一页加载时,内容脚本确实会再次加载。如果相同的脚本加载了相同的初始状态,它当然会执行相同的操作。
可能的解决方案(有很多):
更精确地匹配(=更好地注意实际变化的状态)。
loc.match('http://url.com/uc/')
只会检查地址是否包含该字符串 - 您显示的所有网址都是如此。为什么不使用loc == 'http://url.com/uc/'
(并检查中间页面)?
使用细粒度内容脚本(=加载不同的脚本)。
Manifest定义哪些页面可以加载哪些脚本。我假设你有类似的东西:
"content_scripts" : [{
"js" : ["jquery.js", "content1.js"],
"matches": ["http://*"]
}]
您可以制作多个脚本并让Chrome解析这些网址。例如,content1.js
将执行第一次重定向,content2.js
将执行第二次重定向。
"content_scripts" : [{
"js" : ["jquery.js", "content1.js"],
"matches": ["http://url.com/uc/"]
}, {
"js" : ["jquery.js", "content2.js"],
"matches": ["http://url.com/uc/health/index/1"]
}]
使用一些持久状态(在导航之间持续存在)来指示您所在的重定向阶段(=控制自己改变状态)。
页面的sessionStorage
非常适用于此,因为它只在标签中保持不变:
if (match) {
switch (sessionStorage.redirectStage) {
case 3:
// We're at the final page, do actual work
break;
case 2:
sessionStorage.redirectStage = 3;
window.location = "http://url.com/uc/health/communication/createSelectTemplate";
break;
default: // Includes initial state when it's unset
window.location = "http://url.com/uc/health/index/1";
}
}