開發過程當中 的一些 補充知識點 + 關於mysql中的日期和時間函數?

參考: https://www.jb51.net/article/23966.htm https://yq.aliyun.com/articles/260389javascript

  1. mysql中的 日期格式是: HHHH-MM-DD , 時間格式 是 HH:MM:SS[.fraction]php

  2. 而 datetime和 timestamp數據類型的 格式 是 date+time, 即 二者的格式都是 : 'HHHH-MM-DD HH:MM:SS'html

  3. 注意兩類函數的區別: 一種是 返回當前日期或時間的函數; 一類是 提取 extract /截取 / 抽取 給定日期時間 變量中的 date 或 time.
    好比: 獲取當前 日期和時間的函數: now(), curdate(), curtime(),
    而提取當前時間中的 部分值: date(now())....java

  4. 關於current_timestamp , 它既是一個函數, 也是一個 "mysql的內置的 常量"!
    因此 select current_timestamp() 返回當前的時間戳,
    而 一樣的 select current_timestamp 一樣會 返回跟上面同樣的結果mysql

  5. now([decision]) 有一個可選的 小數的精度位數, 最大是6jquery

6, 關於 datetime 和 timestamp數據類型的比較 參考: https://yq.aliyun.com/articles/260389ajax

  • 二者的 顯示 格式 是同樣的! 都是 : 'HHHH-MM-DD HH:MM:SS' , 要注意跟php的時間戳相區別, php中的時間戳是一個 int 整數!
  • datetime是8個字節, 而 timestamp只須要4個字節, 因此 二者的 日期時間範圍 是不一樣的
  • timestamp 的字段 具備 : 自動初始化和 自動更新的特性! automatic initialization and updating.
    即: 在 插入和更新的時候, 能夠不用 指定這個字段的值, 會默認的 以 當前日期時間來填充它: 即: default current_timestamp on update current_timestamp

並且 timestamp在存儲和顯示的時候的特性, 是 能夠自動 在 本地時區和 UTC 時間 之間自動轉換: 存儲時, 自動將 本地機器時區時間轉換成 UTC 進行存儲, 而在 顯示的時候, 又會自動將UTC 時間 轉換爲 當前 機器上的 本地時區進行顯示! 可是 注意 timestamp 類型 受 mysql的 版本影響比較多, 要注意!

===================================sql

