留言板实现思路

CRM思想:
C:Copy 把代码抄过来
R:Run 把代码运行一下
M:Modify 仿照代码然后改代码

数据存储问题:
没有云数据库的网页,数据都是存储在本地的,那么当我们换了设备,数据也就访问不到了,所以要实现跨设备访问,就必须把数据上传到服务器server上。

Ai0niR.png

这里我们用LeanCloud来当我们留言板的云数据库

首先通过script标签来引入SDK,这样我们就获得了一个AV的全局对象

然后把初始化代码复制到我们的message.js里

var APP_ID = 'A8GbNUsXHJwOMewmRQuQVszl-gzGzoHsz';
var APP_KEY = 'pwjKJ1YjQLNzAinUAKvtWyYJ';

AV.init({
  appId: APP_ID,
  appKey: APP_KEY
});

然后我们再把测试代码写进message.js

//创建TestObject表
var TestObject = AV.Object.extend('TestObject');
//在表中创建一行数据
var testObject = new TestObject();
//数据的内容是Hello World 保存
//如果保存成功,则运行alert('LeanCloud Rocks')
testObject.save({
  words: 'Hello World!'
}).then(function(object) {
  alert('LeanCloud Rocks!');
})

得出extend()里面的字符串是创建的表的名字,变量名也可以随便改

var x= AV.Object.extend('Jack');
var o= new x();
o.save({
  xxxxx: 'Love World!'
}).then(function(object) {
  alert('LeanCloud Rocks!');
})

o会新建一条数据,然后save会把这条数据存进去,这样我们就可以存任何数据了
努力学习JS是为了可以舒服的看懂文档,基础回了之后全部都是CRM,入门的标准就是能不能看懂别人的文档。
小结一下LeanCloud使用方法:

Ai6hlR.png

然后我们给页面里添加一个表单提交

<h2>留言</h2>
<form id="postMessageForm">
  <input type="text" name="content">
  <input type="submit" value="提交">
</form>

接着就是存储用户的提交数据,也就是要监听用户的提交,这里我们不能监听submit的点击事件,而是要监听form事件,因为用户有可能输入完之后点回车不点提交按钮,这样监听submit按钮就有可能失败。

let myForm = document.querySelector('#postMessageForm')
myForm.addEventListener("submit",function(e){
    e.preventDefault()   //阻止默认的刷新事件
    let content = myForm.querySelector("input[name=content]").value  //拿到用户提交的数据
    var Message = AV.Object.extend('Message')   //modify他给的代码
    var message = new Message()
    message.save({
      "content":content    //变量content存入
    }).then(function(object){
        alert('存入成功')
        console.log(object)
    })
})        //这样就把留言成功的存入了LeanCloud数据库

接着我们要拿到所有用户存过的信息并且展示到页面。我们可以看一下leanCloud的API文档,对象>获取对象

var query = new AV.Query('Todo');
  query.get('57328ca079bc44005c2472d0').then(function (todo) {
    // 成功获得实例
    // todo 就是 id 为 57328ca079bc44005c2472d0 的 Todo 对象实例
  }, function (error) {
    // 异常处理
  });

很明显我们没有Todo,这里把Todo改成Message,我们也没有get里面的ID,所以删掉,然后运行一下......报错了,说明get有问题,,我们试着把get改成find(批量操作里)

var query = new AV.Query('Message');
  query.find().then(function (message) {
      console.log(message)      //返回一个对象,我们要的数据在attributes里面
      console.log(message[0].attributes)
      console.log(message[1].attributes)
      let arry = message.map((item) => item.attributes)
      console.log(arry)
  }, function (error) {
    // 异常处理
  });       //这样我们就得到了两个content里面的数据

拿到数据库里的数据之后,我们就可以渲染页面了。

<ol id="messageList">
</ol>

然后遍历一下arry

arry.forEach((item)=>{
  let li =document.createElement('li')
  li.innerText = item.content
  let messageList = document.querySelector('#messageList')   //局部变量好一点
  messageList.appendChild(li)
})     //这时我们提交成功后需要刷新页面才能看到我们的提交

我们可以帮用户点击刷新

message.save({
      "content":content    //变量content存入
    }).then(function(object){
        window.location.reload()    //成功之后就自动刷新页面
        console.log(object)
    })

这是一个用户体验极差,但是可以成功的方法
Promise小结:

query.find({success: fn1 ,fail: fn2})  //成功执行fn1失败执行fn2

Promise的写法是

query.find()
        .then(
            fn1, fn2
        )                 //成功执行fn1失败执行fn2
        .then(
            fn3, fn4      //如果fn1和fn2都没有问题执行fn3,如果其中有一个有问题执行fn4
        )

给表单加一个姓名,然后展示name

<lable for="">姓名</lable>
<input type="text"  name="name">
<lable for="">内容</able>
<input type="text" name="content">
let name = myForm.querySelector('input[name=name]').value
message.save({
  "name":name,
  "content":content
})
arry.forEach((item)=>{
  let li =document.createElement('li')
  li.innerText = `${item.name}: ${item.content}`
  let messageList = document.querySelector('#messageList')   //局部变量好一点
  messageList.appendChild(li)
}) 

然后我们实现一下无刷新页面,精确的给页面添加提交信息,取代刷新

let myForm = document.querySelector('#postMessageForm')
myForm.addEventListener("submit",function(e){
    e.preventDefault()   //阻止默认的刷新事件
    let content = myForm.querySelector("input[name=content]").value  //拿到用户提交的数据
    var Message = AV.Object.extend('Message')   //modify他给的代码
    var message = new Message()
    message.save({
      "content":content    //变量content存入
    }).then(function(object){
        let li =document.createElement('li')
        li.innerText = `${object.attributes.name}: ${object.attributes.content}`    //怎么取到name和content
        let messageList = document.querySelector('#messageList')   //局部变量好一点
        messageList.appendChild(li)
        myForm.querySelector("input[name=content]").value = ''
        myForm.querySelector('input[name=name]').value = ''    //提交后把输入框内容清除
        console.log(object)
    })
})        

总结:

  1. 把用户提交的数据存入数据库。首先监听form表单,然后看文档存储数据
  2. 拿到用户提交到数据库的信息。看文档拿到数据然后生成arry数组
  3. 把拿到的数据渲染到页面。遍历arry数组,动态生成li,然后把content的内容赋值给li的innerText,再把li插入到ol里
  4. 再添加一个name输入框。拿到name的内容,然后存储,再用插值字符串添加到li的innerText里面
  5. 无刷新页面。当数据存储成功后,生成并添加对应的li标签
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,485评论 1 45
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,582评论 0 7
  • 一:在制作一个Web应用或Web站点的过程中,你是如何考虑他的UI、安全性、高性能、SEO、可维护性以及技术因素的...
    Arno_z阅读 1,157评论 0 1
  • 2013年蛇年春晚,那英的一首《春暖花開》把許多的人帶回到了一個心曠神怡,幸福無比的世界裏;那英的嗓音伴著優美的旋...
    子非水墨阅读 372评论 8 3
  • 老公昨天和我们一起坐在桌子上吃饭,而不是去到电视面前,我觉得很开心,真心谢谢他。 昨天老公愿意陪我去游泳或者走路,...
    妈妈随笔阅读 83评论 1 1