1. 程式人生 > >Laravel中使用AJAX動態重新整理部分頁面

Laravel中使用AJAX動態重新整理部分頁面

AJAX相信大家都不陌生,有很多不同的Javascript Frameworks可以用來快速實現AJAX功能。那麼今天我們一起來看一下如何在使用了PHP Frameworks的網站中使用AJAX來重新整理頁面的一小部分。

這裡我使用的是jQuery + Laravel(當然如果使用了其他框架,基本的概念也是不變的)。如圖,假設我們製作了一個頁面來管理客戶的茶葉消耗:
tea consumption block

我們想製作一個模組來動態為每一個新的茶葉消耗增加一個消耗選擇區,即點選新增消耗後,會動態增加一個新的茶葉消耗區域:
add tea consumption dynamically

另外,當點選刪除該消耗時,該消耗區域會動態刪除。

要實現這樣的功能,我們的基本思路如下(MVC Pattern):

  • 使用AJAX POST call來呼叫Controller的函式
  • Controller返回我們所需的View中的HTML程式碼片段
  • 呼叫AJAX callback函式動態將HTML程式碼片段插入到頁面中

那麼首先我們先建立我們的js檔案,在這裡我新建了一個叫my-ajax-add-tea-consumption.js的檔案,並放在了/public/js資料夾中。我們在view模板中使用<script></script>呼叫:

<!DOCTYPE html>
<html lang="en">
...
<body
>
... <input type="hidden" name="order_id" value="
{{ $order->id }}"> <div class="tea-consumption"> <div class="card" id="tea-card-{{ $tea_consumption->id }}> <div class="card-header"> <span>茶葉消耗</span> <button
type="button">
刪除該消耗</button> <input type="hidden" value="
{{ $tea_consumption->id }}"> </div> <div class="card-block"> <!-- 其他inputs --> </div> </div> </div> <button type="button" name="btn-add">新增消耗</button> <script src="/js/my-ajax-add-tea-consumption.js"></script> </body> </html>

由於 Laravel的Middleware會自動檢查CSRF,所以如果使用POST,DELETE等方法的時候我們需要全域性設定一下AJAX的header,這樣在每次傳送AJAX的時候,都會自動傳送相應的csrf token,只有Laravel檢查與相應session中的token匹配後,才會呼叫相應的Controller函式。所以在我們首先在view中增加一個meta tag

<meta name="csrf-token" content="{{ csrf_token() }}">

然後在我們的my-ajax-add-tea-consumption.js中,加上:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

這樣就可以了。然後我們開始新增ajax函式(首先是增加模組):

$('button[name="btn-add"]').click( function() {
    //route format: /orders/{id}/add-tea-consumption
    $.post('/orders/' + $('input[name="order_id"]').val()  + '/add-tea-consumption'), function( html ) {
        $('.tea-consumption').append( html );
    });
});

看起來很簡單吧,但是要注意的幾個地方有:

  • Button的type一定要寫為button,而預設的話預設type=”submit”,這樣一旦button被點選頁面就會跳轉。
  • post的url我們填的是laravel中的route(稍後在routes中我們還會敘述)
  • callback function中的資料html是由controller函式中使用某個view所返回的html程式碼

好了,那麼現在我們的$.post() call會後臺訪問/orders/{id}/add-tea-consumption這樣形式的路徑,所以我們在\routes\web.php中加上我們的路徑名和處理方式:

route::post('/orders/{id}/add-tea-consumption', '[email protected]_tea_consumption');

即我們希望由RoomOrdersController這個控制器中的add_tea_consumption函式來處理我們的ajax請求。那麼我們一起來看一下這個函式到底有些什麼內容:

<?php           //RoomOrdersController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\RoomOrder;
use App\RoomTeaConsumption;

class RoomOrdersController extends Controller
{
    ...

    /**
    * Return view fragments in html form
    *
    * @param $order_id
    * @return \Illuminate\Http\Response
    */
    public function add_tea_consumption ( $order_id ) {
        $consumption = RoomTeaConsumption::create([
            'room_order_id' => $order_id
            /* more fields omitted */
        ]);

        return view('partials.tea_consumption')->with([
            'tea_consumption' => $consumption
            /* more fields omitted */
        ]);
    }
}

