标签 JavaScript 下的文章

N久以前

N久前遇到的问题,当时简单的解决了一下,现在在写一个StorageBucket,需要有一个Demo,所以又回过头来研究。
来看看之前是这么解决的:

let slice_size = 1024 * 1024; // 1MB 分块大小
let totalSliceNum = 0; //总分块数量
let now = 0; //当前分块
let file = document.getElementById("file").files[0];
totalSliceNum = Math.ceil(file.size / slice_size);

print("size|" + file.size);
print("name|" + file.name);
print("type|" + file.type);
print("slice|" + totalSliceNum);

while(now < totalSliceNum) {
   let s = now * slice_size;
   let e = (now + 1) * slice_size;
   if(e > file.size) {
       e = file.size;
   }
   let chunk = file.slice(s,e); //切取一块
   //jquery.ajax 发送文件块数据
   now += 1;
}

看起来没错,网上也大部分都是这么写的,按顺序一块一块上传,但实际上使用你会发现,浏览器卡爆了,页面完全不渲染,幸好是给同学用的,让他F12在控制台看进度。
我们浏览器中的js是单线程的,我们分片时会卡死在file.slice这里,因为它要从文件中读出一块,它卡死在这占据了整个线程,导致整个页面无法渲染。不过我们可以用FileReader来异步读取,而不是等他读取,卡到无法渲染,所以有了下面的版本:

let slice_size = 1024 * 1024; // 1MB 分块大小
let totalSliceNum = 0; //总分块数量
let now = 0; //当前分块
let file = document.getElementById("file").files[0];
totalSliceNum = Math.ceil(file.size / slice_size);

print("size|" + file.size);
print("name|" + file.name);
print("type|" + file.type);
print("slice|" + totalSliceNum);

while(now < totalSliceNum) {
   let s = now * slice_size;
   let e = (now + 1) * slice_size;
   if(e > file.size) {
       e = file.size;
   }
   let chunk = file.slice(s,e); //切取一块
   let reader = new FileReader();
   reader.readAsArrayBuffer(chunk);
   reader.onload = function() {
       //当块加载好了,会执行这个函数
       //console.log(new Blob([reader.result]));
       //jquery.ajax 发送文件块数据
       //这里要传递当前分块与总块数量,方便后端合成,因为块不再是顺序上传
   }
   now += 1;
}

效果

21072601.png

最后

博客很少更了,我现在不像以前一样那么有动力,不过...

引入

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/lrsjng.jquery-qrcode/0.18.0/jquery-qrcode.min.js"></script>

快速使用

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" name="viewport" content="width=device-width,initial-scale=1" />
    <title>QRCode</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/lrsjng.jquery-qrcode/0.18.0/jquery-qrcode.min.js"></script>
</head>
<body>
    <div id="qrcode_demo"></div>
    <script>
        $(function(){
            $('#qrcode_demo').qrcode({text:"https://blog.yeziruo.cn/"});
        });
    </script>
</body>
</html>

参数

render: "table" 或 "canvas"(默认)
text: 文本内容
width: 256 宽
height: 256 高
background: "#ffffff" 背景颜色
foreground: "#66ccff" 前景颜色
typeNumber: -1 计算模式(暂不清楚作用)
correctLevel: QRErrorCorrectLevel.H 纠错等级(不建议指定,否则将不会渲染)
    QRErrorCorrectLevel.L,  (7%)
    QRErrorCorrectLevel.M, (15%)
    QRErrorCorrectLevel.Q, (25%)
    QRErrorCorrectLevel.H, (30%)

中文支持

使用该插件生成二维码,如果内容包含中文,则需要将Unicode(UTF-16)转为UTF-8。

function utf16to8(str) {
    var out, i, len, c;
    out = "";
    len = str.length;
    for(i = 0; i < len; i++) {
        c = str.charCodeAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            out += str.charAt(i);
        } else if (c > 0x07FF) {
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
            out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
        } else {
            out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
        }
    }
    return out;
}

不知道大家进来有没有遇到弹窗呢,按道理弹窗只会弹一次,因为写了Cookie:

code.png

JavaScript自带的方法太麻烦,用JQuery简单些。

引用

//先引用JQuery再加载JQuery Cookie
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>

方法

$.cookie(name,value,optional parameters)

name - Cookie名称
value - 值
optional parameters - 可选参数(过期时间,创建Cookie的路径,创建Cookie的域,HTTPS传输)

//写Cookie
$.cookie('test', '1'); //临时Cookie,会话结束后删除
$.cookie('test','1',{expires:7,path:'/',domain:'abc.com',secure:true}) //过期时间(天),创建Cookie的路径,创建Cookie的域,HTTPS传输
//读Cookie
var cookie_value = $.cookie('test')
//删除Cookie
$.cookie('test',null) //直接置空

其他

使用JavaScript自带的写法参考:https://www.cnblogs.com/endv/p/8089506.html