工作中遇到的一些问题

关于js操作改变input值,不触发onchange事件

input onchange是失去焦点以后触发的,我们通过js去操作它一直没有获得焦点,也就不会触发。
同理,也不会触发oninput,因为oninput是用户修改内容时才会触发。解决方法就是手动调用。

H5本地上传获取真实路径兼容写法

1
2
3
4
5
6
7
8
9
10
11
12
13
function getFileUrl(fileId) { 
var url;
var file = document.getElementById(fileId);
var agent = navigator.userAgent;
if (agent.indexOf("MSIE")>=1) {
url = file.value;
} else if(agent.indexOf("Firefox")>0) {
url = window.URL.createObjectURL(file.files.item(0));
} else if(agent.indexOf("Chrome")>0) {
url = window.URL.createObjectURL(file.files.item(0));
}
return url;
}

s对象、数组,改变原数据后新数据也随之改变

1
2
3
4
var a = {'num':1};//原数据
var b = a;//假设我们用b来存储
a.num = 2;//对原数据进行一些改变
console.log(b.num);//2

上面这种方法是达不到我们想要的效果的,因为实际在给b赋值时,是进行了传址操作,也就是说让b跟a指向同一个地址,实际数据只有一份,所以a改变时b也会随之改变。
一般的解决方法有深拷贝、转化为字符串。深拷贝可以去我的另一篇JS进阶里面有个extend方法,实际就是循环递归,拷贝一份一模一样的出来,下面简单写一下字符串转化的方法。

1
2
3
4
var a = {'num':1};
var b = JSON.stringify(a);
a.num = 2;
console.log(JSON.parse(b.num));//1