前后端數(shù)據(jù)交互方法

來自在知乎看到的前端 枢冤,后端 關于數(shù)據(jù)交互的問題?的回答铜秆,出自作者NimoChu

  1. HTML賦值
  2. JS賦值
  3. script填充JSON
  4. AJAX獲取JSON
  5. WebSocket實時傳輸數(shù)據(jù)
  6. 總結

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ù)榕暇。
缺點:

  1. 為了傳遞一個字符串數(shù)據(jù)占用了全局變量 user_avatar,當有很多數(shù)據(jù)需要傳輸時則會占用很多全局變量撤蟆。
  2. 如果返回數(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 獲取用戶資料的示例度宦。流程如下:

  1. 頁面上只顯示查看資料
  2. 用戶點擊查看資料
  3. 顯示用戶信息和 loading 圖片
  4. 向服務器發(fā)送獲取用戶信息的AJAX請求
  5. 服務器返回JSON字符串戈抄,$.getJSON 自動將返回的 JSON字符串轉(zhuǎn)換為對象
  6. 填充內(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做過多介紹局扶,附上參考資料:

  1. WebSocket**
  2. 使用 HTML5 WebSocket 構建實時 Web 應用**
  3. Ajax vs WebSocket**

6. 總結每種情況都有每種情況的用處叁扫,沒有絕對正確的方法。根據(jù)實際情況靈活的選擇獲取數(shù)據(jù)方式畴蒲。

若作者顯示不是Nimo(被轉(zhuǎn)載了)对室,請訪問Github原文進行討論:前后端數(shù)據(jù)交互方法 · Issue #13 · nimojs/blog · GitHub**

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掩宜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辽旋,更是在濱河造成了極大的恐慌檐迟,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糖儡,死亡現(xiàn)場離奇詭異怔匣,居然都是意外死亡桦沉,警方通過查閱死者的電腦和手機纯露,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門埠褪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钞速,你說我怎么就攤上這事嫡秕。” “怎么了驾凶?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵掷酗,是天一觀的道長。 經(jīng)常有香客問我技肩,道長糕殉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任阿蝶,我火速辦了婚禮,結果婚禮上玷过,老公的妹妹穿的比我還像新娘筑煮。我一直安慰自己,他們只是感情好真仲,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布秸应。 她就那樣靜靜地躺著碑宴,像睡著了一般桑谍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞间,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天增热,我揣著相機與錄音盅粪,去河邊找鬼悄蕾。 笑死,一個胖子當著我的面吹牛奠骄,可吹牛的內(nèi)容都是我干的番刊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝉绷,長吁一口氣:“原來是場噩夢啊……” “哼枣抱!你這毒婦竟也來了?” 一聲冷哼從身側響起桅狠,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤中跌,失蹤者是張志新(化名)和其女友劉穎菇篡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱还,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年触徐,在試婚紗的時候發(fā)現(xiàn)自己被綠了狐赡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸟雏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出览祖,到底是詐尸還是另有隱情,我是刑警寧澤展蒂,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站柳骄,受9級特大地震影響箕般,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丝里,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一杯聚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧目锭,春花似錦纷捞、人聲如沸痢虹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奖唯。三九已至,卻和暖如春糜值,著一層夾襖步出監(jiān)牢的瞬間丰捷,已是汗流浹背坯墨。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留病往,地道東北人捣染。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像停巷,于是被迫代替她去往敵國和親耍攘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容