开发过程中 的一些 补充知识点 + 关于mysql中的日期和时间函数?

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

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

  2. 而 datetime和 timestamp数据类型的 格式 是 date+time, 即 两者的格式都是 : 'HHHH-MM-DD HH:MM:SS'

  3. 注意两类函数的区别: 一种是 返回当前日期或时间的函数; 一类是 提取 extract /截取 / 抽取 给定日期时间 变量中的 date 或 time.
    比如: 获取当前 日期和时间的函数: now(), curdate(), curtime(),
    而提取当前时间中的 部分值: date(now())....

  4. 关于current_timestamp , 它既是一个函数, 也是一个 "mysql的内置的 常量"!
    所以 select current_timestamp() 返回当前的时间戳,
    而 同样的 select current_timestamp 同样会 返回跟上面一样的结果

  5. now([decision]) 有一个可选的 小数的精度位数, 最大是6

6, 关于 datetime 和 timestamp数据类型的比较 参考: https://yq.aliyun.com/articles/260389

  • 两者的 显示 格式 是一样的! 都是 : '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的 版本影响比较多, 要注意!

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

为什么 $(function(){ }); 内部定义的 函数, 在外部会找不到呢?

  • 这个是关于闭包 的一个知识点: 所谓闭包, 是指在 可以访问 一个函数作用域内的变量的 另一个函数! 闭包通常的用法是: 在一个 函数的内部 再次定义的函数!
  • 所以 在 $(function(){...}); 中, $ 里面的 function()本是就是一个 匿名函数了, 然后 你 又在这个匿名 函数 内, 再去定义 一个 有名函数. 那么这个 有名函数 就是 "函数中的函数"了, 就是一个 闭包函数了. 这个闭包函数 只是 在 $(function(){....// 在 这个里面的 作用域, 其他变量和函数 是可见 这个 "闭包的有名函数的...}); 除此之外, 在 $ 的 匿名函数的外面 , 是 看不到 里面的 你定义的 "有名函数"的.
  • 所以 会 报错: chksub没有定义!
  • 因此 , 要清楚 一个 误解: 使用jquery后, 并不是 什么 东西, 代码, 函数 , 都要放在 $(function(){.....}); 内部! 你要定义 可以被 外部的 html标签 所看得到的 函数, 就不能 放在 $(function(){...}); 的匿名函数内. 应该直接 在 script标签 内定义 有名函数.
  • $(function(){...}).. 只是一个 语句, 只是 在 要求执行某些 语句的时候, 要求在所有 dom元素都 加载后 再执行的时候, 使用. 总之, 如果是 单独的 语句, 是可以放在 $(function(){...}).. 里面的, 而如果是 函数 , 则一定 不能!

所有的 匿名函数(闭包) 中的 返回值 在外部其实是得不到的, 是 异步的, 也就是 在 匿名函数 执行完毕时, 其栈就 没有了, 因此, 只有 用 外部的 全局变量 进入到 异步函数 内, 去接收 内部闭包函数的 处理结果.

这个闭包匿名函数 返回值 的问题, 已经 在多个地方 遇到过了: 闭包 = 匿名函数, 就相当于 一个盒子中的盒子, 我们在外面 (有名函数 定义的外面 ), 是可以看得到 外面的那个盒子的, 但是我们看不到 里面的 那个盒子. 因此, 里面的 那个盒子(匿名函数) 的返回值 , 我们在外面是得不到的. 事实上, 里面那个闭包函数的返回值, 如果不用 全局变量/或 有名函数中 的 变量 去 接受的话, 那么 它在 执行 完毕后, 闭包函数的 栈内存就被清除了, 你在外面 就再也无法 跟踪了.

因此, 比如 在 $.each('iterated', function(){....return false; } ) 遍历中 , 里面的 那个闭包 函数的 return false, 只是 能够终止each 对 iterator 的遍历, 这个 return false, 并不能返回到 each 语句 的外面去, each语句所在的外部 有名函数 实际上 是没有 返回值的!

动态加载的 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的回调函数.

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

posted @ 2019-04-24 22:05  noitanym  阅读(584)  评论(0编辑  收藏  举报