无法在'Window'上执行'atob'

Alo*_*iel 28 html javascript jquery

当用户按下ctrl + s按键但Chrome崩溃时,我正在尝试将我的HTML文件保存在Chrome中.

(我只想下载我的HTML文件的源代码)

我读到它发生是因为我的文件大于1.99M ..

在第一次尝试中(在我知道Chrome崩溃之前):

function download(filename, text) {
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);
    pom.click();
}

download('test.html', "<html>" + document.getElementsByTagName('html')[0].innerHTML + "</html>");
Run Code Online (Sandbox Code Playgroud)

在我读到关于崩溃的第二次尝试之后,我使用了blob:

function dataURItoBlob(dataURI) {
    var byteString = atob(dataURI.split(',')[1]);

    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

    var bb = new BlobBuilder();
    bb.append(ab);
    return bb.getBlob(mimeString);
}

function download(dataURI) {
    var blob = dataURItoBlob(dataURI);
    var url  = window.URL.createObjectURL(blob);
    window.location.assign(url);
}

download("<html>" + document.getElementsByTagName('html')[0].innerHTML + "</html>")
Run Code Online (Sandbox Code Playgroud)

我在这里得到了错误: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.

我不知道,但我读到我需要将我的字符串编码为base64:如何在JavaScript中将字符串编码为Base64?

有148票的答案.我将其粘贴到我的代码中,不知道如何继续.

我应该在哪里打电话呢?我可以在保存的文件上加上名字吗?

我想我需要做的事情如下:

download(_utf8_decode("<html>" + document.getElementsByTagName('html')[0].innerHTML + "</html>"))
Run Code Online (Sandbox Code Playgroud)

o.v*_*.v. 19

BlobBuilder已过时,请使用Blob构造函数:

URL.createObjectURL(new Blob([/*whatever content*/] , {type:'text/plain'}));
Run Code Online (Sandbox Code Playgroud)

这将返回一个blob URL,然后您可以在锚点中使用它href.您还可以修改锚点的download属性来操作文件名:

<a href="/*assign url here*/" id="link" download="whatever.txt">download me</a>
Run Code Online (Sandbox Code Playgroud)

摆弄.如果我没记错的话,对可信的非用户发起的下载有任意限制; 因此,我们将坚持使用链接点击,这被视为充分的用户启动:)

更新:保存当前文档的html实际上非常简单!只要点击我们的交互式链接,我们就会href用相关的blob 更新它.执行点击绑定事件后,这是将导航到的下载URL!

$('#link').on('click', function(e){
  this.href = URL.createObjectURL(
    new Blob([document.documentElement.outerHTML] , {type:'text/html'})
  );
});
Run Code Online (Sandbox Code Playgroud)

再次摆弄.

  • @AlonShmiel:请记住,在更改输入文本等时,您不是在修改 html,而是在修改 DOM!您必须将 DOM 序列化回 html/xhtml,因为 `innerHTML`/`outerHTML` 不会反映突变。 (2认同)
  • @AlonShmiel - 我认为你可以运行类似`Array.prototype.forEach.call(document.querySelector('input'),function(e){e.setAttribute('value',e.value);}); (和`textarea`和`select`类似)在更新下载链接之前. (2认同)

Ber*_*rgi 5

我在这里得到了错误: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.

因为您没有传递base64编码的字符串.看看你的功能:既downloaddataURItoBlob做指望一个数据URI出于某种原因; 但是你download在你的例子中传递一个普通的html标记字符串.

不仅HTML作为base64无效,你正在调用.split(',')[1]它将产生undefined- 并且"undefined"也不是有效的base64编码的字符串.

我不知道,但我读到我需要将我的字符串编码为base64

这对我来说没有多大意义.你想以某种方式对它进行编码,然后才解码它?

我该怎么称呼以及怎么做?

download函数的接口更改回收到的参数filenametext参数.

请注意,BlobBuilder它不仅支持追加整个字符串(因此您不需要创建这些ArrayBuffer内容),而且还弃用了Blob构造函数.

我可以在保存的文件上加上名字吗?

是.不要使用Blob构造函数,而是File构造函数.

function download(filename, text) {
    try {
        var file = new File([text], filename, {type:"text/plain"});
    } catch(e) {
        // when File constructor is not supported
        file = new Blob([text], {type:"text/plain"});
    }
    var url  = window.URL.createObjectURL(file);
    …
}

download('test.html', "<html>" + document.documentElement.innerHTML + "</html>");
Run Code Online (Sandbox Code Playgroud)

请参阅JavaScript blob文件名,但没有关于如何处理该对象URL的链接,只是将当前位置设置为它不起作用.


sub*_*arb 5

就我而言,我简直要疯了,因为要解码的字符串没有任何问题,因为我可以在在线工具上成功解码它。直到我发现你首先必须解码decodeURIComponent你正在解码的内容,如下所示:

atob(decodeURIComponent(dataToBeDecoded));
Run Code Online (Sandbox Code Playgroud)


小智 5

您不需要将整个编码字符串传递给atob方法,您需要拆分编码字符串并将所需字符串传递给atob方法

const token= "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJob3NzYW0iLCJUb2tlblR5cGUiOiJCZWFyZXIiLCJyb2xlIjoiQURNSU4iLCJpc0FkbWluIjp0cnVlLCJFbXBsb3llZUlkIjoxLCJleHAiOjE2MTI5NDA2NTksImlhdCI6MTYxMjkzNzA1OX0.8f0EeYbGyxt9hjggYW1vR5hMHFVXL4ZvjTA6XgCCAUnvacx_Dhbu1OGh8v5fCsCxXQnJ8iAIZDIgOAIeE55LUw"
console.log(atob(token.split(".")[1]));
Run Code Online (Sandbox Code Playgroud)