Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成一个包含grunt的blob,该blob将在var中提供给JS_Javascript_Binary_Gruntjs_Blob - Fatal编程技术网

Javascript 生成一个包含grunt的blob,该blob将在var中提供给JS

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

我需要在页面上嵌入一个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 = 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
似乎非常适合您的需要

因此:

  • 在GrunFile()中添加自定义任务
  • 使用http.request下载swf()的
  • 更新代码以使用本地swf

  • 我找到了解决办法。将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);
    }