Javascript 如何将元素数据获取到调试器脚本?
我正试图为一个特定的网站编写我的第一个chrome扩展,自动下载该网站加载的流。我已经使用chrome.debugger api下载了流,但现在我想使用网站上的数据自动命名流 首先,让我给你一些相关的脚本:Javascript 如何将元素数据获取到调试器脚本?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正试图为一个特定的网站编写我的第一个chrome扩展,自动下载该网站加载的流。我已经使用chrome.debugger api下载了流,但现在我想使用网站上的数据自动命名流 首先,让我给你一些相关的脚本: manifest.json --------------------------------------- { "name": "Downloader script", "description": "Downloads stuff", "version": "0.1", "permissi
manifest.json
---------------------------------------
{
"name": "Downloader script",
"description": "Downloads stuff",
"version": "0.1",
"permissions": [
"debugger",
"downloads"
],
"background": {
"scripts": ["background.js"]
},
"browser_action": {
"default_icon": "icon.png",
"default_title": "Downloader"
},
"manifest_version": 2
}
这是background.js,它显示一个窗口,说明所有已下载的文件
background.js
--------------------------
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.debugger.attach({tabId:tab.id}, version,
onAttach.bind(null, tab.id));
});
var version = "1.0";
function onAttach(tabId) {
if (chrome.runtime.lastError) {
alert(chrome.runtime.lastError.message);
return;
}
chrome.windows.create(
{url: "headers.html?" + tabId, type: "popup", width: 400, height: 600});
}
下面是非常简单的headers.html,称为:
<html>
<head>
<style>
body {
font-family: monospace;
word-wrap: break-word;
}
#container {
white-space: pre;
}
.request {
border-top: 1px solid black;
margin-bottom: 10px;
}
</style>
<script src="headers.js"></script>
</head>
<body>
<div id="container"></div>
</body>
</html>
现在,我从中获取流的网站具有以下结构:
<div id="trackInfo" class="unselectable">
<div class="contents" style="display: block;">
<div class="info">
<div class="trackData">
<div><a href="http://www.linktowebsite" class="songTitle" address="true">This is the song title i want to grab</a></div>
<div><i class="byText">by</i> <a href="http://www.artistlink" class="artistSummary" address="true">Artist name i want to grab</a>
</div>
<div><i class="onText">on</i> <a class="albumTitle" address="true" href="http://www.albumlink" style="">Album title i want to grab</a></div>
</div>
</div>
</div>
</div>
我的问题是:如何从我认为调用DOM的页面中获取元素数据,并将其与chrome.downloads api一起使用?由于headers.js文件与网页本身无关,所以我认为它只是网络部分
PS:我第一次在这里发帖,也欢迎对我的帖子提出建设性的批评。我感觉你在用榴弹炮猎杀松鼠,利用调试器拦截网络请求并将DOM注入页面 对于拦截网络请求,有专门的API 您可以将一个侦听器附加到chrome.webRequest.onBeforeRequest,您将获得与chrome.debugger.onEvent侦听器中使用的信息相同的信息 为了注入DIV并从DOM读取数据,您只需要一个 下面的代码将假设您也将使用jQuery,没有理由不使用它,使用它更容易操作DOM。这只是一个框架代码 您可以指定一个内容脚本,以便始终加载到音乐服务上,并使用chrome.runtime.onMessage从后台收听消息: 至于提取歌曲细节,jQuery是您的朋友。您需要拿出一个选择器来选择您需要的元素:
// Inside content script
var songName = $("#trackInfo .songTitle").text();
// etc.
我感觉你在用榴弹炮猎杀松鼠;看一看,这是一个很好的机会;我只是通过修改其他示例代码来学习,所以这可能要简单得多。尽管如此,我如何从background.js获取元素数据呢?但是如果我想打开/关闭它呢?我能用browserAction.onClicked替换onMessage吗?同样,我是这里的第一个新手,仍然试图理解所有命令的作用。不添加下载链接?只是不要在onBeforeRequest中发送消息。好吧,我的弹出窗口的输出只是为了测试,我实际上希望这个脚本在后台运行,但仍然能够打开/关闭自动下载,用一个按钮启用/禁用整个脚本。我实际上刚刚注意到你打开了一个弹出窗口,没有在歌曲页面中添加div。。如果需要,可以继续打开弹出窗口,忽略用于构建的代码,但仍可以使用歌曲页面中的内容脚本来检索歌曲数据。请继续阅读将数据返回到后台的方法。恐怕您的其他问题超出了Stack Overflow可接受的格式。如果您还有其他问题,请提出新问题。不过,请注意,一般来说,这并不是初学者提问的好资源。一定要先深入阅读。我并不反对对你进行一些指导,但这必须在外部进行;在个人资料中留下一些联系信息。
chrome.runtime.onMessage.addListener(function(message) {
if(message.songUrl){
var newSong = $('<div>').text(New song is being downloaded...);
/* fill the <div> and append it to the page */
}
});
chrome.webRequest.onBeforeRequest.addListener(
function(details){
if (details.url.indexOf("//audio") > -1) {
chrome.tabs.sendMessage(tabId, {songUrl: details.url});
}
return {}; // Do not modify the request
},
/* filter details */
);
// Inside content script
var songName = $("#trackInfo .songTitle").text();
// etc.