我有一个Greasemonkey脚本,它将javascript注入到页面中,该页面应该添加一个超级链接,在单击时调用一个变量。变量是隐藏链接并显示玩家的功能。但是,当我单击该链接时,页面错误日志表明未定义playaudio。这是我的代码:
// ==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控制台来运行代码时,它可以正常工作。
答案 0 :(得分:2)
从它的外观来看,您声明函数的playaudio
是本地的,因此点击超链接javascript:playaudio();
将不起作用,因为playaudio
不在全局范围内。
var playaudio = (function(){...});
jQuery(".field-name-field-mp3link").append('<span style="margin-right:5px;">Listen</span>');
jQuery(".field-name-field-mp3link > span").click(playaudio);
编辑:通过将playaudio保持在上述本地范围内并通过注入元素上的点击处理程序调用它,您可以避免污染文档的全局范围,尤其是,如果在脚本被注入之前,文档已经在窗口上有一个“playaudio”方法...
答案 1 :(得分:0)
您的playaudio
变量似乎绑定到exec
运行的匿名函数的上下文。
javascript:playaudio();
href是对全局上下文中playaudio
的调用,i。即到window.playaudio
这确实是未定义的。
尝试将var playaudio
替换为window.playaudio
。