下载jquery.ui.touch-punch.min.js
即可,无需做任何修改直接调用
https://github.com/furf/jquery-ui-touch-punch
在php中尽量使用单引号,直接作为字符串使用,不进行解析,节约服务器资源
在html中尽量使用双引号且在js中尽量使用单引号,否则容易与html混淆
在jQuery1.6之前的版本我们会这样写我们的代码:
<input type="checkbox" id="chk" />
<script>
// 获取是否选中
var isChecked = $('#chk').attr('checked');
// 设置选中
$('#chk').attr('checked', true);
</script>
这样写在jQuery1.6之前完全没问题,可是当我们升级到更高的版本时问题就来了。此时我们会发现返回的是checked或者是undefined,不是原来的true和false,并且checked属性在页面初始化的时候已经初始化好了,不会随着状态的改变而改变。所以如果checkbox一开始是选中的,那么返回的是checked,如果一开始没被选中,则返回的是undefined。
解决方法如下:
<input type="checkbox" id="chk" />
<script>
// 获取是否选中
var isChecked = $('#chk').prop('checked');
// 或
var isChecked = $('#chk').is(':checked');
// 设置选中
$('#chk').prop('checked', true);
</script>
分析了其中的原因,可以这样理解:
它将“属性”与“特性”做了区别,属性指的是name、id等等,特性指的是selectedIndex、tagName、nodeName等等。jQuery1.6之后可以通过attr方法去获得属性,通过prop方法去获得特性。
$('#chk').attr('tagName'); // undefined
$('#chk').prop('tagName'); // INPUT
[]是数组,一般定义如下:
$arr = ['a', 'b'];
// 等同于
$arr = new Array();
$arr.push('a');
$arr.push('b');
{}是对象,一般定义如下:
$obj = {'name': 'way', 'sex': 'male'};
JS的数组并不支持非数字下标,举个例子:
var $arr = new Array();
$arr['a'] = 'aa';
alert($arr.length); // 输出0
alert($arr['a']); // 输出aa
实际上JS数组只支持数字索引,非数字索引指的是对象的属性,如果要遍历的话用如下方法:
for(var prop in $arr){
if($arr.hasOwnProperty(prop)){
//...
}
}
用javascript尝试打开mailto链接,发现没有激活邮件应用
window.open('mailto:xxx');
网上查了下,老外也碰到了相同的问题,貌似是个bug?解决方案就是还是老实使用标签。
另外同时看到说mailto:?方案也是部分浏览器不支持的,解决方案是写个虚拟的地址…比如mailto:virtual_address
(极端的例子:mailto:a@b.c
)
使用prop替代attr
onchange、 onkeydown、onkeypress、onkeyup 键盘事件监听不了右键的复制、剪贴和粘贴这些操作,处理组合快捷键也很麻烦。较完美的解决方案:结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化。
oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有用,在内容修改后立即被触发,不像 onchange 事件需要失去焦点才触发。oninput 事件在主流浏览器的兼容情况如下:
从上面列表可以看出,oninput 事件在 IE9 以下版本不支持,需要使用 IE 特有的 onpropertychange 事件替代,这个事件在用户界面改变或者使用脚本直接修改内容两种情况下都会触发,有以下几种情况:
1.修改了 input:checkbox 或者 input:radio 元素的选择中状态,checked 属性发生变化;
2.修改了 input:text 或者 textarea 元素的值,value 属性发生变化;
3.修改了 select 元素的选中项,selectedIndex 属性发生变化。
在监听到 onpropertychange 事件后,可以使用 event 的 propertyName 属性来获取发生变化的属性名称。
集合 oninput & onpropertychange 监听输入框内容变化的示例代码如下:
<head>
<script type="text/javascript">
// Firefox, Google Chrome, Opera, Safari, Internet Explorer from version 9
function OnInput (event) {
alert ("The new content: " + event.target.value);
}
// Internet Explorer
function OnPropChanged (event) {
if (event.propertyName.toLowerCase () == "value") {
alert ("The new content: " + event.srcElement.value);
}
}
</script>
</head>
<body>
Please modify the contents of the text field.
<input type="text" oninput="OnInput (event)" onpropertychange="OnPropChanged (event)" value="Text field" />
</body>
使用 jQuery 库的话,只需要同时绑定 oninput 和 onpropertychange 两个事件就可以了,示例代码如下:
$('textarea').bind('input propertychange', function() {
$('.msg').html($(this).val().length + ' characters');
});
这种格式在Safari和IOS中无法正常运行,值为NaN
var $date = new Date("2016-06-01 08:00");
需要格式改为
var $date = new Date("2016/06/01 08:00");
可以用以下正则替换
$date.replace(/\-/g, '/');
尝试了好几种方式,都不是很完美,最后使用了以下方案,但仍有可能造成输入框弹起时即刻执行修补,导致输入框覆盖了被输入对象的情况,不过基本都解决了,蛮好的。
document.body.addEventListener('focusout', () => {
//软键盘收起的事件处理
let ua = window.navigator.userAgent;
let app = window.navigator.appVersion;
//console.log('浏览器版本: ' + app + '\n' + '用户代理: ' + ua);
if (!!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)) {
console.log('ios端');
var currentPosition, timer;
var speed = 1;
//为了防止快速input切换导致闪屏,间隔100毫秒执行
timer = setInterval(function () {
currentPosition = document.documentElement.scrollTop || document.body.scrollTop;
currentPosition -= speed;
window.scrollTo(0, currentPosition); //页面向上滚动
currentPosition += speed;
window.scrollTo(0, currentPosition); //页面向下滚动
clearInterval(timer);
}, 100);
} else if (ua.indexOf('Android') > -1 || ua.indexOf('Adr') > -1) {
//console.log('android端');
}
});