实现前后端数据交互方法汇总


Posted in Javascript onApril 07, 2015

此文章适合前后端协同开发经验不足的新手阅读。

HTML赋值

输出到 Element 的 value 或 data-name

<input type="hidden" value="<?php echo $user_avatar;?>" />
<div data-value="<?php echo $user_avatar;?>"></div>

渲染结果

<input type="hidden" value="https://avatars1.githubusercontent.com/u/3949015?v=3&s=40" />
<div data-avatar="https://avatars1.githubusercontent.com/u/3949015?v=3&s=40"></div>

使用 JS 获取

$('input').val();
// http://jquery.bootcss.com/jQuery.data/
$('div').data('avatar');

优点:

不占用全局变量,由 JS 自由获取。

使用建议:

适合传递简单数据,也非常适合多个简单数据与 Element 绑定关系。

<ul>
<li>nimojs <span data-userid="1" >删除</span></li>
<li>nimo22 <span data-userid="2" >删除</span></li>
<li>nimo33 <span data-userid="3" >删除</span></li>
<li>nimo44 <span data-userid="4" >删除</span></li>
<li>nimo55 <span data-userid="5" >删除</span></li>
</ul>
<script>
$('span').on('click',function(){
  $.post('/ajax/remove/',$(this).data('userid'),function(data){
    // ...
  })
})
</script>

JS赋值

将数据填充到 <script> 的 JavaScript 变量声明中。

<script>
var user_avatar = "<?php echo $user_avatar;?>";
// 渲染结果
// var user_avatar = "https://avatars1.githubusercontent.com/u/3949015?v=3&s=40";
</script>

或使用 Smarty 后端模板引擎:

<script>
var user_avatar = "{$user_avatar}";
</script>

优点:
传递数据非常方便。前端直接调用 user_avatar 变量使用数据。

缺点:

为了传递一个字符串数据占用了全局变量 user_avatar,当有很多数据需要传输时则会占用很多全局变量。
如果返回数据存在换行将会导致JS报错

// 渲染结果有换行符
var user_id = "https://avatars1.githubusercontent.com/u/3949015?v=3&s=40";
// Uncaught SyntaxError: Unexpected token ILLEGAL

优化:

可以通过指向的某一个变量存放所有后端返回的内容,最小程度占用全局变量。例:

// PHP 代码
var SERVER_DATA = {
  username: {$username},
  userid: {$userid},
  title: {$title}
}
// 渲染结果
var SERVER_DATA = {
  username: "NimoChu",
  userid: 1,
  title: 'F2E'
}

使用建议:

需要最快速度传递数据给 JS 并十分确定此数据稳定时,使用此方式。数据格式复杂的建议使用script填充JSON 或AJAX获取JSON 方法。

script填充JSON
什么是JSON?

填充 JSON 数据到 <script> 标签中,前端通过 DOM 获取 JSON字符串并解析成对象。

<script type="text/template" id="data">{"username":"nimojs","userid":1}</script>
<script>
var data = JSON.parse($('#data').html());
//{username:"nimojs",userid:1}
</script>

优点:

页面加载完成后就可以获取到数据。不占用全局变量,可传递大量数据集合。

缺点:

数据量特别大时会导致页面初次加载变慢。变慢并不只是文件大小导致的,也因为服务器查询数据并返回合集是需要时间,可使用AJAX获取JSON完成按需加载和加载等待。

使用建议:

适合传递在DOM加载完成时就需要用到的大量数据集合。例如:前端控制页面渲染,后端将JSON数据源填充到 <script> 由前端使用 JavaScript模板引擎进行页面渲染。

AJAX获取JSON

使用 AJAX 获取JSON数据

<span id="showdata">查看资料</span>
<div style="display:none;" id="box">
  <h2>用户信息</h2>
  <p id="info"><img src="loading.gif" /></p>
</div>
$('#showdata').on('click',function(){
  $('#box').show();
  $.getJSON('/ajax/userdata/',function(oData){
    // oData = {"username":"nimojs","userid":1}
    $('#info').html('用户名:' + oData.username + '<br>用户ID:' + oData.userid);
  })
})

这是一个通过AJAX 获取用户资料的示例。流程如下:

页面上只显示查看资料
用户点击查看资料
显示用户信息和 loading 图片
向服务器发送获取用户信息的AJAX请求
服务器返回JSON字符串,$.getJSON 自动将返回的 JSON字符串转换为对象
填充内容到 <p id="info">

优点:

不占用全局变量和 DOM 节点,可以自由控制获取数据的触发条件(页面加载完成时、用户点击查看资料时或用户点击某个按钮时)。当开始获取数据时可使用 loading 图片占位提示用户数据正在读取。防止页面加载所有数据导致的页面加载缓慢。

缺点:

会产生额外的HTTP请求。不能在DOM加载完成以后立即获取,需要发送请求-接收响应。

使用建议:

适合加载非主要信息、设定触发条件(用户点击查看资料时),并提供友好的数据读取等待提示。

WebSocket实时传输数据
如果将 AJAX请求和响应比喻成给服务器发短信和等待服务器回复短信,而 WebSocket 就如同和服务器打电话。

此处不对WebSocket做过多介绍,附上参考资料:

Wiki:WebSocket
使用 HTML5 WebSocket 构建实时 Web 应用
Ajax vs WebSocket

总结
每种情况都有每种情况的用处,没有绝对正确的方法。根据实际情况灵活的选择获取数据方式。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
javascript preload&amp;lazy load
May 13 Javascript
IE的fireEvent方法概述及应用
Feb 22 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
Feb 23 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
Mar 26 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
Sep 08 Javascript
js实现符合国情的日期插件详解
Jan 19 Javascript
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 jQuery
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
详解从react转职到vue开发的项目准备
Jan 14 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
Sep 02 Javascript
JS对日期操作封装代码实例
Nov 08 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
Aug 07 Javascript
JavaScript使用cookie记录临时访客信息的方法
Apr 07 #Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 #Javascript
javascript实现画不相交的圆
Apr 07 #Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 #Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
Apr 06 #Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
Apr 06 #Javascript
JavaScript使用replace函数替换字符串的方法
Apr 06 #Javascript
You might like
德生PL990的分析评价
2021/03/02 无线电
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
js回调函数仿360开机
2019/12/26 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python取代netcat过程分析
2018/02/10 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
浅析Django中关于session的使用
2019/12/30 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
EJB的几种类型
2012/08/15 面试题
保险内勤岗位职责
2014/04/05 职场文书
绿里奇迹观后感
2015/06/15 职场文书
2016特色励志班级口号
2015/12/24 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python