标签:date 转变 gen time 区别 filename 通过 请求 执行
记录一些我经常混淆和遗忘的JS点
toGMLString() 和 toUTCString() 都是表示国际标准时间,toGMLString() 已经被淘汰,建议使用 toUTCString() 。
toLocalString() 表示当地的时间
toString() 表示根据当地的时间,但是格式是国际上的格式
这三者都表示字符串切割("断章取义") [ slice方法Array对象也可以使用 ]
1)区别1:
slice 和 substring 的第一个参数表示起分割index,第二个参数表示结束分割index,(不包括结束index)
substr 的第一个参数同上,第二个参数是表示要分割的个数
2)区别2:
3)区别3:
参数中遇上负数
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()
});
}
以上内容,如有错误请指出,不甚感激。
如需转载,请注明出处
标签:date 转变 gen time 区别 filename 通过 请求 执行
原文地址:https://www.cnblogs.com/adelina-blog/p/10912668.html