來自在知乎看到的前端 枢冤,后端 關于數(shù)據(jù)交互的問題?的回答铜秆,出自作者NimoChu。
- HTML賦值
- JS賦值
- script填充JSON
- AJAX獲取JSON
- WebSocket實時傳輸數(shù)據(jù)
- 總結
1. HTML賦值輸出到 Element 的 value 或 data-name
<div data-value="<?php echo $user_avatar;?>"></div>
渲染結果
<div data-avatar="https://avatars1.githubusercontent.com/u/3949015?v=3&s=40"></div>
使用 JS 獲取$('input').val();
$('div').data('avatar');
優(yōu)點:不占用全局變量核蘸,由 JS 自由獲取客扎。
使用建議:適合傳遞簡單數(shù)據(jù)罚斗,也非常適合多個簡單數(shù)據(jù)與 Element 綁定關系。
<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>
2. JS賦值
將數(shù)據(jù)填充到 <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>
優(yōu)點:傳遞數(shù)據(jù)非常方便绞绒。前端直接調(diào)用 user_avatar 變量使用數(shù)據(jù)榕暇。
缺點:
- 為了傳遞一個字符串數(shù)據(jù)占用了全局變量
user_avatar
,當有很多數(shù)據(jù)需要傳輸時則會占用很多全局變量撤蟆。 - 如果返回數(shù)據(jù)存在換行將會導致JS報錯
// 渲染結果有換行符var user_id = "https://avatars1.githubusercontent.com/u/3949015?v=3&s=40";// Uncaught SyntaxError: Unexpected token ILLEGAL
優(yōu)化:可以通過指向的某一個變量存放所有后端返回的內(nèi)容堂污,最小程度占用全局變量。例:// PHP 代碼var SERVER_DATA = { username: {$username}, userid: {$userid}, title: {$title}}// 渲染結果var SERVER_DATA = { username: "NimoChu", userid: 1, title: 'F2E'}
使用建議:需要最快速度傳遞數(shù)據(jù)給 JS 并十分確定此數(shù)據(jù)穩(wěn)定時讨衣,使用此方式式镐。數(shù)據(jù)格式復雜的建議使用script填充JSON 或AJAX獲取JSON 方法。
3. script填充JSON****JSON 語法**填充 JSON 數(shù)據(jù)到 <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>
優(yōu)點:頁面加載完成后就可以獲取到數(shù)據(jù)燎孟。不占用全局變量尸昧,可傳遞大量數(shù)據(jù)集合。
缺點:數(shù)據(jù)量特別大時會導致頁面初次加載變慢爆侣。變慢并不只是文件大小導致的幢妄,也因為服務器查詢數(shù)據(jù)并返回合集是需要時間,可使用AJAX獲取JSON完成按需加載和加載等待乎赴。
使用建議:適合傳遞在DOM加載完成時就需要用到的大量數(shù)據(jù)集合置吓。例如:前端控制頁面渲染,后端將JSON數(shù)據(jù)源填充到 <script>
由前端使用 JavaScript模板引擎 進行頁面渲染友题。如何選擇Javascript模板引擎(javascript template engine)?
4. AJAX獲取JSON使用 AJAX 獲取JSON數(shù)據(jù)
<span id="showdata">查看資料</span>
<div style="display:none;" id="box">
<h2>用戶信息</h2>
<p id="info">![](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 圖片
- 向服務器發(fā)送獲取用戶信息的AJAX請求
- 服務器返回JSON字符串戈抄,$.getJSON 自動將返回的 JSON字符串轉(zhuǎn)換為對象
- 填充內(nèi)容到
<p id="info">
優(yōu)點:不占用全局變量和 DOM 節(jié)點后专,可以自由控制獲取數(shù)據(jù)的觸發(fā)條件(頁面加載完成時、用戶點擊查看資料時或用戶點擊某個按鈕時)戚哎。當開始獲取數(shù)據(jù)時可使用 loading 圖片占位提示用戶數(shù)據(jù)正在讀取。防止頁面加載所有數(shù)據(jù)導致的頁面加載緩慢丈冬。
缺點:會產(chǎn)生額外的HTTP請求甘畅。不能在DOM加載完成以后立即獲取往弓,需要發(fā)送請求-接收響應蓄氧。
使用建議:適合加載非主要信息、設定觸發(fā)條件(用戶點擊查看資料時)缴淋,并提供友好的數(shù)據(jù)讀取等待提示泄朴。
5. WebSocket實時傳輸數(shù)據(jù)如果將 AJAX請求和響應比喻成給服務器發(fā)短信和等待服務器回復短信祖灰,而 WebSocket 就如同和服務器打電話。
此處不對WebSocket做過多介紹局扶,附上參考資料:
6. 總結每種情況都有每種情況的用處叁扫,沒有絕對正確的方法。根據(jù)實際情況靈活的選擇獲取數(shù)據(jù)方式畴蒲。
若作者顯示不是Nimo(被轉(zhuǎn)載了)对室,請訪問Github原文進行討論:前后端數(shù)據(jù)交互方法 · Issue #13 · nimojs/blog · GitHub**