javascript的localStorage(Web Storage)小项目

版权声明:分享才能获得最大的价值 https://blog.csdn.net/qq_32252957/article/details/84729397

我们下面举一个javascript localStorage练手的小项目,是headfirsthtml5中的一个例子,不过我将其进行美化。

项目资源(源码,图片)地址:https://github.com/youaresherlock/HeadFirstHtml5/tree/master/chapter9

做什么?

我们通过下拉列表选择要生成的便利贴的Color,以及输入便利贴的Text文本。

生成后效果如下,同时将所有便利贴的color、text、key(我们利用new Date().

getTime()来生成不一样id的key)利用localStorage存储到本地,下次刷新就加载

(购物车物品记录也是类似原理)

下图是初始生成的便利贴

当鼠标悬浮在一个便利贴上,便利贴放大,同时颜色渐变,可以看到还有一个透明的垃圾桶。

点击垃圾桶可以删除

点击垃圾桶删除会弹出对话框,询问是否删除

下面是代码:

noteself.html

<!doctype html>
<html>
    <head>
        <title>Note to Self</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="notetoself.css">
        <script src="notetoself.js"></script>
    </head>
    <body>
        <from>
            <label for="note_color">Color: </label>
            <select id="note_color">
                <option value="LightGoldenRodYellow">yellow</option>
                <option value="PaleGreen">green</option>
                <option value="LightPink">pink</option>
                <option value="LightBlue">blue</option>
            </select>
            <label for="note_text">Text:</label><input type="text" id="note_text">
            <input type="button" id="add_button" value="Add Sticky Note to Self">
        </from>
        <ul id="stickies">
            
        </ul>
    </body>
</html>

css样式notetoself.css

body {
    background-color: #4184aa;
    font-size: 100%;
}

form input#note_text {
    width: 350px;
}

ul#stickies li {
    display: block;
    list-style: none;
    z-index: 1;
    float: left;
    margin: 30px;
    padding: 15px 15px 50px 15px;
    width: 200px;
    height: 200px;
    border: 1px solid #bfbfbf;
    border-radius: 20px;
    background-color: lightgoldenrodyellow;
    color: black;
    text-decoration: none;
    -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
	-moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
	-o-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
	box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
	-webkit-transition: all 0.5s ease-in;
	-moz-transition: all 0.5s ease-in;
	-o-transition: all 0.5s ease-in;
	-ms-transition: all 0.5s ease-in;
    transition: all 0.5s ease-in;
    /* overflow属性指定如果内容溢出一个
    元素的框,会发生什么
    visible、hidden、scroll、auto、inherit */
    overflow: hidden;
}

ul#stickies li span.sticky {
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 200%;
}

ul#stickies li img.delete {
    position: absolute;
    left: 158px;
    top: 190px;
    /*for IE*/
    filter: alpha(opacity=0.3);
    opacity: 0.1;
    transition: opacity 1s;
    -moz-transition: opacity 1s;	/* Firefox 4 */
    -webkit-transition: opacity 1s;	/* Safari 和 Chrome */
    -o-transition: opacity 1s;	/* Opera */
}

ul#stickies li img.delete:hover {
    /*for IE*/
    filter: alpha(opacity=1);
    opacity: 1;
}

ul#stickies li:nth-child(even) {
    -webkit-transform: rotate(2deg);
	-moz-transform: rotate(2deg);
	-o-transform: rotate(2deg);
	-ms-transform: rotate(2deg);
	transform: rotate(2deg);
}

ul#stickies li:nth-child(odd) {
    -webkit-transfrom: rotate(-1deg);
    -moz-transform: rotate(-1deg);
    -o-transform: rotate(-1deg);
    -ms-transform: rotate(-1deg);
    transform: rotate(-1deg);
}

ul#stickies li:nth-child(3n) {
	-webkit-transform: rotate(1deg);
	-moz-transform: rotate(1deg);
	-o-transform: rotate(1deg);
	-ms-transform: rotate(1deg);
	transform: rotate(1deg);
}

/* 
   Transform demo 
   Uses the transition (defined above) to ease in.
*/
ul#stickies li:hover {
	-webkit-box-shadow: 5px 5px 6px rgba(0, 0, 0, 0.4);
	-moz-box-shadow: 5px 5px 6px rgba(0, 0, 0, 0.4);
	-o-box-shadow: 5px 5px 6px rgba(0, 0, 0, 0.4);
	-webkit-transform: rotate(0deg) scale(1.25);
	-moz-transform: rotate(0deg) scale(1.25);
	-o-transform: rotate(0deg) scale(1.25); /*IE 9*/
	-ms-transform: rotate(0deg) scale(1.25); /*Safari and Chrome*/
    transform: rotate(0deg) scale(1.25);
    background: linear-gradient(lightgoldenrodyellow, lightblue);
    z-index: 10;
}

