开发过程中 的一些 补充知识点 + 关于mysql中的日期和时间函数?
参考: https://www.jb51.net/article/23966.htm
https://yq.aliyun.com/articles/260389
-
mysql中的 日期格式是: HHHH-MM-DD , 时间格式 是 HH:MM:SS[.fraction]
-
而 datetime和 timestamp数据类型的 格式 是 date+time, 即 两者的格式都是 : 'HHHH-MM-DD HH:MM:SS'
-
注意两类函数的区别: 一种是 返回当前日期或时间的函数; 一类是 提取 extract /截取 / 抽取 给定日期时间 变量中的 date 或 time.
比如: 获取当前 日期和时间的函数: now(), curdate(), curtime(),
而提取当前时间中的 部分值: date(now()).... -
关于current_timestamp , 它既是一个函数, 也是一个 "mysql的内置的 常量"!
所以select current_timestamp()
返回当前的时间戳,
而 同样的select current_timestamp
同样会 返回跟上面一样的结果 -
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.html
和https://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
, 里面有详细的例子:
总的思路是:
- 在onBeforeClose: function(){...return false;}内部, 在$.messager.confirm 外面, 使用return false; 首先来阻止 标签页事先就关闭了: 在点击 确认框之前就关闭了.
- 具体的关闭动作要在 messager内进行, 核心的一点就是 要 清除/屏蔽 onBeforeClose这个tabs本身的 options, 然后手动地关闭tab标签页
- 首先要 : 将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的回调函数.
==========================