我一直在搞Chrome擴展,以處理插入/替換hrefs到文件,以替代調用我的網絡上的下載服務器來執行您的行爲下載。我遇到的挑戰是,它不會顯示爲我可以定義內容腳本Javascript函數,我可以將所有onclick事件分配給。如何編寫一個Chrome擴展插入新的<a> onclick AJAX調用?
的manifest.json
{
"name": "Test",
"version": "0",
"background": {
"scripts": ["background.js"]
},
"manifest_version": 2,
"browser_action": {
"default_title": "Status",
"default_popup": "status.html",
"icons": ["icon.png"],
"default_icon": "icon.png"
},
"content_scripts": [ {
"js": [ "jquery.js", "content.js" ],
"css": ["customStyles.css"],
"matches": [ "http://*"]
}],
"permissions": [
"http://192.168.1.28/"
]
}
樣品我已經搞亂content.js:
$('.rRow1,.rRow2 .subject').find('a:first').each(function() {
$(this).after(" <a class='headerlink' href='#' onclick='queue(this);'>[Queue]</a>");
});
var queue = "http://192.168.1.28:8081/adddownload.req?URL=";
function queue(le) {
var link = $(le).attr('href');
alert("Queuing: " + link);
$.ajax({
type: 'GET',
url: queue,
dataType: 'html',
success: function(data) {
try {
console.log(data);
} catch(e) {
alert("Error: " + e.message);
return;
}
}
});
}
我的排隊功能拋出 「未捕獲的ReferenceError:隊列沒有定義」 在Chrome安慰。現在我知道內容腳本在「孤立的世界」中運行,現在我知道爲什麼排隊是未定義的。
我有點失落是一種實現所需功能的方式。我應該在後臺處理ajax調用,並從內容腳本發佈消息嗎?我也嘗試每個新插入的元素addEventListener沒有運氣。
更新 好吧,這就是我想出的。它是功能性的,但我真的不喜歡爲每個元素附加一個新的Ajax代碼副本。如果我有一種方法來引用一個完成這項工作的單一功能,那麼效率會更高。有什麼建議麼?
$('.rRow1,.rRow2 .subject').find('a:first').each(function() {
$(this).after(" <a class='dlqueue' href='#'>[Queue]</a>");
var link = $(this).attr('href');
$(this).next().click(function() {
$.ajax({
type: 'GET',
url: "http://192.168.1.28:8081/adddownload.req?URL="+encodeURIComponent(link),
dataType: 'html',
success: function(data) {
console.log("Download queued.");
}
});
});
});
這是做這種事情的最好方法嗎?謝謝!
您可以在content.js中定義所需的任何函數和變量,並且可以按照預期使用content.js訪問它們。它看起來像是遇到了問題,因爲您定義了url var和具有相同名稱的函數。 – abraham
聖地獄。就是這樣。你知道我從popup.js中取出了這個函數,我在這裏命名了var不同的東西,並沒有考慮在這裏重命名它。昨晚我正在擺弄這個......謝謝! – garlicman
無法重新編輯我的回覆,但這是一個問題,但不是問題。您可以將內容腳本中的函數附加到DOM中的元素,但不能從DOM中調用內容腳本中的函數,這正是我在第一個示例中所做的。 – garlicman