js代码:

// window.onload = init;
// 下面的代码可能会出现key重复问题,同时如果同域中有其他的数据,会
// 非常影响性能
// function init() {
//     var button = document.getElementById("add_button");
//     button.onclick = createSticky;
//     for(var i = 0; i < localStorage.length; i++) {
//         var key = localStorage.key(i);
//         if(key.substring(0, 6) == "sticky") {
//             var value = localStorage.getItem(key);
//             addStickyToDOM(value);
//         }
//     }
// }

// function createSticky() {
//     var value = document.getElementById("note_text").value;
//     var key = "sticky_" + localStorage.length;
//     localStorage.setItem(key, value);

//     addStickyToDOM(value);
// }

//最终方案(类似购物车保存购物url一样)
window.onload = init;

function init() {
    var button = document.getElementById("add_button");
    button.onclick = createSticky;

    var stickiesArray = getStickiesArray();

    for(var i = 0; i < stickiesArray.length; i++) {
        var key = stickiesArray[i];
        var value = JSON.parse(localStorage[key]);
        addStickyToDOM(key, value);

    }
}

function createSticky() {
    var value = document.getElementById("note_text").value;
    var temp = value.trim(); //返回的是一个新的字符串,去除首位空格
    if(!temp) {
        return;
    }
    var stickiesArray = getStickiesArray();
    var currentDate = new Date();
    //我们存储选择的sticky以及它对应的颜色,组成对象解析成JSON保存起来
    var colorSelectObj = document.getElementById("note_color");
    //selectedIndex属性可设置或返回下拉列表中被选选项的索引号
    var index = colorSelectObj.selectedIndex;
    var color = colorSelectObj[index].value;
    var key = "sticky_" + currentDate.getTime();
    var stickyObj = {
        "value": value,
        "color": color
    };
    localStorage.setItem(key, JSON.stringify(stickyObj));
    stickiesArray.push(key);
    localStorage.setItem("stickiesArray", JSON.stringify(stickiesArray));
    addStickyToDOM(key, stickyObj);
}

function getStickiesArray() {
    //localStorage.getItem(key) //如果不存在为null
    var stickiesArray = localStorage.getItem("stickiesArray");
    
    if(!stickiesArray) {
        stickiesArray = [];
        localStorage.setItem("stickiesArray", JSON.stringify(stickiesArray));
    } else {
        stickiesArray = JSON.parse(stickiesArray); //JSON字符串解析成对象
    }

    return stickiesArray;
}

//此函数不变
function addStickyToDOM(key, stickyObj) {
    var stickies = document.getElementById("stickies");
    var sticky = document.createElement("li");
    /*
    span标签如果不应用样式,那么<span>元素中的文本与其他文本不会任何视觉上的差异。
     */
    var span = document.createElement("span");
    var picture = document.createElement("img");
    picture.setAttribute("class", "delete");
    picture.src = "delete2.png";
    span.setAttribute("class", "sticky");
    span.innerHTML = stickyObj.value;
    sticky.setAttribute("id", key);

    sticky.style.backgroundColor = stickyObj.color;
    sticky.appendChild(span);
    sticky.appendChild(picture);
    stickies.appendChild(sticky);
    picture.onclick = deleteSticky;
}

function deleteSticky(e) {
    //parentNode属性可返回某结点的父结点,target为
    // 所点击并生成事件的元素
    if(window.confirm("are you sure to delete this sticky?")){
        var key = e.target.parentNode.id;
        localStorage.removeItem(key);
        var stickiesArray = getStickiesArray();
        for(var i = 0; i < stickiesArray.length; i++) {
            if(key == stickiesArray[i]) {
                //array.splice(index, howmany, item1,....., itemX)
                stickiesArray.splice(i, 1);
            }
        }
        localStorage.setItem("stickiesArray", JSON.stringify(stickiesArray));
        removeStickyFromDom(key); 
    }
} 

function removeStickyFromDom(key) {
    var sticky = document.getElementById(key);
    //removeChild(node)方法可从子节点列表中删除某个节点
    sticky.parentNode.removeChild(sticky);
}

打开浏览器可以右击查看本地存储内容,如下图:

可以看到我们将所有的便利贴的标识key保存到stickiesArray数组中,同时也有对应key的一个js字面量对象(这里是JSON格式字符串),localStorage只能保存字符串,用js保存时注意使用JSON.stringify(object),js读取的时候注意用JSON.parse(json_string)

另外如果想要临时缓存数据(关闭浏览器数据消失) ,将代码中localStorage替换成sessionStorage即可

猜你喜欢

转载自blog.csdn.net/qq_32252957/article/details/84729397