2012-01-19 64 views
2

我有一个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控制台来运行代码。

回答

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”方法在您的脚本被注入之前的窗口...

+0

谢谢,这有帮助。我把它保持为一个锚,所以它仍然是一个常规链接,但我将href更改为“javascript :;”。我也注意到我的边距设置错了。我认为你把它混淆在你的例子中,但后来我检查了一下,果然是这样,它是保证金 - 正确的(它应该是保证金)。谢谢 –

+0

如果我理解正确,jQuery.click只是将playaudio中的代码传递给click处理程序,对吗? –

+0

是的。 'click'和其他事件,执行一个实际的函数。你可以直接传递一个函数,例如:'.click(function(e){...})'。虽然,首先声明函数有好处,其中之一就是如果你想在不同的事件或不同时间调用相同的**'playaudio'函数。 – rgthree

0

看起来您的playaudio变量绑定到由exec运行的匿名函数的上下文。

javascript:playaudio(); href是在全球范围内调用playaudio,即i。即到window.playaudio这确实没有定义。

尝试用window.playaudio代替var playaudio

+0

这是否暴露GreaseMonkey页面JS像unsafeWindow(它不存在于铬)? –