datagrid是在 table的基礎上變化而來的, 而不是在div的基礎上來的。 從div來變成 datagrid,樣式的設置仍是是比較麻煩的。php
dg=datagrid 的標題 來源於 columns 屬性, 其內容 來源於 url屬性。 關鍵是, 必定要設置這樣的屬性, 才能給你顯示標題和內容, 不然即便你寫了 tr等都不會顯示css
dg的url 最後輸出的內容 必須是 json格式: 若是是php的, 則要用echo, 若是是 其餘文件,就要用 json數據html
並且ajax的方式好像都是 post方式。
好比: 分頁, 前端 須要 向 後臺 傳遞數據: 一個是page(當前頁碼,便是第幾頁?), 一個是 pageSize(一頁多少條數據)。 而後後臺post獲取到 頁碼和頁數, 在 mysql的查詢語句中 ,用 limit start rowsCount, 來規範限定 返回的數據。
並且, 後臺 除了返回 當前頁面須要的部分 rows數據外, 還要返回一個 total總頁數。
最後的 返回結果 要寫成 json格式的: 這種 類型: {"total": $total, "rows": .....}
前端
一個是加載 dg的內容, 並完成分頁;
二個是, 排序,能夠只作 初始化的時候 排序;
三是: 設置dg的樣式, 有striped, rowNumbers, singSelected爲true等等.mysql
isset是判斷 $_POST的某個 變量名 是否設置了的, 主要是 用來 判斷 按鈕 是否被 單擊了的, 主要是 防止 頁面刷新時 執行代碼;
而 !empty 是判斷 $_POST的變量名的值是否爲空, 主要是用來判斷搜索框中是否有輸入 內容的, 經常使用的判斷就是:
if(isset($_POST['name']) && !empty($_POST['name'])){...}
ajax
主要有三種情形:sql
$str{5}
能夠輸出字符串中的 第n 個字符。經常使用來判斷字符串的長度:if(!isset($str{5})){...}
==============================================數據庫
$('#btn1, #btn2'). show(); $('#btn1, #btn2'). hide();
而有些操做是, 共同的: 好比 開始編輯的操做是: beginEdit, 結束編輯的操做是: endEdit.json
==========================================bootstrap
[{"id": 1, "name": "foo"}, .....]
的形式. 若是 php返回的格式 不是這樣的, 將不會加載數據 進來.public function dgcontent(){ $sort = I('post.sort'); $order = I('post.order'); $page = I('post.page'); $pageSize = I('post.rows'); $from = $pageSize*($page-1); $dg = M('dg'); $total = $dg -> count(); $result = $dg->field('id, dept, class, name')->order("$sort $order")->limit($from,$pageSize)->select(); $json=""; for($i=0, $j=count($result); $i<$j; $i++){ $json .= json_encode($result[$i]).','; } $json ='{"total":'.$total.',"rows":['. substr($json, 0 , -1).']}'; echo $json; }
==========================================
strip和stripe的區別?
按照漢字的拼音排序,用的比較可能是在人名的排序中,按照姓氏的拼音字母,從A到Z排序; 若是存儲姓名的字段採用的是GBK字符集,那就好辦了,由於GBK內碼編碼時自己就採用了拼音排序的方法(經常使用一級漢字3755個採用拼音排序,二級漢字就不是了,但考慮到人名等都是經常使用漢字,所以只是針對一級漢字能正確排序也夠用了)。 直接在查詢語句後面 添加 order by name asc; 查詢結果按照姓氏的升序排序; 若是存儲姓名的字段採用的是 utf8字符集,須要在排序的時候對字段進行轉碼;對於的代碼是 order by convert(name using gbk) asc; 一樣,查詢的結果也是按照姓氏的升序排序(因此, 若是存儲的是utf8字符集, 由於有一個轉碼的過程, 因此看到的排序和想象中的不同.
count(1),其實就是計算一共有多少符合條件的行。
1並非表示第一個字段,而是表示一個固定值。
其實就能夠想成表中有這麼一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.
同理,count(2),也能夠,獲得的值徹底同樣,count('x'),count('y')都是能夠的。同樣的理解方式。在你這個語句理均可以使用,返回的值徹底是同樣的。就是計數。
count(*),執行時會把星號翻譯成字段的具體名字,效果也是同樣的,不過多了一個翻譯的動做,比固定值的方式效率稍微低一些。
=====================================
主要仍是從 語義和你的用途上來區分,雖然都能實現相同的效果。
什麼時候應當使用margin: - 不須要在border外側添加空白時。 - 空白處不須要背景(色)時。 - 上下相連的兩個盒子之間的空白,須要相互抵消時。如15px + 20px的margin,將獲得20px的空白。 什麼時候應當時用padding: - 須要在border內測添加空白時。 - 空白處須要背景(色)時。 - 上下相連的兩個盒子之間的空白,但願等於二者之和時。如15px + 20px的padding,將獲得35px的空白。 ::: margin是用來隔開元素與元素的間距;padding是用來隔開元素與內容的間隔。 margin用於佈局分開元素使元素與元素互不相干;「老死不相往來」 是兩家人 padding用於元素與內容之間的間隔,讓內容(文字)與(包裹)元素之間有一段「呼吸距離」。 是一家人
======================================
/*在js中定義變量,並非必須加var的! 並且, 不加var表示的是 "全局變量", 是頂級對象window的成員變量
//這裏的obj沒有加var, 就是全局對象window的屬性 obj={ rowEdit : undefined, search: function(){ }, add: function(){ }, update: function(){ }, remove: function(){ }, save:function(){ }, };
https://blog.csdn.net/u012739535/article/details/17621247
, https://www.cnblogs.com/yangzhx/p/4019073.html
)包括: undefined, '', 0, null, false. 這些都叫 假值或空值, 在 if判斷中都是假. 可是它們仍是有區別的:
typeof( var_name)
能夠知道: undefined 的類型是: undefined, 0 的類型是: number, '' 的類型是string, null的類型是: object, 也就是說 null是對象的空值; false是boolean類型的.這些空值相互之間 用 == 判斷 , 的結果 是 : 0, false , ''', 三者之間是相等的: 即 0 == false == '' 的結果是true的. 能夠認爲這三個是 " 假值". 而 undefined==null , 能夠認爲它們是空值. 可是 undefined和 null 跟 數字相加的結果是不一樣的: 好比: 10+null =10, 10+undefined = NaN.
全部的假值 用 == 和 空值 比較的 結果 都是 false.
假值 , 有一個實際的對象, 因此 能夠用 .toString() 方法.
而空值, 連對象都沒有, 因此 不能用 .toString 方法, 不然將拋出異常
undefined表示 無效對象, 當定義一個變量未被初始化時, 就是undefined, 而 null是已經被初始化 爲空對象. 可是全部的空值和假值 用 === 判斷 都是false.
obj={ rowEdit : undefined, search: function(){ .... add: function(){ if(!this.rowEdit){ // 這裏要加this $('#save, #cancel').show(); $('#box').datagrid('insertRow',{ index: 0, row: { } });
參考 : https://www.cnblogs.com/langhua/p/3672820.html
=================================================
url: "{:U('xscontent')}"+'/?class={$class}',
就行了. /*datagrid的返回結果, 來填充 前臺的 數據行,必須嚴格要求json格式, 並且json的格式和屬性名必須是: * "rows:": json_object_array, 即必須是rows, 後面的數據必須是數組, 每一個數組元素必須是json格式的對象 * echo '{"total":"11","rows":[{"id":"100", "class":"A_class", "name":"the_Name", "account":"the_account"}]}'; */
==============================================
好比: 在 dg的 onAfterEdit事件中, 就要判斷 url 是否爲空, 而後纔去調用 ajax.
onAfterEdit: function(rowIndex, rowData, changes){ var inserted = $('#box').datagrid('getChanges', 'inserted'); var updated = $('#box').datagrid('getChanges', 'updated'); var url=info=''; if(inserted.length>0){ url='{:U("add")}'; info='新增'; } if(updated.length>0){ url='{:U("update")}'; info='修改'; } /* 這裏很重要 , 要判斷一下 url是否爲空, 不然 即便任意地 雙擊 一行記錄, 再去 雙擊另一行記錄, 即便沒有和數據庫進行 修改操做, 也會提示 ajax的success提示信息 , 然而這個時錯誤的! */ if(url!='' && info != ''){ $.ajax({ type: 'post', url: url, data: {row: rowData,}, beforeSend: function(){ $('#box').datagrid('loading'); }, success: function(data){ if(data !== false){ $('#box').datagrid('loaded'); $('#box').datagrid('load'); $('#box').datagrid('unselectAll'); $.messager.show({ title: '消息', msg: '1個班級 '+ info +' 成功', showType: 'slide', timeout: 3000 }); obj.rowEdit = undefined; } }, });
===================================================
https://blog.csdn.net/Dzq_Boyka/article/details/78531217
主要思想是, 在 onClickRow 和 onDblClickRow 事件中 , 必須顯示的調用 $('#box').datagrid('unselectRow', rowIndex)
方法, 不能只是 簡單地 返回 return.
要想使dg 在 新增的時候, 不能選擇行或 雙擊行 操做, 那麼 能夠設置一個 標識變量: isAdded , 當 每次 新增的時候, 都從新設置 isAdded = false, 而後, 判斷 onClickRow 和 onDblClickRow 事件中 的 isAdded是否 爲false, 或者 true
可是又要保證 初次載入 datagrid的時候, 若是不點擊 新增的時候, 要可以 選擇單行, 或 雙擊單行操做, 就要 初始化 obj的 isAdded 爲true.
obj={ rowEdit : undefined, isAdded: true, // 這裏是 關鍵! add: function(){ // 一旦增長的時候, 就要從新初始化isAdded爲false, 由於只要保存/取消一次後, isAdded就失效了 this.isAdded=false; .... } onDblClickRow: function(rowIndex, rowData){ // 在新增記錄的時候, 禁止單擊選行 和 雙擊選行 if(!obj.isAdded){ $('#box').datagrid('unselectRow', rowIndex); return; } // 雙擊某一行的時候, 首先要關閉以前可能被修改的行 if(obj.rowEdit != undefined){ $('#box').datagrid('endEdit', obj.rowEdit); obj.rowEdit = undefined; } ............ }, onClickRow: function(rowIndex, rowData){ if(!obj.isAdded){ $('#box').datagrid('unselectRow', rowIndex); return; } },
=====================================================
https://blog.csdn.net/H12KJGJ/article/details/53672096
pageList 類型array 用法: 用戶能改變頁面尺寸。pageList 屬性定義了能改爲多大的尺寸。 代碼實例: $('#pp').pagination({ pageList: [10,20,50,100] });
分頁器中 的一個 頁面 由兩個 因素來決定: 一個是: pageSize( 每個頁面的最大尺寸), pageNumber(頁數), 因此 每一頁的第一條數據的索引值就是: pageSize*(pageNumber-1);
這個就是用來 作 數據庫的limit的 依據的:
所以 : onSelectPage 事件, 就是 當從新改變了pageSize , 從新選擇了 pageNumber後所獲得的頁面.
總共有4個 ajax事件: onSelectPage, onBeforeRefresh, onRefresh, onChangePageSize... 所以, 在dg中改變分頁尺寸的事件是 : onChangePageSize的回調函數中寫
===========================================
https://blog.csdn.net/peng_hong_fu/article/details/70662979
https://blog.csdn.net/amyleeYMY/article/details/63685330
由四位數字 組成:
!important =1000,
id的優先級=100,
類, 僞類, 屬性的優先級 =10,
元素, 僞元素的優先級=1
這些優先級, 無論層次, 只要有一個就 加上相應的 優先級 數值. 最後 算 總和.
可是要注意:
僞元素 只有四個, 即 :before, :after, : first-letter, :first-line , 主要是表示位置的
僞類 有更多, 只要是表示 "狀態"的, 好比 :link, :active, :visited, :hover, :focus, :first-child 等
若是有多個 相互衝突的 css規則 同時做用在同一個 元素上, 則最終 起做用的是: 以 定義這些類樣式的前後順序爲準, 後定義的樣式 會 覆蓋 先前定義的樣式, 即 後定義的樣式 最終 將起做用. 而跟 該元素上 , 多個類樣式 書寫的前後順序無關.
異步, 表示 它是 "非模態的", 雖然有 "遮照" 樣式, 可是 它並不會阻止 該消息框 後續的代碼的執行. 相反, 在執行 消息框的 回調函數時, 主函數的 剩餘代碼 已經執行完畢了! 因此這就是 爲何主函數中 沒法獲取 回調函數的 返回值的緣由
那麼 要想實現 模態 框的 效果, 想要 某些代碼 在 點擊 "肯定" 後, 再執行, 就要把 這些代碼 放在 消息框的 回調函數中, 由於 回調函數 總數在 用戶 單擊 "肯定" 按鈕後 才執行.