繼第一篇文章發佈以後laravel框架學習之路(一)先後臺用戶認證分離,忙着項目上的事情,一直沒有時間寫文章。進入到新公司後,忙裏偷閒,繼續個人laravel框架學習之路。如需參考代碼請移步kaihongChan@github.com(ps:項目還在逐步完善中,還有許多不足,如遇bug,請在評論區告知筆者)php
關於什麼是pjax,請讀者自行百度。css
準備工做:
一、下載jquery.pjax.js文件點擊下載
二、下載NProgress
三、將所需文件放入項目中,並在佈局文件中引用。(框架public目錄下)html
開始:
這裏筆者使用的是adminLTE後臺模板,具體使用可參考在Laravel5.* 中使用 AdminLTEhtml5
安裝pjax的composer包(laravel中間件):jquery
$ composer require spatie/laravel-pjax
在kernel.php文件中加入代碼:laravel
// app/Http/Kernel.php ... protected $middleware = [ ... \Spatie\Pjax\Middleware\FilterIfPjax::class, ];
配置pjax完成頁面交互:(ps:筆者整站使用pjax加載頁面,故在全局js文件中配置pjax,讀者可根據須要另行配置)git
$.pjax.defaults.timeout = 5000; $.pjax.defaults.maxCacheLength = 0; //配置可點擊的<a>標籤使用pjax $(document).pjax('a:not(a[target="_blank"])', { container: '#pjax-container'//配置pjax刷新容器 }); NProgress.configure({parent: '#pjax-container'}); //超時執行函數 $(document).on('pjax:timeout', function (event) { event.preventDefault(); });
至此,laravel結合pjax已完成。github
附件:
筆者的佈局(layout.blade.php):ajax
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>AdminLTE</title> <!-- Tell the browser to be responsive to screen width --> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/bootstrap/dist/css/bootstrap.min.css')}}"> <!-- Font Awesome --> <link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/font-awesome/css/font-awesome.min.css') }}"> <!-- Ionicons --> <link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/Ionicons/css/ionicons.min.css') }}"> <!-- select2 --> <link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/select2/dist/css/select2.min.css') }}"> <!-- DataTables --> <link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css') }}"> <link rel="stylesheet" href="{{ asset('js_expand/dataTables.buttons/buttons.dataTables.min.css') }}"> <!-- Theme style --> <link rel="stylesheet" href="{{ asset('AdminLTE/dist/css/AdminLTE.min.css') }}"> <!-- AdminLTE Skins --> <link rel="stylesheet" href="{{ asset('AdminLTE/dist/css/skins/skin-blue.min.css') }}"> <!-- nprogress --> <link rel="stylesheet" href="{{ asset('js_expand/nprogress/nprogress.css') }}"> <!-- toastr --> <link rel="stylesheet" href="{{ asset('js_expand/toastr/build/toastr.min.css') }}"> <!-- sweetalert --> <link rel="stylesheet" href="{{ asset('js_expand/sweetalert/dist/sweetalert.css') }}"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> <!-- Google Font --> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic"> <!-- REQUIRED JS SCRIPTS --> <!-- jQuery 3 --> <script src="{{ asset('AdminLTE/bower_components/jquery/dist/jquery.min.js') }}"></script> <!-- jQuery 2 --> <script src="{{ asset('js_expand/jQuery/jQuery-2.1.4.min.js') }}"></script> <!-- Bootstrap 3.3.7 --> <script src="{{ asset('AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js') }}"></script> <!-- Select2 --> <script src="{{ asset('AdminLTE/bower_components/select2/dist/js/select2.full.min.js') }}"></script> <!-- AdminLTE App --> <script src="{{ asset('AdminLTE/dist/js/adminlte.min.js') }}"></script> <!-- dataTables --> <script src="{{ asset('AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js') }}"></script> <script src="{{ asset('AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js') }}"></script> <script src="{{ asset('js_expand/dataTables.lan.js') }}"></script> <script src="{{ asset('js_expand/dataTables.buttons/dataTables.buttons.min.js') }}"></script> <script src="{{ asset('vendor/datatables/buttons.server-side.js') }}"></script> </head> <body class="hold-transition skin-blue sidebar-mini"> <div class="wrapper"> <!-- Main Header --> @include('admin::partials.header') <!-- Left side column. contains the logo and sidebar --> @include('admin::partials.sidebar') <!-- Content Wrapper. Contains page content --> <div class="content-wrapper"> <!-- Main content --> <section class="content container-fluid" id="pjax-container"> @yield('content') </section> <!-- /.content --> </div> <!-- /.content-wrapper --> <!-- Control Sidebar --> @include('admin::partials.control') <!-- /.control-sidebar --> <!-- Main Footer --> @include('admin::partials.footer') </div> <!-- ./wrapper --> <script> var csrf_token = '{{ csrf_token() }}'; </script> <!-- nprogress --> <script src="{{ asset('js_expand/nprogress/nprogress.js') }}"></script> <!-- pjax --> <script src="{{ asset('js_expand/jquery-pjax/jquery.pjax.js') }}"></script> <!-- toastr --> <script src="{{ asset('js_expand/toastr/build/toastr.min.js') }}"></script> <!-- sweetalert --> <script src="{{ asset('js_expand/sweetalert/dist/sweetalert.min.js') }}"></script> <!-- admin.base --> <script src="{{ asset('js_expand/laravel-admin/admin.base.js') }}"></script> <!-- custom script--> <script> var selectedMenu = "{!! $requestUri !!}"; </script> </body> </html>
全局js文件(admin-base.js):bootstrap
toastr.options = { closeButton: true, progressBar: true, showMethod: 'slideDown', positionClass: 'toast-top-right', timeOut: 4000 }; $.pjax.defaults.timeout = 5000; $.pjax.defaults.maxCacheLength = 0; $(document).pjax('a:not(a[target="_blank"])', { container: '#pjax-container' }); NProgress.configure({parent: '#pjax-container'}); $(document).on('pjax:timeout', function (event) { event.preventDefault(); }); $(document).on('submit', 'form[pjax-container]', function (event) { $.pjax.submit(event, '#pjax-container') }); $(document).on("pjax:popstate", function () { $(document).one("pjax:end", function (event) { $(event.target).find("script[data-exec-on-popstate]").each(function () { $.globalEval(this.text || this.textContent || this.innerHTML || ''); }); }); }); $(document).on('pjax:send', function (xhr) { if (xhr.relatedTarget && xhr.relatedTarget.tagName && xhr.relatedTarget.tagName.toLowerCase() === 'form') { $submit_btn = $('form[pjax-container] :submit'); if ($submit_btn) { $submit_btn.button('loading') } } NProgress.start(); }); $(document).on('pjax:complete', function (xhr) { if (xhr.relatedTarget && xhr.relatedTarget.tagName && xhr.relatedTarget.tagName.toLowerCase() === 'form') { $submit_btn = $('form[pjax-container] :submit'); if ($submit_btn) { $submit_btn.button('reset') } } NProgress.done(); }); $(function () { $('.sidebar-menu li:not(.treeview) > a').on('click', function () { var $parent = $(this).parent().addClass('active'); $parent.siblings('.treeview.active').find('> a').trigger('click'); $parent.siblings().removeClass('active').find('li').removeClass('active'); }); $('[data-toggle="popover"]').popover(); //整頁刷新時,菜單顯示 var selector = $('.sidebar-menu').find('a[href="/'+ selectedMenu +'"]'); selector.parent().addClass('active'); selector.parents('ul.treeview-menu').css('display', 'block'); selector.parents('li.treeview').addClass('menu-open'); //datatables刪除按鈕 $('#pjax-container').on('click', '.row-delete', function () { var del_url = $(this).data('url'); swal({ title: "肯定刪除此項?", type: "warning", showCancelButton: true, confirmButtonColor: "#DD6B55", confirmButtonText: "確 定", closeOnConfirm: false, cancelButtonText: "取 消" }, function(){ $.ajax({ method: 'post', url: del_url, data: { _method:'delete', _token:csrf_token, }, success: function (data) { if (typeof data === 'object') { if (data.status) { swal(data.message, '', 'success'); $.pjax.reload('#pjax-container'); } else { swal(data.message, '', 'error'); } } } }); }); }); });