其實跟平時我們controller中的函式並沒有什麼區別,因為我們需要返回的本來就是html程式碼,而呼叫view()的時候,Laravel已經幫我們生成好了。

這樣一來,當ajax call成功返回時,$('.tea-consumption').append( html );就會將view生成的html程式碼插入我們指定的DOM中,從而動態重新整理頁面。

值得注意的是,如果你發現你的ajax call返回internal 500錯誤,那麼首先請檢查你的csrf是否已經設定好,如果確認沒有問題,那麼請檢查你的view template檔案,只要其中有錯誤,那麼就無法返回html,從而造成錯誤。

要刪除模組,其實是差不多的,但是要注意的是,我們的listener不能使用.click()來注入,因為當模組被刪除後,.click()注入的listener就會失效,我們需要使用parent的.on()函式:

('.tea-consumption').on('click', '#my-button', function() {
    $.ajax({
        method: 'DELETE',
        url: '/teas/consumption/' + $('this').next('input').val() + '/delete',
        success: function( id ) {
            var sel = $('#tea-card-' + id);
            sel.remove();
        }
    });
});

AJAX需要細心,因為錯誤比較難debug,所以在開發的時候一定要注意,出現問題了多查閱一下相關API。

相關推薦

Laravel使用AJAX動態重新整理部分頁面

AJAX相信大家都不陌生,有很多不同的Javascript Frameworks可以用來快速實現AJAX功能。那麼今天我們一起來看一下如何在使用了PHP Frameworks的網站中使用AJAX來重新整理頁面的一小部分。 這裡我使用的是jQuery + Lar

js ajax動態新增節點無法觸發點選事件

在寫ajax載入資料的時候發現,後面新增進來的demo節點元素,失去了之前的點選事件。 其實最簡單的方法就是直接在標籤中寫onclick="",但是這樣寫有些場景的是實現不了的,最好的方式還是通過給類名繫結一個click事件。 方法一:使用live: live()函式會給被選的元素繫結上一個或者多個事件

