我有一個Greasemonkey腳本,它將JavaScript注入到應該添加超鏈接的頁面中,該頁面在單擊時調用變量。該變量是隱藏鏈接並顯示玩家的函數。但是,當我單擊鏈接時,頁面錯誤日誌表示playaudio未定義。這裏是我的代碼:Chrome拒絕在注入的腳本中聲明變量
// ==UserScript==
// @name AudioPlayer
// @include http://mysite.com/*
// ==/UserScript==
function exec(fn) {
var script = document.createElement('script');
script.setAttribute("type", "application/javascript");
script.textContent = '(' + fn.toString() + ')();';
document.body.appendChild(script); // run the script
//document.body.removeChild(script); // clean up
}
window.addEventListener("load", function() {
exec(function() {
jQuery(".field-name-field-mp3link").append('<audio controls="" autoplay="" style="margin-left:10px; display:none;" src=""></audio>');
var playaudio = (function() {
jQuery('.field-name-field-mp3link > audio').attr('src', jQuery('.field-name-field-mp3link > .field-items > .field-item > a').attr('href'));
jQuery('.field-name-field-mp3link > audio').css('display', 'block');
jQuery('.field-name-field-mp3link > a').css('display', 'none');
});
jQuery(".field-name-field-mp3link").append('<a href="javascript:playaudio();" style="margin-right:5px;">Listen</a>');
});
}, false);
我要補充一點,它完美的作品時,我使用Chrome的內置的JavaScript控制檯來運行代碼。
謝謝,這有幫助。我把它保持爲一個錨,所以它仍然是一個常規鏈接,但我將href更改爲「javascript :;」。我也注意到我的邊距設置錯了。我認爲你把它混淆在你的例子中,但後來我檢查了一下,果然是這樣,它是保證金 - 正確的(它應該是保證金)。謝謝 –
如果我理解正確,jQuery.click只是將playaudio中的代碼傳遞給click處理程序,對嗎? –
是的。 'click'和其他事件,執行一個實際的函數。你可以直接傳遞一個函數,例如:'.click(function(e){...})'。雖然,首先聲明函數有好處,其中之一就是如果你想在不同的事件或不同時間調用相同的**'playaudio'函數。 – rgthree