Javascript 生成一个包含grunt的blob,该blob将在var中提供给JS
我需要在页面上嵌入一个Flash.swf,我无法使用将src或data属性设置为swf url的常规方法-不要问:s。因此,我正在为swf执行一个ajax请求,转换为blob,然后生成一个blob url,我将其设置为swf src。然后我意识到,在使用Grunt构建时,可能有一种方法可以将swf文件作为var中的blob写入代码中,从而完全避免ajax请求。下面是ajax请求的代码:Javascript 生成一个包含grunt的blob,该blob将在var中提供给JS,javascript,binary,gruntjs,blob,Javascript,Binary,Gruntjs,Blob,我需要在页面上嵌入一个Flash.swf,我无法使用将src或data属性设置为swf url的常规方法-不要问:s。因此,我正在为swf执行一个ajax请求,转换为blob,然后生成一个blob url,我将其设置为swf src。然后我意识到,在使用Grunt构建时,可能有一种方法可以将swf文件作为var中的blob写入代码中,从而完全避免ajax请求。下面是ajax请求的代码: function createFlashMovie(blobUrl){ var obj = docu
function createFlashMovie(blobUrl){
var obj = document.createElement("object");
obj.setAttribute("width", "800");
obj.setAttribute("height", "600");
obj.setAttribute("type", "application/x-shockwave-flash");
obj.setAttribute("data", blobUrl);
document.body.appendChild(obj);
}
function onAjaxLoad(oResponse){
blobUrl = window.URL.createObjectURL(oResponse);
createFlashMovie(blobUrl);
};
//do the xhr request for a.swf
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4 && this.status == 200){
onAjaxLoad(this.response);
}
}
xhr.open('GET', '//theserver.com/a.swf');
xhr.responseType = 'blob';
xhr.send();
…但我确信,必须有可能使用grunt替换类似的内容,以便在运行blob时使其可用,并直接创建blob url而无需xhr请求:
var theBlob = new Blob(["GRUNT_WRITES_THIS_IN_FROM_FILE"], {type: "application/x-shockwave-flash"});
grunt的核心只是一个节点程序,所以您可以在Gruntfile或任务定义中使用任何节点命令。节点的
http.request
似乎非常适合您的需要
因此:
我找到了解决办法。将swf文件转换为base64编码字符串。目前,我正在单独完成这项工作,然后将其粘贴到源JS中,但它可以在构建时通过grunt实现自动化。然后在页面脚本中创建一个var以将其存储为dataURI:
var swfAsDataUri = "data:application/x-shockwave-flash;base64,BIG_LONG_CHUNK_OF_DATA_THAT_IS_YOUR_ENCODED_SWF_FILE__GRUNT_CAN_WRITE_THIS_IN_AT_BUILD_TIME";
从数据url创建blob,然后从blob创建对象url:
//function taken from http://stackoverflow.com/questions/27159179/how-to-convert-blob-to-file-in-javascript
dataURLToBlob = function(dataURL) {
var BASE64_MARKER = ';base64,';
var parts = dataURL.split(BASE64_MARKER);
var contentType = parts[0].split(':')[1];
var raw = window.atob(parts[1]);
var rawLength = raw.length;
var uInt8Array = new Uint8Array(rawLength);
for (var i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], {type: contentType});
};
var blobUrl = window.URL.createObjectURL( dataURLToBlob(swfAsDataUri) );
…现在您就知道了,swf文件没有额外的http请求。谢谢,但我不能完全确定我是否正确地解释了这个问题。我希望swf文件的编码数据将被写入JS文件中,这样它在运行时就可以在内存中使用,而不需要任何请求。无论如何,我找到了一个解决方案,我很快就会发布。
function createFlashMovie(blobUrl){
var obj = document.createElement("object");
obj.setAttribute("width", "800");
obj.setAttribute("height", "600");
obj.setAttribute("type", "application/x-shockwave-flash");
obj.setAttribute("data", blobUrl); //use the object url here
document.body.appendChild(obj);
}