你可能会用到的前端"奇技赢巧"

分针网每日分享:

1.关于iPhone最下面会弹出奇怪框框的问题

就是这个玩意,期初以为是苹果自己做一些其它操作用的,后来才发现是操作键盘的,也就是唤起键盘,这个东东就会出来,检查了下页面,有input框虽然设置了readonly,但是在苹果中点击的时候键盘是没出来,但是这个东东会出来,采用了一个粗暴的方式,直接设置disable,然后我们再去改变input框的背景色即可。

2.数组深拷贝的问题

大家都知道数据是引用类型的,所以我们在使用之前通常会对它进行一次拷贝,不管是使用最笨的方式循环创建一个新数组,还是用slice方法,都可以解决基本问题。终于在一个项目中,数据是数组套对象套数组,然后怎么都拷贝不好使,搜了各种方式终于发现一个好方法:

[].concat(JSON.parse(JSON.stringify(dataList)));

这里先把数组对象转成一个JSON字符串并返回,此时它已经不是引用类型了,当再次解析成JavaScript对象并返回一个新的对象的时候我们已经对原数据进行了拷贝。

这里简单复习下JSON.stringify()这个方法,他有三个参数。

第一个就是你要转换的值,可以是任意,但是注意几点:

1.非数组类型的对象转化后不能保证按照原顺序输出。

2.对于undefined,函数,symbol的值在序列化中会被忽略(费数组对象的数据),或者转成null。

3.不可枚举属性会被忽略

第二个参数replacer可以是一个函数也可以是一个数组

如果是一个数组,这只有数组中包含的属性名才会被序列化出来(起到一个过滤的作用)

如果是函数,我们可以在序列化过程中对每一个属性进行操作并返回(仿佛数组的map方法)。

第三个参数用于指定缩进用的空白字符串,如果是数字则表示几个空格,最大为10,如果是字符串,则取前十个字母代替空格。

3.使用addEventListener绑定touch相关事件

由于使用的内部框架,最近在调试移动短的时候发现,没法拖动滚动条了,每次只能拖一点点,很费劲,浏览器报一堆警告,一开始也没时间研究,就凑合着做完在手机上调试下,倒也还好,不过问题还是要解决的,查了一些资料才发现是因为我们框架中做了一个操作,给document绑定了一个touch事件,阻止默认事件。

document.addEventListener(‘touch‘, function(e){

e.preventDefault();

}, false)

这看起来也没啥毛病,但是chrome在54版本之后加了个限制,就是绑定touch事件默认你不会使用preventDefault。所以解决起来就简单了,我们手动打开就可以了。那么现在介绍下addEventListener,大家重用的就三个个参数,事件类型,listener和是否事件冒泡,

target.addEventListener(type, listener[ ,useCapture])

但其实它第三个参数还可以是一个对象,有三个属性:

target.addEventListener(type, listener[, option ])

option{

capture:Boolean,//是否在捕获阶段传到改EventTarget执行

once:Boolean,//表示只调用一次

passive:Boolean//是否调用preventDefault,本来默认是FALSE,但是chrome54之后绑定touch事件会自动变为TRUE。

}

4.移动端可拖拽控件注意事项

在移动端去做拖拽其实原理上跟pc端是一样的,但是具体实施就有差别了。

触点位置的确定:

在pc端一般使用event.clientX/Y来获取鼠标位置,但是在移动端我们绑定touch事件,并没有这个属性,其实它被封在一个targetTouches属性中,所以我们要多做一步

obj.addEventListener(‘touchstart‘, function(e){

var touch = e.targetTouches[0];

//触点坐标

touch.pageX/Y

})

拖动距离

一般直接上来的话大家都是直接鼠标挪动到哪儿就把控件的位置定到哪儿。但是要注意,给控件动态设置位置的时候,是设置左上角的位置,但是触点却可能在控件的任意位置,所以在给控件动态设置位置的时候要把触点和元素原本位置的差值减掉,如下:

var offsetX = 0;

obj.addEventListener(‘touchstart‘, function(e){

var touch = e.targetTouches[0];

//记录触点和控件位置的差值

offsetX = touch.pageX-obj.offsetLeft;

})

obj.addEventListener(‘touchmove‘, function(e){

var touch = e.targetTouches[0]

obj.style.left = touch.pageX-offsetX+‘px‘;

})

控件拖动范围的控制

控件不管怎么拖动,都要保证它是在可视区,所以在上下左右四边去拖动的时候是不能拖出去的。

当控件有点击事件

该控件可拖动还可以点击触发事件,这个时候就要区分到底是拖动还是点击,我们这里处理是已300ms为区分,以及手指移动的距离不小于某一值。首先在时间上控制,长时间不放开则不会触发点击事件,然后再次基础上还要方式用户快速拖动,当然这也防止了一种特殊的拖动情况,在边界处控件并没有移动,但是手指移动了。

原生事件的阻止

这里主要是指长时间按在控件上,会触发复制和粘贴事件,所以我们这里要阻止这个事件,方法也很简单,css即可控制

