为了访问网页页面的DOM,您需要programmatically inject some code进去(用chrome.tabs.executeScript()
)。这就是说,尽管可以将DOM作为一个字符串获取,但将其传递回弹出窗口,将其加载到一个新元素中,然后查找您想要的内容,这是一种非常糟糕的方法(出于各种原因)。
最好的选择(就效率和准确性而言)是在网页本身进行处理,然后将结果传递回弹出窗口。请注意,为了能够将代码注入网页,您必须在清单中的permissions
属性中包含相应的host match pattern。
我以上描述可以实现这样的:
editorMarket.js
var refresherID = 0;
var currentID = 0;
$(document).ready(function(){
$('.start-button').click(function(){
oldGroupedHTML = null;
oldIndividualHTML = null;
chrome.tabs.query({ active: true }, function(tabs) {
if (tabs.length === 0) {
return;
}
currentID = tabs[0].id;
refresherID = setInterval(function() {
chrome.tabs.reload(currentID, { bypassCache: true }, function() {
chrome.tabs.executeScript(currentID, {
file: 'content.js',
runAt: 'document_idle',
allFrames: false
}, function(results) {
if (chrome.runtime.lastError) {
alert('ERROR:\n' + chrome.runtime.lastError.message);
return;
} else if (results.length === 0) {
alert('ERROR: No results !');
return;
}
var nIndyJobs = results[0].nIndyJobs;
var nGroupJobs = results[0].nGroupJobs;
$('.lt').text('Indy: ' + nIndyJobs + '; '
+ 'Grouped: ' + nGroupJobs);
});
});
}, 5000);
});
});
$('.stop-button').click(function(){
clearInterval(refresherID);
});
});
content.js:
(function() {
function getNumberOfIndividualJobs() {...}
function getNumberOfGroupedJobs() {...}
function comparator(grouped, individual) {
var IndyJobs = getNumberOfIndividualJobs();
var GroupJobs = getNumberOfGroupedJobs();
nIndyJobs = IndyJobs[1];
nGroupJobs = GroupJobs[1];
console.log(GroupJobs);
return {
nIndyJobs: nIndyJobs,
nGroupJobs: nGroupJobs
};
}
var currentGroupedHTML = $(".grouped_jobs").html();
var currentIndividualHTML = $(".individual_jobs").html();
var result = comparator(currentGroupedHTML, currentIndividualHTML);
return result;
})();
我忘了响应给你,对不起!它进行了一些实验和测试,但最终我确实得到了与你所建议的非常接近的东西。谢谢!其中一个大问题是,除非我重新加载了整个扩展(这对于我的JS/HTML/CSS更新来说并非如此),否则清单不会自我刷新,这很有趣。它也花了我一点时间来获得正确的返回值 - 我的“返回值”;声明给出了一个空的对象。只写“价值”结束了工作。无论如何,谢谢一堆 – Free
很高兴它有帮助。应该在函数中使用'return' - 如果你删除了立即调用的函数表达式,那么你也需要删除'return'。 – gkalpak