Base64 GM_getResourceURL在Firefox中不适用于二进制对象,但在Tampermonkey中适用?

Base64 GM_getResourceURL在Firefox中不适用于二进制对象,但在Tampermonkey中适用?,base64,greasemonkey,tampermonkey,Base64,Greasemonkey,Tampermonkey,在Tampermonkey中,以下代码可以使用OGG资源中的base64数据添加音频元素: var m = GM_getResourceURL("music") || null; $("html").append('<audio id="audio" autoplay loop src="data:audio/ogg;base64,' + m + '" />') var m=GM_getResourceURL(“音乐”)|| null; $(“html”).append(“”)

在Tampermonkey中,以下代码可以使用OGG资源中的base64数据添加音频元素:

var m = GM_getResourceURL("music") || null;
$("html").append('<audio id="audio" autoplay loop src="data:audio/ogg;base64,' + m + '" />')
var m=GM_getResourceURL(“音乐”)|| null;
$(“html”).append(“”)
在Greasemonkey中,
m
不是base64字符串,它是一些UUID,后跟资源的名称。如何从资源中获取实际的base64数据并像在Tampermonkey中一样使用它?

GM\u getResourceURL()
当前在Greasemonkey和Tampermonkey中的行为非常不同

  • Greasemonkey
  • Tampermonkey仍然遵循着传统的服务方式。
    (请注意,Greasemonkey在GM 1.0版之前的表现与此相同。)
我认为这是Tampermonkey的一个小错误,因为直接从磁盘上提供资源比读取、base64编码,然后让浏览器对其进行base64解码以使用它更有效


无论如何,这里有一个在Greasemonkey和Tampermonkey中都能运行的完整工作脚本:

// ==UserScript==
// @name        _Using a binary resource
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @include     http://stackoverflow.com/questions/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @resource    musicFile  https://mdn.mozillademos.org/files/2587/AudioTest%20%281%29.ogg
// @grant       GM_getResourceURL
// ==/UserScript==

var musicResrc = GM_getResourceURL ("musicFile");

/*--- GM_getResourceURL() currently behaves very differently in Greasemonkey versus Tampermonkey.
    In Greasemonkey, a special protected URL is provided to the file.
    Tampermonkey still follows the old way of base64 encoding the file and serving that.

    The GM URL looks like:
        greasemonkey-script:402c80a8-c313-439c-9d7b-c9bdc52b7b02/musicFile
*/

if (typeof musicResrc === 'string'  &&  musicResrc.slice(0, 12) === "greasemonkey") {
    console.log ("Greasemonkey mode.");
}
else {
    console.log ("Tampermonkey mode.");
    musicResrc  = 'data:audio/ogg;base64,' + musicResrc;
}
//console.log ("musicResrc: ", musicResrc);

$("body").prepend (
    '<div><audio type="audio/ogg" src="' + musicResrc + '" autoplay="true" loop="true" controls="true"></audio></div>'
);
/==UserScript==
//@name\u使用二进制资源
//@包括http://YOUR_SERVER.COM/YOUR_PATH/*
//@包括http://stackoverflow.com/questions/*
//@需要http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
//@resource musicFilehttps://mdn.mozillademos.org/files/2587/AudioTest%20%281%29.ogg
//@grant GM_getResourceURL
//==/UserScript==
var musicResrc=GM_getResourceURL(“musicFile”);
/*---GM_getResourceURL()目前在Greasemonkey和Tampermonkey中的行为非常不同。
在Greasemonkey中,为文件提供了一个特殊的受保护URL。
Tampermonkey仍然沿用base64编码文件并提供服务的老方法。
GM URL如下所示:
greasemonkey脚本:402c80a8-c313-439c-9d7b-c9bdc52b7b02/musicFile
*/
if(musicResrc的类型=='string'&&musicResrc.slice(0,12)==='greasemonkey”){
console.log(“Greasemonkey模式”);
}
否则{
console.log(“篡改猴子模式”);
musicResrc='数据:音频/ogg;base64'+musicResrc;
}
//console.log(“musicResrc:,musicResrc”);
$(“正文”)。前缀(

“)

您认为跨域加载和播放音频的更好方法是什么?而且,我的代码有一个输入错误。我使用的是GM_getResourceURL,我的代码在Tampermonkey中工作,但不是Greasemonkey。你的代码在Firefox中工作,但在Chrome/Tampermonkey中不会自动播放。谢谢你-我最终在代码中做了类似的事情,同时考虑了TM和GM。一如既往地感谢Brock。