前端经常运用代码片断(一) 点这里
前端经常运用代码片断(二) 点这里
前端经常运用代码片断(三) 点这里
前端经常运用代码片断(四) 点这里
1.tap事宜点透题目?
题目点击穿透题目:点击蒙层(mask)上的封闭按钮,蒙层消逝后发明触发了按钮下面元素的click事宜
zepto的tap事宜是绑定到document的,所以平常点击tap事宜都邑冒泡到document才会触发。当点击隐蔽蒙层的时刻默许也会手指触发到蒙层下面的元素 实行事宜
1. github上有个fastclick插件,用来躲避click事宜的延时实行
2. 用touchend替代tap事宜并阻挠掉touchend的默许行动preventDefault()
//tap事宜涌现点透题目
$("#id").on("tap", function (event) {
//许多处置惩罚比方隐蔽什么的
event.preventDefault();
});
//touchend事宜处理颔首题目
$("#id").on("touchend", function (event) {
//许多处置惩罚比方隐蔽什么的
event.preventDefault();
});
3:给tap事宜内里的隐蔽蒙层要领实行的要领300毫秒耽误
$("#id").on('tap',function(ev){
setTimeout(function(){
$("#id").hide();
},320)
})
2.牢固定位规划 键盘盖住输入框内容?
1.经由过程绑定窗口转变事宜,监听键盘的弹出。
然后去转变牢固定位元素的位置。默许键盘的宽度应该是页面的2分之一。所以我们位移的间隔改成键盘的二分之一就能够
window.onresize = function(){
//$(".mian")就是牢固定位的元素
if($(".mian").css('top').replace('px','') != 0){
$(".mian").css('top',0);
}else{
var winHeight = $(window).height();
$(".mian").css('top',-(winHeight/4));
}
}
2.经由过程定时器及时监听是不是触发input。
假如触发input框 就把牢固定位,转变成静态定位。如许就会浏览器会总动把内容顶上去。
function fixedWatch(el) {
//activeElement 猎取核心元素
if(document.activeElement.nodeName == 'INPUT') {
el.css('position', 'static');
} else {
el.css('position', 'fixed');
}
}
setInterval(function() {
fixedWatch($('.mian'));
}, 500);
3.去掉字符摆布空格
export const trimLeOrRi=(str)=>{
//删除摆布两头的空格
return str.replace(/(^\s*)|(\s*$)/g, "");
}
4.经由过程JS推断一个数组
4.1 instanceof要领
instanceof 运算符是用来测试一个对象是不是在其原型链原型组织函数的属性
var arr = [];
arr instanceof Array; // true
4.2.constructor要领
constructor属性返回对建立此对象的数组函数的援用,就是返回对象相对应的组织函数
var arr = [];
arr.constructor == Array; //true
4.3.toString.call
这类写法,是 jQuery 正在运用的
Object.prototype.toString.call(obj).slice(8,-1) == Array
4.4.ES5新增要领isArray()
var a = new Array(123);
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false
字符串也是有length属性的
我们晓得一切的Array都是有length属性的,就算是空数组,那末length 为0,那末字符串有无呢?接下来我们来考证一下。
var str="sdfsd5565s6dfsd65sd6+d5fd5";
console.log(str.length) // 26
结果是有的,所以我们在推断范例时,不能纯真拿有无length属性来推断是不是是数组了,我们能够用下面的要领来推断是不是是数组:
var obj=[1,2] ;
console.log(toString.call(obj) === '[object Array]');
5. 删除数组尾部元素
一个简朴的用来清空或则删除数组尾部元素的简朴要领就是转变数组的length属性值。
const arr = [11, 22, 33, 44, 55, 66];
// truncanting
arr.length = 3;
console.log(arr); //=> [11, 22, 33]
// clearing
arr.length = 0;
console.log(arr); //=> []
console.log(arr[2]); //=> undefined
6.运用对象解构来处置惩罚数组
能够运用对象解构的语法来猎取数组的元素:
const csvFileLine = '1997,John Doe,US,john@doe.com,New York';
const { 2: country, 4: state } = csvFileLine.split(',');
7.在switch语句顶用局限值
能够运用下面的技能来写满足局限值的switch语句:
//不引荐运用,只开阔眼界
function getWaterState(tempInCelsius) {
let state;
switch (true) {
case (tempInCelsius <= 0):
state = 'Solid';
break;
case (tempInCelsius > 0 && tempInCelsius < 100):
state = 'Liquid';
break;
default:
state = 'Gas';
}
return state;
}
//引荐
function getWaterState2(tempInCelsius) {
if (tempInCelsius <= 0) {
return 'Solid';
}
if (tempInCelsius < 100) {
return 'Liquid';
}
return 'Gas';
}
8.平铺多维数组
要领1:es6
运用Spread操纵,能够很轻易去平铺嵌套多维数组:
const arr = [11, [22, 33], [44, 55], 66];
const flatArr = [].concat(...arr); //=> [11, 22, 33, 44, 55, 66]
惋惜,上面的要领仅仅适用于二维数组。不过,经由过程递归,我们能够平铺恣意维度的嵌套数组。
unction flattenArray(arr) {
const flattened = [].concat(...arr);
return flattened.some(item => Array.isArray(item)) ?
flattenArray(flattened) : flattened;
}
const arr = [11, [22, 33], [44, [55, 66, [77, [88]], 99]]];
const flatArr = flattenArray(arr);
//=> [11, 22, 33, 44, 55, 66, 77, 88, 99]
要领2:递归
function flatten(arr){
var res = [];
for(var i=0;i<arr.length;i++){
if(Array.isArray(arr[i])){
res = res.concat(flatten(arr[i]));
}else{
res.push(arr[i]);
}
}
return res;
}
要领3:reduce
function flatten(arr){
return arr.reduce(function(prev,item){
return prev.concat(Array.isArray(item)?flatten(item):item);
},[]);
}
本节参考文章:5分钟掌握JavaScript小技能
9.假如数组列表太大,以下递归代码将致使客栈溢出。你怎样处理这个题目,依然保存递归形式?
var list = readHugeList();
var nextListItem = function() {
var item = list.pop();
if (item) {
// process the list item...
nextListItem();
}
};
经由过程修正nextListItem函数能够防止潜伏的客栈溢出,以下所示:
var list = readHugeList();
var nextListItem = function() {
var item = list.pop();
if (item) {
// process the list item...
setTimeout( nextListItem, 0);
}
};
客栈溢出被消弭,由于事宜轮回处置惩罚递归,而不是挪用客栈。当nextListItem运转时,假如item不为null,则将超时函数(nextListItem)推送到事宜队列,而且函数退出,从而使挪用客栈清零。当事宜队列运转超时事宜时,将处置惩罚下一个项目,并设置一个计时器以再次挪用nextListItem。因此,该要领从头至尾不经由直接递归挪用即可处置惩罚,因此挪用客栈坚持清楚,不管迭代次数怎样。
10.10!
function f(n){
return (n > 1) ? n * f(n-1) : n
}
11.挪动端底部input被弹出的键盘遮挡
Element.scrollIntoView():要领让当前的元素转动到浏览器窗口的可视地区内。
document.querySelector('#inputId').scrollIntoView();
//只要在input的点击事宜,或许猎取核心的事宜中,到场这个api就好了
这个api还能够设置对齐要领,挑选将input放在屏幕的上方/下方,相似的api另有: Element.scrollIntoViewIfNeeded(),这两个是处理同一个题目的,挑选一个用就能够了。
window.addEventListener('resize', function() {
if(
document.activeElement.tagName === 'INPUT' ||
document.activeElement.tagName === 'TEXTAREA'
) {
window.setTimeout(function() {
if('scrollIntoView' in document.activeElement) {
document.activeElement.scrollIntoView();
} else {
document.activeElement.scrollIntoViewIfNeeded();
}
}, 0);
}
});
本节参考文章:关于input的一些题目处理要领分享及批评
12.掌握input显/隐暗码
这个就很简朴了,只需变动input的type属性值就能够了。能够看一下codepen的demo
//点击函数,猎取dom,推断变动属性。
show(){
let input=document.getElementById("inputId");
if(input.type=="password"){
input.type='text';
}else{
input.type='password';
}
}
本节参考文章:关于input的一些题目处理要领分享
13.input多行输入显现换行
在运用textarea标签输入多行文本的时刻,假如没有对多行文本显现处置惩罚,会致使没有换行的状况,假如用户须要换行…
处理要领:
只要在显现内容的处所将该属性设置为 white-space: pre-line
或许 white-space:pre-wrap
,多行文本就能够换行了。
备注:white-space 属性用于设置怎样处置惩罚元素内的空缺,个中包含空缺符和换行符。
14.输入框首尾消灭空格-trim()
输入框消灭首尾空格是input较为罕见的需求,通常在上传的时刻将首尾空格去撤除。
原生消灭要领:
//原生要领猎取值,消灭首尾空格返回一个新的字符串
var str2 = document.getElementById("inputId").trim();
Vue消灭要领:
<input v-model.trim="msg">
15.在input中监听键盘事宜
在用户登录或许搜刮框的时刻,平常都邑监听键盘事宜绑定回车按键,来实行登录/搜刮 等操纵。
原生绑定:
<input onkeydown="keydownMsg(event)" type="text" />
function keydownMsg(key) {
keyCode = key.keyCode; //猎取按键代码
if (keyCode == 13) { //推断按下的是不是为回车键
// 在input上监听到回车 do something
}
}
Vue按键修饰符
Vue为监听键盘事宜,供应了按键修饰符,而且为经常运用的按键供应了别号,运用要领以下:当回车按键在input中被按下的时刻,会触发内里的函数。
<input @keyup.enter="enterActive">
16.元素转动到浏览器窗口的可视地区
Element.scrollIntoView()
要领让当前的元素转动到浏览器窗口的可视地区内。
Element.scrollIntoViewIfNeeded()
要领也是用来将不在浏览器窗口的可见地区内的元素转动到浏览器窗口的可见地区。但假如该元素已经在浏览器窗口的可见地区内,则不会发作转动。
因此再有什么回到顶部、去到置顶位置和键盘弹出盖住输入框之类的需求,都能够简朴处理了。
scrollIntoView
scrollIntoView
只接收一个参数,但接收两种范例的参数,分别是Boolean型参数和Object型参数。
先说Boolean型参数,参数能够使true和false。假如为true,元素的顶端将和其地点转动区的可视地区的顶端对齐。若为false,元素的底端将和其地点转动区的可视地区的底端对齐。
<body> <div class="chunk"></div> <div class="btn-top">up</div> <div class="btn-bottom">down</div> <script> const up = document.querySelector('.btn-top'); const down = document.querySelector('.btn-bottom'); const test = document.querySelector('.chunk'); up.addEventListener('click', function() { test.scrollIntoView(true); }); down.addEventListener('click', function() { test.scrollIntoView(false); }); </script> </body>
Object型参数,这个对象有两个属性,属性
block
值能够是start和end;属性behavior
值auto
、instant
和smooth
up.addEventListener('click', function() { test.scrollIntoView({ block: 'start', behavior: 'smooth' }); }); down.addEventListener('click', function() { test.scrollIntoView({ block: 'end', behavior: 'smooth' }); });
scrollIntoViewIfNeeded
scrollIntoViewIfNeeded
能够接收一个Boolean型参数,和scrollIntoView
差别,true
为默许值,但不是转动到顶部,而是让元素在可视地区中居中对齐;false
时元素能够顶部或底部对齐,视乎元素靠哪边更近。
二者重要区分有两个。首先是scrollIntoViewIfNeeded
是比较懒惰的,假如元素在可视地区,那末挪用它的时刻,页面是不会发作转动的。其次是scrollIntoViewIfNeeded
只要Boolean型参数,也就是说,都是霎时转动,没有动画的能够了。
兼容性的话
scrollIntoView
:Boolean型参数险些随意用了scrollIntoViewIfNeeded
:IE和FireFox全红,挪动端基础都OK
细致见原文
本节参考文章:scrollIntoView…
17.ES6 中的 解构运算符 …
...
每次只能睁开最外层的数组,被 [].concat 后,arr 就扁平化一次。
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr);
}
return arr;
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
本节参考文章:数组扁平化
18.reverse数组
const reverse = xs => {
if (xs.length === 1) return xs;
const [head, ...tail] = xs;
return reverse(tail).concat(head);
};
reverse([1,2,3,4,5,6]) // [6,5,4,3,2,1]
19.正则完成trim()功用
function myTrim(str) {
let reg = /^\s+|\s+$/g;
return str.replace(reg, "");
}
console.log(myTrim(' asdf '));
本节参考文章:2018前端口试总结…
20.js 数组每一项去除空格
var s = "222 , 3334, 3666 "
s.replace(/\s/g,"") // "222,3334,3666"