2012-01-19 113 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(它不存在於鉻)? –