记录一些我常常混淆和遗忘的JS点javascript
toGMLString() 和 toUTCString() 都是表示国际标准时间,toGMLString() 已经被淘汰,建议使用 toUTCString() 。html
toLocalString() 表示当地的时间vue
toString() 表示根据当地的时间,可是格式是国际上的格式java
这三者都表示字符串切割("断章取义") [ slice方法Array对象也可使用 ]node
1)区别1:android
slice 和 substring 的第一个参数表示起分割index,第二个参数表示结束分割index,(不包括结束index)ios
substr 的第一个参数同上,第二个参数是表示要分割的个数git
2)区别2:es6
3)区别3:github
参数中赶上负数
substring 中遇到负数直接视为0
substr 中遇到负数,第一个参数是字符串长度加上负数,第二个参数视为0
slice 中遇到负数,两个参数都是字符串长度加上负数
XSS: 跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
CSRF: 跨站请求伪造(Cross-site request forgery)一般缩写为CSRF或XSRF,是一种对网站的恶意利用。XSS 利用站点内的信任用户,而CSRF则经过假装来自受信任用户的请求来利用受信任的网站。
localStorage 、 sessionStorage、cookie 都是用户存储客户端临时信息的对象,且同源的。
session 是存储在服务器的临时会话数据
localStorage 生命周期是永久
sessionStorage 生命周期为当前窗口或标签页
cookie生命周期取决于设置的cookie过时时间(若是没有设置过时时间,则浏览器关闭生命周期结束)
cookie 数据始终在同源的http请求中携带(即便不须要),即cookie在浏览器和服务器来回传递。它还有路径的概念,能够限制cookie只属于某个路径下。cookie数据不能超过4k,由于每次http请求都会携带cookie,因此cookie只适合保存很小的数据。
sessionStorage 和 localStorage 虽然也有存储大小的限制,但比cookie大得多,能够达到5M或更大。
Web Storage 实际上由两个部分组成:sessionStorage 和 localStorage
// 生成随机数 getRandomNum(randomLength) { let rL = randomLength || 18; return Number(Math.random().toString().substr(3,rL) + Date.now()).toString(36); },
// 判断是不是pc isPc: function(req, res){ let sUserAgent = req.headers["user-agent"].toLowerCase(); let bIsIpad = sUserAgent.match(/ipad/i) == "ipad"; let bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os"; let bIsMidp = sUserAgent.match(/midp/i) == "midp"; let bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4"; let bIsUc = sUserAgent.match(/ucweb/i) == "ucweb"; let bIsAndroid = sUserAgent.match(/android/i) == "android"; let bIsCE = sUserAgent.match(/windows ce/i) == "windows ce"; let bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile"; let bIsWP = sUserAgent.match(/windows phone/i) == "windows phone"; if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM || bIsWP) { return false; //Mobile } else { return true; //pc } },
url带参数 -- 单向传递
父页面获取子页面属性:Frame.contentWindow.属性
vue中父页面的方法须要写到index.html或者定义window.parent/window.top = 方法
postMessage -- 单向传递
注意: IE8 和 IE9 仅支持窗口与<frame>
和 <iframe>
之间的通讯
localStorage
websocket
方法一
es6中引入扩展运算符(...),它用于把一个数组转化为用逗号分隔的参数序列,它经常使用在不定参数个数时的函数调用,数组合并等情形
arr = [1, 2, 3, 4, 5] // 交换第三个和第四个元素 // x < y x = 2, y = 3 arr.splice(x, 1, ...arr.splice(y, 1, arr[x])) console.log(arr) /// [1,2,4,3,5]
方法二
let a=[1,2,3]; [a[1], a[2]]=[a[2], a[1]];
导出excel文件,请求头的accety格式为application/vnd.ms-excel
new blob能够转化为blob格式
<!--if (window.navigator.msSaveOrOpenBlob) // IE10+--> <!--window.navigator.msSaveOrOpenBlob(file, filename);--> let link = document.createElement('a'); let year = this.descData.year ? this.descData.year : '- -'; let month = this.descData.month ? this.descData.month : '- -'; link.style.display = 'none'; link.href = window.URL.createObjectURL(response.data); link.download = `汇报明细_${year}年${month}月`; document.body.appendChild(link); link.click(); window.URL.revokeObjectURL(link.href); document.body.removeChild(link);
能够直接把base64加到a标签的link属性中在前面加上data:文件类型;base64,
,download属性设置文件名字,能够下载
base64ToFile(base64Data, tempfilename, contentType) { contentType = contentType || ''; var sliceSize = 1024; var byteCharacters = atob(base64Data); var bytesLength = byteCharacters.length; var slicesCount = Math.ceil(bytesLength / sliceSize); var byteArrays = new Array(slicesCount); for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { var begin = sliceIndex * sliceSize; var end = Math.min(begin + sliceSize, bytesLength); var bytes = new Array(end - begin); for (var offset = begin, i = 0 ; offset < end; ++i, ++offset) { bytes[i] = byteCharacters[offset].charCodeAt(0); } byteArrays[sliceIndex] = new Uint8Array(bytes); } var file = new File(byteArrays, tempfilename, { type: contentType }); return file; }
download属性的兼容性较差,不建议使用,建议后台直接返回url去下载
str.split(/[字符集合]/) eg: 'aa-bb_cc/dd' -> [aa, bb, cc ,dd] 'aa-bb_cc/dd'.split(/[-_/]/)
btoa()/atob
ps: a -> ascii, b -> binary
该事件可用于弹出对话框,提示用户是继续浏览页面仍是离开当前页面。
兼容性好
document.body.addEventListener('touchmove', function (e) { e.preventDefault(); //阻止默认的处理方式(阻止下拉滑动的效果) }, {passive: false}); //passive 参数不能省略,用来兼容ios和android
仅适用不考虑样式或内联样式的页面【例如:微信公众号文章】
【PS: 若是带有多图,必需要有浏览行为才能够拿到图片!!】
【全部跨域问题的解决必须有服务器权限和服务器配合 】
iframe
作隐形的桥梁(拖慢页面渲染) -- 跨域不可取,浏览器安全限制window.frames["iframe的name值"].document.getElementById("iframe中控件的ID").click(); 实例:window.frames["ifm"].document.getElementById("btnOk").click(); 格式: var obj=document.getElementById("iframe的name").contentWindow; var ifmObj=obj.document.getElementById("iframe中控件的ID"); ifmObj.click(); 实例: var obj=document.getElementById("ifm").contentWindow; var ifmObj=obj.document.getElementById("btnOk"); ifmObj.click();
考虑使用node抓取数据(后台爬虫)
JQ的load()方法 -- 跨域不可取,浏览器安全限制
直接请求页面,将拿到的结果回填 -- 跨域不可取,浏览器安全限制
(ajax,fetch等)
使用代理转发一层(还未测试)-- 多图不可行,必须模拟浏览器行为
场景:注册/修改密码时含有type=password的input和在他以前非type=password的input时会自动填充浏览器保存的密码
<form> <input type="text" /> </form> <form> <input type="password" /> </form>
用隐藏input隔开在chorme无效
经过focus修改type只在密码在上/除密码以外的input框在下的状况
自行建立一个formData格式的请求用于上传文件
建立formData对象
const formData = new FormData(); formData.append('file', (某input元素对象).files[0]);
Content-Type:multipart/form-data;
后不会自动加boundary及以后的内容(例如Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBHCQAyJZJXeOYet1
)JSON.stringify
一个Boolean是true若是响应表示您的请求被重定向。
storage变化,ie会刷新全部页面(与当前storage相关的)其余浏览器值会刷新当前页。能够经过比较newValue和oldValue再作出相应的操做
ie和safari不支持
// 兼容IE处理(IE缓存坑) if (newConf.method.toLowerCase() === 'get') { newConf.params = Object.assign({}, (newConf.params || {}), { _: new Date().getTime() }); }
以上内容,若有错误请指出,不甚感激。 如需转载,请注明出处