我有一个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