Day27-用jQuery写得出ToDoList吗_2_搞个4码随机码给id使用吧

今天要先把昨天写的东西都给挪到阵列之中,所以我们会需要一个空的阵列
这个阵列因为多个函式会使用到,记得要放在最外层

然後写一个addTodo的function,让每次点击送出时都会将目前input的文字存取到指定阵列中

var todos = new Array;
function addTodo() {
    todos.push({ content: $('#form-control').val(), complete: false });
    document.getElementById('form-control').value = ""
}

推进阵列的东西有文字内容的content跟是否完成的complete两项
complete都是预设尚未完成,这个项目在後面我们做样式时用的到,先放进来
推进阵列後就把input清空,这样更有送出的感觉!!
这边给大家看console.log
https://i.imgur.com/MAZmkyh.gif

然後我们新增一个update的函式用来更新并显示目前的ToDoList
内容要去更新阵列的每一个项目,这边使用的是jQuery的.each这个可以抓取阵列所有东西的方法

function update() {
    $("#add").empty()
    $.each(todos, function (item, index) {
        let tmp = $('#template01');
        let div = tmp.html();
        div = div.replace("CONTENT_HERE", index.content);
        $("#add").append(div)
    });
}

记得要在addTodo()的最後一行呼叫update做更新
并把button的onclick改成addTodo()
https://i.imgur.com/CwhUT3l.gif

接着我们先把每个项目的独立id制作出来(後续部分会都是文字噢)
用的方法是把所有可以使用的英文大小写+数字存放在字串中
然後再利用数学.random()来随机抓取排列
这个部份我是上网看别人怎麽去写的,因为我不想弄到就是太高级的GUID那样,所以找了简化很多的版本

var code = "";
function randomString(len) {
    var str = "mnbvcxzasdfghj012klpoiuytrewq6789MNBVCXZASDFGHJ345KLPOIUYTREWQ"
    var len = str.length;
    var num = 4;
    code = "";
    for (var i = 0; i < num; i++) {
        var rand = Math.ceil(Math.random() * len - 1);
        code += str[rand];
    }
}

一样因为code会被其他函式使用,所以要放在最外层
用了这个函式之後便会帮我们自动产生一个4码的随机字串了

然後我们回到addTodo函式,在最一开始时呼叫它产生一个字串,然後push到todos阵列中,取名叫id: code

比较的部分比较麻烦
首先我们需要在最外层新增一个阵列去存取我们的所有id,不然要挖太多层去做比较
这边用到的是jQuery的$.map这个方法,因为他有回传值可以做存取,详细作用可以上网查查
它可以帮助我们去抓取阵列中每一笔特定名称的内容
然後我们抓到内容之後把它加入一个叫做result的新阵列
这个阵列一样放在最外层因为会多处使用
完整写法长这样

result = $.map(todos, function (item, index) {
    return item.id;
})

我们把这段程序码加在update()的第一行
让每一次todos的阵列内容有更新就去更新result的内容
并在这段程序码之前加一行result=[],让每一次更新前先清空再重新加入
这边是为了之後做删除做准备

然後回到addTodo()
我们在第一行呼叫了随机码的函式,在.push之前,我们要确认这组字串目前无人使用,不然我们就要再请随机函式给我们一组新的
所以在.push之前我们要写一个判别式
判断目前随机码函式做出来的这个code是否在result阵列已经存在了

for (var i = 0; i < result.length; i++) {
    if (code == result[i]) randomString()
}

写法很简单,检查code是否与result阵列的内容相同,相同就在找一组回来,一直到不相同为止
这一串我们加在randomString()的最尾巴,让code在addTodo()的.push前已经确定是无重复的唯一code了

完整的randomString()跟addTodo()函式长这样

function randomString() {
    var str = "mnbvcxzasdfghj012klpoiuytrewq6789MNBVCXZASDFGHJ345KLPOIUYTREWQ"
    var len = str.length;
    var num = 4;
    code = "";
    for (var i = 0; i < num; i++) {
        var rand = Math.ceil(Math.random() * len - 1);
        code += str[rand];
    }
    for (var i = 0; i < result.length; i++) {
        if (code == result[i]) randomString()
    }
}
function addTodo() {
    randomString()
    todos.push({ content: $('#form-control').val(), complete: false, id: code });
    document.getElementById('form-control').value = ""
    update()
}

这边因为是自己使用的ToDoList,我只设了4码的随机码,相信应该是不会使用到超过62x62x62x62个List,然後造成没有办法再新增新的code然後出问题的啦(吧?

因为今天的某些内容写在昨天会太长可能要切断,但我又不想切断,所以今天篇幅有点长www
明天介绍id的使用、complete()的完整写法


<<:  Day28 [实作] 一对一视讯通话(8): Docker compose 整合 TURN Server

>>:  [第27天]理财达人Mx. Ada-BETA指标

Rails has_many

has_many 的设定 class_name 可以变更关联的类别名称,例如以下新增了paid_at...

Day09 测试写起乃-FactoryBot(1)

在测试时常会需要建立假资料以供测试使用,就可以安装 FactoryBot 来建立资料 安装 Fact...

[29] 30 天从 Swift 学会 Objective-C:Swift friendly 的 进阶 C 语言部分与 modulemap

在理解完 Objective-C 之後,我们要来面对 C 语言的引用,不得不说 Swift 十分不信...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 7 - 如何写断言

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 在测试脚本加上断言後,当程序码有 ...

javascript 防疫自学日记 day 1

自学coding长跑开始! 我要每天花两个小时自学~~~ 先整理学习资源—— 分成四part:(会一...