metisMenu.js動態側邊導航的實現(ajax動態渲染部分導航)

  使用metisMenu.js實現後臺管理系統的導航,通過點選導航,切換不同的頁面內容。有些時候。我們需要動態新增頁面的內容,即通過ajax請求後臺來渲染部分導航的內容。 第一部分是靜態導航的實現,即通過點選導航切換右側頁面的實現。第二部分是動態渲染導航的實現。(demo例子

laravelajax重新整理分頁

ajax無重新整理分頁的優點: 1、區域性重新整理 減輕壓力 2、美觀 提高使用者體驗 php程式碼: /* @Laravel框架 @Ajax無重新整理分頁(簡單7步驟) */ public function page() { //1、查詢資料庫總條數 $count = count(Db::table(

SSH通過ajax向action傳值以及ajax非同步重新整理頁面

js程式碼: function send(aid,key,account,pswd){ var status = $("input[id='"+account+"']").val(); $.ajax({ type:"post", url:"order_sendAc

SSMAjax實現非同步重新整理,前端頁面綁值。

//獲取表單的值,並進行序列化,將序列化的值傳入controller。 var cc=$("#add_menber_style").serialize(); $.ajax({ type :"PO

定時請求php 後臺 AJAX 請求,在頁面倒計時,和顯示重新整理時間

這個是通過ajax , 普通的重新整理,在另一篇文章 <!DOCTYPE html> <html lang="en"> <head> <meta

Ajax實現動態重新整理頁面(get)

第一步:寫一個Util.js function getXmlHttpRequest() { var xhr; try { // Firefox, Opera 8.0+, Safari xhr = new X

jsp頁面動態調用系統時間的實現

簡單 char ext fonts get har interval sso 星期 在做WEB項目時,經常會須要 在頁面中顯示當前時間,以下介紹一個簡單的調用系統時間的方法,效果如圖: 在頁面中插入以下代碼即可了 <div id="time"&

筆記-返回到前一個頁面時顯示前一個頁面ajax獲取的數據

最終 logs ajax請求 嘗試 但是 repl 拼接 新聞 筆記 筆記第一部分:http://www.cnblogs.com/zczhangcui/p/6869219.html 在第一部分遇到的問題是,用ajax獲取了一系列列表信息後,拼接好html後插入到了原有頁面中

工作總結 頁面通過ajax 動態綁定 列表頁面 列表每一項的事件 事件觸發多次

什麽 就會 clas 方法調用 ack gpo 註冊 沒有 ajax 遇到一個問題 困惑了兩天 頁面的事件不知道為什麽觸發多次 試了各種辦法 對比了之前的頁面 各種測試 不是js css 外部鏈接 重復加載問題 也不是嵌套的 div 問題 各種都試過 最終發現 是

salesforce零基礎學習(八十六)Ajax Toolkit (VF頁面使用及javascript action使用)

ssi rate 基礎學習 lean 返回結果 item exceptio ont tom Ajax Toolkit 參考文檔:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax

ajax 動態獲取數據庫的值

on() click black .get solver 關閉連接 SQ system ppi 功能簡介: 在一個輸入框中輸入內容 ,當內容長度>1時向後發送ajax 從數據庫中獲取有關文本框中的內容在前臺顯示, 前臺設計一些點擊事件,以及jquery的應用

C#利用phantomJS抓取AjAX動態頁面

tin 文件 stringbu == 導致 style 間隔 edi zip壓縮 在C#中,一般常用的請求方式,就是利用HttpWebRequest創建請求,返回報文。但是有時候遇到到動態加載的頁面,卻只能抓取部分內容,無法抓取到動態加載的內容。 如果遇到這種的話,推薦

分享Laravelblade頁面更改沒有及時顯示在頁面的問題解決方案

         1.問題場景          虛擬機器重啟後,更改laravel中的blade頁面重新整理瀏覽器不能看到更改效果          2.

vue專案使用Echarts 動態更改圖表資料 , Vue 折線圖、柱狀圖等圖表動態重新整理

問題:在vue元件中,用echarts外掛 動態獲取、修改圖表資料 解決:已解決! 第一步:開啟cmd命令視窗 安裝echarts依賴 安裝:npm install echarts -S 第二步:在main.js中全域性引入   //引入echarts的圖表外掛

Java架構-SOAspringmvcrestful服務動態重新整理token資訊

因為要考慮服務端token的動態重新整理,而且還要單獨啟動定時排程任務去重新整理token資訊,保證token的時效及安全問題,直接分享動態重新整理token的程式碼: Java程式碼 我這邊會將近期研發的spring cloud微服務雲架構的搭建過程和精髓記

vue-router關於元件複用頁面重新整理的問題

業務描述: 當前頁面是一個帶引數的頁面,如下: 頁面下方有tab,點選其一個的跳轉路由是: 由此,發現問題,地址改變了,但是頁面資料沒有重新整理。 查閱後,此情況屬於元件複用的情況。 解決方法: 通過watch監聽路由變化: watch: { '

MVC使用ajax非同步重新整理時怎樣輸出從後臺傳過來的JSON資料

    前言 這幾天在學習MVC使用AJAX非同步刷,因為是新手。所以在js中傳引數到後臺以及後臺返回資料到前臺怎麼接受,怎麼前臺遍歷出JSON資料都開始不知道,相信新手在使用時跟我一樣會遇到,這裡我就和大家分享一下。新手勿噴。。。 這裡使用VS2010中新建的mvc 3.0專案

scrapy由淺入深(三) selenium模擬爬取ajax動態頁面(智聯招聘)

爬取智聯招聘的網址:https://sou.zhaopin.com/?pageSize=60&jl=489&kw=python&kt=3         上一篇部落格爬取了前程無憂的職位招聘資訊,總體來說前程無憂的網站資訊並不難爬取,前程無憂的網站並