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

Chrome refuses to declare variable in injected script

本文关键字:声明 变量 脚本 拒绝 注入 Chrome      更新时间:2023-09-26

我有一个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