-webkit-touch-callout:none; /*系统默认菜单被禁用*/

-webkit-user-select:none; /*webkit浏览器*/

-khtml-user-select:none; /*早期浏览器*/

-moz-user-select:none;/*火狐*/

-ms-user-select:none; /*IE10*/

user-select:none;

本文转自:http://www.f-z.cn/id/271

时间: 2024-10-25 22:56:28

你可能会用到的前端"奇技赢巧"的相关文章

Eova DIY Formatter 奇技赢巧

将单元格内容格式化为URL: formatter: function(value, row, index, field) { return '<a target="_blank" href="http://g.cn" style="color:blue">' + value + '</a>' } 行尾单元格添加各种操作: formatter: function(value, row, index, field) {    

GoogleCpp风格指南 4)Google奇技

4 来自Google的奇技 Google-Specific Magic Google用了很多自己的实现技巧/工具使 C++代码更加健壮, 我们使用C++的方式可能和你在其他地方见到的有所不同; [Removed] 4.1 智能指针 Tip 如果确实需要使用智能指针的话, scoped_ptr完全可以胜任; 你应该只在非常特定的情况下使用 std::tr1::shared_ptr, 例如STL容器中的对象; 任何情况下都不要使用 auto_ptr; "智能"指针看上去是指针, 其实是附加

你不知道的 docker 命令的奇淫怪巧

你不知道的 docker 命令的奇淫怪巧 Intro 介绍并收录一些可能会用到的一些简单实用却很少有人用的 docker 命令 dangling images build 自己的 docker 镜像的时候,有时会遇到用一个甚至多个中间层镜像,这会一定程度上减少最终打包出来 docker 镜像的大小,但是会产生一些tag 为 none 的无用镜像,也称为悬挂镜像 (dangling images) 列出所有的 dangling images: docker images -f "dangling=

你可能不知道的 docker 命令的奇淫怪巧

原文:你可能不知道的 docker 命令的奇淫怪巧 你可能不知道的 docker 命令的奇淫怪巧 Intro 介绍并收录一些可能会用到的一些简单实用却很少有人用的 docker 命令 dangling images build 自己的 docker 镜像的时候,有时会遇到用一个甚至多个中间层镜像,这会一定程度上减少最终打包出来 docker 镜像的大小,但是会产生一些tag 为 none 的无用镜像,也称为悬挂镜像 (dangling images) 列出所有的 dangling images:

[奇淫怪巧] 利用正则表达式判断素数

最近在学习正则表达式,偶然间看到利用正则表达式判断一个数是不是素数的帖子.当时就震惊了,觉得好神奇.那个判断素数的函数是这样子的: public static bool IsPrime(int i) { return !Regex.IsMatch(new String('*', i), "^.?$|^(..+?)\\1+$"); } 有没有觉得很神奇?我当时就觉得相当的有想象力的一种实现.那让我们看一下这个正则表达式是如何做判断素数的. 第一步,创建了一个长度为i,并以'*'填充的字符

奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit 转

奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit 在Delphi中使用PrintDialog打印对话框的时候,这个控件有三个选项,就是PrintRang那个属性的三个选项,其中有一个选项三,让我们自定义选择页码范围来打印.但是比较蛋疼的是,这个地方选中了之后啥子效果都没有.无法制定自己的页码范围,很是蛋疼.这里实际上应该要有一个Edit之类的编辑框的,这样可以让用户输入1,2,3-4之类的页码范围来整就比较人性化了.起初以为是自己没有指定某属性神马的导致,于是在

倍数提高工作效率的 Android Studio 奇技

来源:JeremyHe 链接:http://zlv.me/posts/2015/07/13/14_android-studio-tips/ 这是从Philippe Breault的系列文章<Android Studio Tips Of the Day>中提取出来的自认为精华的部分.这些技巧在实际应用中能够非常大的提高工作效率. 关于快捷键 The File Structure Popup ctrl+f12 此快捷键可以调出当前文件的大纲,并通过模糊匹配快速跳转至指定的方法.勾选上“show a

JACASCRIPT--的奇技技巧的44招

JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是很多新手踏入编程世界的第一个语言.既可以用来显示浏览器中的简单提示框,也可以通过nodebot或nodruino来控制机器人.能够编写结构清晰.性能高效的JavaScript代码的开发人员,现如今已成了招聘市场最受追捧的人 1.首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会

Git的奇技

Git是一个“分布式版本管理工具”,简单的理解版本管理工具:大家在写东西的时候都用过“回撤”这个功能,但是回撤只能回撤几步,假如想要找回我三天之前的修改,光用“回撤”是找不回来的.而“版本管理工具”能记录每次的修改,只要提交到版本仓库,你就可以找到之前任何时刻的状态(文本状态). 下面的内容就是列举了常用的git命令和一些小技巧,可以通过"页面内查找"的方式进行快速查询:Ctrl/Command+f. 开卷必读 如果之前未使用过Git,可以学习廖老师的免费Git教程入门 一定要先测试命