Chrome 拒绝在注入的脚本中声明变量
Chrome refuses to declare variable in injected script
我有一个Greasemonkey脚本,它将javascript注入页面,该页面应该添加一个超链接,该超链接在单击时调用变量。变量是隐藏链接并显示播放器的函数。但是,当我单击链接时,页面错误日志显示未定义播放音频。这是我的代码:
// ==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 控制台来运行代码时,它运行良好。
从外观上看,您正在声明函数的本地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
变量绑定到由 exec
运行的匿名函数的上下文中。
href javascript:playaudio();
是在全球背景下对playaudio
的呼吁,即对window.playaudio
的呼吁,这确实没有定义。
尝试用 window.playaudio
替换var playaudio
。
相关文章:
- 使用同一对象中的其他变量声明变量
- 用||声明变量
- 使用javascript使用for循环声明变量
- JavaScript-用for循环项声明变量
- try声明变量的作用域
- 有没有一种方法可以使用函数参数的值来声明变量
- 在使用javascript再次声明变量之前,请先清除或删除该变量
- Javascript未声明变量
- 在Javascript中,我可以在声明变量之前使用它吗
- 在html文档的开头声明变量
- 按什么顺序声明变量和函数
- 如何以正确的方式在jQuery中声明变量
- 在 Angular 服务中接收函数的未声明变量
- 字典和声明变量
- 需要一些有关以以下样式声明变量的信息
- 在 jQuery 中使用常量声明变量
- 从外部文件在打字稿中声明变量得到引用错误:..未定义
- JavaScript,声明变量时混淆语法
- 在 javascript 函数和内存管理中声明变量
- Javascript 使用 if 语句声明变量