爲何 $(function(){ }); 內部定義的 函數, 在外部會找不到呢?

  • 這個是關於閉包 的一個知識點: 所謂閉包, 是指在 能夠訪問 一個函數做用域內的變量的 另外一個函數! 閉包一般的用法是: 在一個 函數的內部 再次定義的函數!
  • 因此 在 $(function(){...}); 中, $ 裏面的 function()本是就是一個 匿名函數了, 而後 你 又在這個匿名 函數 內, 再去定義 一個 有名函數. 那麼這個 有名函數 就是 "函數中的函數"了, 就是一個 閉包函數了. 這個閉包函數 只是 在 $(function(){....// 在 這個裏面的 做用域, 其餘變量和函數 是可見 這個 "閉包的有名函數的...}); 除此以外, 在 $ 的 匿名函數的外面 , 是 看不到 裏面的 你定義的 "有名函數"的.
  • 因此 會 報錯: chksub沒有定義!
  • 所以 , 要清楚 一個 誤解: 使用jquery後, 並非 什麼 東西, 代碼, 函數 , 都要放在 $(function(){.....}); 內部! 你要定義 能夠被 外部的 html標籤 所看獲得的 函數, 就不能 放在 $(function(){...}); 的匿名函數內. 應該直接 在 script標籤 內定義 有名函數.
  • $(function(){...}).. 只是一個 語句, 只是 在 要求執行某些 語句的時候, 要求在全部 dom元素都 加載後 再執行的時候, 使用. 總之, 若是是 單獨的 語句, 是能夠放在 $(function(){...}).. 裏面的, 而若是是 函數 , 則必定 不能!

全部的 匿名函數(閉包) 中的 返回值 在外部實際上是得不到的, 是 異步的, 也就是 在 匿名函數 執行完畢時, 其棧就 沒有了, 所以, 只有 用 外部的 全局變量 進入到 異步函數 內, 去接收 內部閉包函數的 處理結果.

這個閉包匿名函數 返回值 的問題, 已經 在多個地方 遇到過了: 閉包 = 匿名函數, 就至關於 一個盒子中的盒子, 咱們在外面 (有名函數 定義的外面 ), 是能夠看獲得 外面的那個盒子的, 可是咱們看不到 裏面的 那個盒子. 所以, 裏面的 那個盒子(匿名函數) 的返回值 , 咱們在外面是得不到的. 事實上, 裏面那個閉包函數的返回值, 若是不用 全局變量/或 有名函數中 的 變量 去 接受的話, 那麼 它在 執行 完畢後, 閉包函數的 棧內存就被清除了, 你在外面 就再也沒法 跟蹤了.json

所以, 好比 在$.each('iterated', function(){....return false; } ) 遍歷中 , 裏面的 那個閉包 函數的 return false, 只是 可以終止each 對 iterator 的遍歷, 這個 return false, 並不能返回到 each 語句 的外面去, each語句所在的外部 有名函數 實際上 是沒有 返回值的!vim

動態加載的 html標籤部分的html代碼, 看 原始文件的 view page source code源代碼是看不到的.... 後來經過 js 動態 加載進來的 頁面標籤 是看不到的!!! 可是 經過 easyui的 tabs 控件 進行 動態加載的 html內 , 要執行的 js代碼 部分, 不能放在 動態 加載的 href屬性 指向的 文件中, 而是 要 放在 最初的 原文件 中. 由於這些 代碼被合併到 原文件中了, 因而js代碼部分就會到 原文件中 去查找/ 尋找, 一旦 href指向的 源代碼 部分 被 放到 tabs中後, href指向的文件 在 內存中 就不存在了.

=====================================

ajax的幾種方式?

總的來講 , 有兩種:
一是: $('domselect') 的 load 函數
二是: 全局的 $函數: 包括 $.get, $.post , $.ajax 其中 get和post 是 $.ajax({type: 'get' , 'post',....})的 簡寫. 因此 對於 簡單的ajax就用 $.post, 對於複雜的 ,就統一的用 $.ajax
並且 $.ajax中 包含複雜的 ajax事件(ajax事件, 就用 ajax方法內部來寫就哈了, 不要再 去 單獨的 調用ajax事件了)

  • $.ajax的data: 傳遞是是一個json格式的字符串, 而$.post 的data傳遞的是一個 json的對象。

  • 這些ajax事件包括: beforeSend, -》 error/success -》 complete。
    所謂的成功或失敗, 並非你的邏輯業務是否正確或錯誤,而只是指 ajax請求 是否被成功地 傳遞到服務器端
  • 而 complete,是指此次ajax 事件完成, 那麼 它也無論ajax 請求發送、傳遞是否真的成功! 它只管事情結束了。

  • error事件的錯誤信息, 一般輸出到 Firefox的調試控制檯。

  • 使用 jquery的動畫時, 雖然通用的格式是: animal([speed], [easing], function()...) 可是, 若是沒有特殊要求, 就只是 指定 一個 "動畫"持續的 時間 /長短 就能夠了
  • 關於 dom元素對象的 error事件: 主要包括兩種類型的錯誤事件: 一是 $(window) 元素記錄 script腳本的 錯誤, 二是 img的 src屬性 無效時 觸發error事件
    使用 $(window).error(function(){msg, url, line){...}) 能夠記錄 script腳本的錯誤:
    例子:

$(window).error(function(msg, url, line){
  jQuery.post("js_error_log.php", { msg: msg, url: url, line: line });
});
  • 關於jquery的屬性函數,有 兩個:attr 和 prop : 關於他們的區別,參考 https://www.cnblogs.com/linsx/p/6800136.htmlhttps://www.cnblogs.com/zhwl/p/3520162.html
    主要是: prop是用來設置 具備 true/false 值的屬性, 好比 checked, selected, disabled 狀態屬性。 而attr是設置 非 boolean屬性的。 attr的兩種參數: 一是使用 js對象{....}的方式, 一是使用 attr('attrName', attrValue)的方式
    注意的是: checked=「checked」或‘true’,只是決定了 defaultChecked 頁面在第一次載入時的元素的狀態值, 跟後來元素是否被checked的狀態值無關

  • 尋找 包含元素的兩個方法,一個是 find, 一個是children。 他們的區別是: find查找的是 全部的 (祖先/)後代元素,即: descendant, 而children查找的則是 直接的下一級(父子)元素。

==============================

easyui 將alert confirm, progress, show等提示框方法 都整合到了 $.messager...方法中了。格式都是: $.messager.progress('title', 'msg', 'warning', callback_func)... 要注意 , 最後一個參數 是回調函數, 是異步的!

===================

事實上, 在vim中, 進行編輯的時候, 移動光標 基本上 都不是經過 一行一行地進行移動的. 都是經過 各類 " 跳動" 來移動 光標的:

參考: https://blog.csdn.net/yangzhongxuan/article/details/6542808
要充分運用 光標 跳躍的 技巧!

開發過程當中 的一些 補充知識點

  • input text自己獲取的是 "字符串" 類型的值, 因此, 要進行加減等數字 運算時, 要進行類型轉換, 不然獲得的是 字符串的組合, 好比 : 1+1 獲得的是 11, 而不是2
  • 凡是在 html頁面, 所能顯示的 , 都是 html 內容! 所以, 你的思惟 都要按html的思惟來寫, 好比: 在html中的 alert中的 換行 要用 <br>, \n是在 php中的換行. 又好比, 全部的標籤好比script腳本標籤, 自己也不過是一個普通的 html標籤而已.
    所以, 在button按鈕的 onclick事件中 , 爲了考慮在事件函數中 要傳遞字符串 類型的 變量時 , 要在 雙引號中, 包含雙引號, 或包含雙引號時, 不要考慮, 擔憂: 什麼 引號混淆的問題, 也不要像 在 js代碼中, 考慮變量相加的方式, 由於 html原生代碼中, 是不支持 加號的::: html的 原生標籤中 會把字符串 按 原樣: 原樣: 原樣 , 不作任何修改的顯示出來 ,做爲結果. 好比下面的例子就是這樣:
提交按鈕, 參數是字符串類型....就這麼寫
        <input type="button" class="btn btn-primary btn-large" value="提交" onclick="chksub('{:I('get.jspinyin')}');">

反之, 若是這樣寫就會出錯:
        <input type="button" class="btn btn-primary btn-large" value="提交" onclick="chksub(" + {:I('get.jspinyin')} + "');"> 由於這裏的 兩個加號會按字符串原樣顯示, 根本不會做爲js代碼中的 字符串拼接來解釋,  甚至, 即便你在onclick ="javascript: ....."寫上 javascript:  也不行, 由於 它只認你前面的 那個 <input> 標籤, 而不認爲是  <script>標籤
  • 一個經驗就是 在寫 if ...else 的時候, 必定要 最好 是 加上 大括號了, 哪怕 if 後的語句 只有一句, 養成一個習慣, 避免很老火 的 調試排錯!
    好比: 下面的代碼, 原本是要檢查每個/全部的input是否填寫完整, 因爲 最開始的時候, 沒有加if後面的大括號, 寫成: if($.trim($(this).val()=='') flag=false; return false; .... 了, 結果致使: each 方法不管如何 都 只是執行了一次, 就退出了. 事實上, 就只是檢查了 "第一個 " input框 是否爲空了. 後面的都沒有檢查到. 很明顯, 這樣的邏輯不是咱們想要的
function chkAllInputUnempty(pinyin){
  var flag=true;
  var fi='form#'+pinyin+' table tbody input';
  $(fi).each(function(){
    if($.trim($(this).val())== ''){   //  這裏的 大括號是必需要加的!!  若是不加就只檢查了 第一個input框是否爲空
      flag = false;
      return false;
    }
  });
  return flag;
}
  • 要修改easyui的確認消息框中的ok/cancel的顯示文字: $.messager.defaults = {ok: '是', cancel: '否'};

  • confirm確認的單詞是 : con-firm 前面的那個 con-是 n不是m, 不是: com-
  • 因爲 $.messager.confirm(...) 的執行方式是 異步 的, 因此 , 要使用 $.messager.confirm來決定是否關閉tabs的標籤, 是比較麻煩的. 確實要使用異步的方式, 能夠參考: http://www.jeasyui.net/plugins/160.html, 裏面有詳細的例子:
    總的思路是:
  1. 在onBeforeClose: function(){...return false;}內部, 在$.messager.confirm 外面, 使用return false; 首先來阻止 標籤頁事先就關閉了: 在點擊 確認框以前就關閉了.
  2. 具體的關閉動做要在 messager內進行, 核心的一點就是 要 清除/屏蔽 onBeforeClose這個tabs自己的 options, 而後手動地關閉tab標籤頁
  3. 首先要 : 將tabs的options選項獲取, 獲取到默認的tabs.options.onBeforeClose屬性值並保存(好比保存到bc變量中), 而後清除/屏蔽這個onBeforeClose這個屬性(就是用一個空的function(){} 回調函數) 後, 手動地進行關閉該選項卡, 最後再恢復默認的onBeforeClose屬性, 用 bc變量.
onBeforeClose: function(title, index){
      var target = this;
      $.messager.confirm('注意', '真的要關閉: "'+title+'" 標籤頁嗎?<br>若是評分沒有提交,則以前所做的評分將會丟失!', function(r){
        if(r){
          var opts=$(target).tabs('options');
          var bc=opts.onBeforeClose;
          opts.onBeforeClose=function(){};
          $(target).tabs('close', index);
          opts.onBeforeClose = bc;
        }
      });
      return false;
    }
var  para = 'tea=' + tit + '&stud=' + '{$stu}' + '&cls=' + '{$curCls}'+'&py='+py
    if(tt.tabs('exists', tit)){
      tt.tabs('select', tit);
    }else{
      tt.tabs('add',{
        title:tit,
        href:"{:U('pjcontent')}"+"/?"+para,   // 這個是tp在U 方法中 傳遞附加參數 的 最關鍵的一步 寫法. 在原來的地址(.../foo.html)後面, 是沒有 斜槓的! 因此 要拼接字符串: '/?', 而後加上參數字符串用 & 鏈接的
        closable:true,
  • 一般 不要在 目的是爲了獲取 數據 的 函數內, 好比 有 get, getScore之類的 函數中, 去使用 $.messager.alert ! 由於 easyui的messager 不是獨佔的, 不會阻塞後面的函數的執行, 這樣的話, 若是調用這個函數後, 後面還有其餘提示框的話, 會形成同時有多個提示框出現的狀況. 因此要避免在一個函數內同時出現多個 messager的狀況!

============================

要更改 dialog彈出的初始位置, 能夠經過 dialog的屬性: top,和 left去設定, 可是隻能設置 絕對數值, 不能設置百分比?

  • href的參數傳遞, 因爲 是ajax方式傳遞, 因此 在 前臺頁面的 子頁面 是沒法經過js來得到傳參的. 只能在 後臺 的服務器頁面上 獲取傳參
  • dialog的屬性:  closable: false,        // 是否顯示關閉按鈕
  • 關於dialog的 內容, 是一個重點, 並非必需要有 content/href屬性的,
  • 有幾種方式: 你能夠直接在div id=dialog中指定內容, 固然能夠指定 content/href屬性, 這時若是用 iframe標籤的話, 就必須指定src而不能在 iframe中直接寫內容;
    若是要動態的 在原來 爲空的div中, 生成dialog的內容: 1. 是用content屬性, 它是支持 函數調用的(只要在 函數中 返回dialog的內容值就好; 2. 是在生成/彈出dialog以前, 經過函數調用"填充"div中的內容, 好比用 jquery的html()函數/ append()函數等 .
if(subBtnClkTimes==0){       /* 若是是第一次提交,則採用  "add方法進行插入記錄" */
     // getScore();    // 能夠經過這個函數, 來填充div的內容
    $('#dd').dialog({
      title: '保存評分',
      width: 430,
      height:320,
      //left: 230,
      //top: 500,
      closable: false,        // 是否顯示關閉按鈕
      cache: false,
      content: getScore(jspinyin, curPjTeacher),   // 或者經過這個 函數調返回值 來填充 dialog的內容
      modal: true,
      buttons:[{
    text: "提 交",
    iconCls: 'icon-ok',
    handler: function(){
      $('#dd').dialog('close');
    }
      }, {
    text: '取 消',
    iconCls: 'icon-cancel',
    handler: function(){
      $('#dd').dialog('close');
    }
      }]
    });

easyui 的 dialog的構造過程和 結果?

實際上, 在 彈出 dialog的時候, 是 在 body的最後面(包括 最後面的 js代碼以後), 插入了 一個div.panel.window , 這個div包括幾個部分, 其中包括一個: div.panel-header.panel-header-noborder.window-header, 這個是標題, 還有一個是dialog的主體內容部分, 就是 div.panel-body.panel-body-noborder.window-body, 可能還包括一個div.dialog-button按鈕部分.

=============================

在 vim中, 要對 \n 進行替換爲 <br>, 使用 : :s/\\n/<br>/g 也就是: vim的替換 , 要用 反斜槓 轉義 , 而 標籤 則不須要轉義

  • js的數組, 最好 是用 中括號的方式定義; 並且 js自己是弱類型語言, 它是根據 "字面量" 來肯定對應的數據類型的, 因此 數組中的元素 能夠是不一樣類型的
  • js的元素增刪操做: jsarr.push(...), jsarr.unshift(...), jsarr.split(index, howmany, item1, item2,,,,), jsarr.slice(...), string.split等.

  • 在javascript中, 若是 要對相同的 引號進行嵌套, 好比在 單引號中 嵌套 單引號, 在雙引號中 嵌套 雙引號, 這時, 要用 反斜槓進行 轉義, 可是 一樣的 需求 , 在html中 是不須要進行轉義的, 能夠直接進行書寫!

=================================

$.ajax的回調函數?

  • 有beforeSend, error, dataFilter, success, complete五種回調函數, 大多數會傳入一個 xhr('喜歡熱')的對象 , 以及一些返回的數據 ret, 或成功/錯誤代碼/字符串.
  • 好比: success: 的回調函數 就只是 傳給你: 兩個參數: ret(服務器返回的結果字符串), 和 表示成功的 代碼字符串: statusText: 一般是 " success".
  • 注意 : status 和 statusCode 和 statusText不同: status是表示狀態的 數字, 好比: 200, 404, 500等, statusCode是代碼好比: ajax/v.., statusText纔是 表示成功或失敗的字符串文本,好比: success, 好比: "Not Found" 好比: "Server internal error" 等.

  • 而 error等傳入的參數就包括: xhr , 由於要進行更加深刻的錯誤調試!

  • dataType表示返回的數據類型, 主要有: html, script , text ,json:
    其中: html和script中的js會首先在服務器端執行, 完了以後,做爲文本返回. text返回的也是一個文本字符串
    json 的話, 服務器端確實 是返回的 json格式的字符串, 可是 在success等回調函數的 js函數中, 根據 jquery的文檔說明可知: ajax這個方法, 在給success的回調函數參數以前,, 已經把返回的json格式字符串 事先用 js語言的 JSON對象的方法: JSON.parse('json格式的字符串') 來解析, 已經 生成了 js對象, 而後 才 返回給 /傳遞 給 success的回調函數做參數了. 因此 在回調函數 中 就能夠 直接做爲 js對象處理了, 直接做爲js對象 來 使用了, 好比:

  • 判斷 js的數據類型: 有 7種 : number, string, boolean, null, object , undefined, function 用 typeof 這個 "一元運算符" 來查詢: typeof不是函數, 因此能夠 不加括號, 由於是一元的, 因此將它寫在 變量的前面.

$.ajax({
  type: 'post',
  url: "{:U('url')}",
  dataType: 'json',         // 返回json格式的字符串, 即在服務器端頁面 要 拼接成 標準格式的json格式字符串.
  data:{'jsname':jss, 'foo": bar},
  success: function(ret, statusText){
    console.log("ret的類型:" + typeof ret);    // 查看json格式的返回 給回調函數的結果  的數據類型
    console.log(ret.name+ ':' + ret.age );    // 按js對象 來進行 元素成員的調用
    console.log(statusText);
  },
  error: function(xhr){
    console.log(xhr);
    }
});


在 ajax的js返回值是:

ret的類型:  object   (/// 很清楚的說了,  是 一個js對象了) 
jack:20   //  按js對象的 方式 來 使用了
success
typeof   {"a": 11, "b" : "22"}
"object"
typeof   '{"a": 11, "b" : "22"}'    // json格式的字符串.
"string"
  • 重要的是: $.ajax的url 控制器方法, 必須是 public的, 由於要在 $.ajax中調用, 這個很明顯, 是在 控制器類的外部進行訪問( 要知道, 要找獲得) , 若是是 protected, 則由於找不到, 而執行error的回調函數.

==========================

相關文章
相關標籤/搜索