Chrome拒绝在注入的脚本中声明变量

时间:2012-01-19 20:55:32

标签: javascript greasemonkey

我有一个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控制台来运行代码时,它可以正常工作。

2 个答案:

答案 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