Page 1
文本框输入,p标签的内容自动变成文本框的内容
/**
* 使用addEventListener
* 首先获取标签和文本框的元素,然后为文本框添加一个监听器,在发生改变时,更改p标签的文本
*
**/
<input type="text" id="onchange" value="input">
<p id="on_change">input</p>
<script>
const input = document.getElementById('onchange');
const p = document.getElementById('on_change');
input.addEventListener('input', function () {
p.textContent = input.value;
});
</script>
/**
* 使用onchange和oninput
* onchange:在修改失去焦点时触发
* oninput: 会在元素发生变化时立即触发
*
**/
<div id="div1"><!--非vue-->
JS的onchage事件:
<input type="text" id="t1" onchange="p1()">
<p id="pp">原始值</p>
</div>
<script>
function p1(){
var lb_p=document.getElementById("pp");
var txt_t1=document.getElementById("t1").value;
lb_p.innerHTML=txt_t1;}
</script>
<div id="div2"><!--非vue-一些ie低版本不支持-->
JS的oninput事件:
<input type="text" id="t2" oninput="p2()">
<p id="pp2">原始值</p>
</div>
<script>
function p2() {
var lb_p=document.getElementById("pp2");
var txt_t2=document.getElementById("t2").value;
lb_p.innerHTML=txt_t2;
}
</script>
oninput 和 onchange 是事件属性,addEventListener 是方法,可以添加多个事件监听器
个人理解:
oninput 和 onchange是直接的事件,触发这个事件时调用他指定的方法,
而 addEventListener 添加的监听器中,第一个参数指定事件,后面的参数是调用的方法。
/**
* 在 react 中实现
*
**/
function App() {
const [text, setText] = useState('');
const handleChange = (event) => {
setText(event.target.value);
};
return (
<div>
<input type="text" value={text} onChange={handleChange} />
<p>{text}</p>
</div>
);
}
数组与树的相互转换
/** 数组结构数据 */
const arrayData = [
{ id: 2, title: '中国', parent_id: 0 },
{ id: 3, title: '广东省', parent_id: 2 },
{ id: 4, title: '广州市', parent_id: 3 },
{ id: 5, title: '天河区', parent_id: 4 },
{ id: 6, title: '湖南省', parent_id: 2 },
{ id: 1, title: '俄罗斯', parent_id: 0 }
]
function getChildren(data, result, pid) {
for (const item of data) {
if (item.parent_id === pid) {
const newItem = { children: [], ...item }
result.push(newItem)
getChildren(data, newItem.children, item.id)
}
}
}
function arrayToTree(data, pid) {
let result = []
getChildren(data, result, pid)
return result
}
console.log(arrayToTree(arrayData, 0));
/** 树状形结构数据treeData */
const treeData = [
{
id: 2, title: '中国', parent_id: 0,
children: [
{
id: 3, title: '广东省', parent_id: 2,
children: [
{
id: 4, title: '广州市', parent_id: 3,
children: [
{ id: 5, title: '天河区', parent_id: 4 }
]
}
]
},
{ id: 6, title: '湖南省', parent_id: 2 }
]
},
{ id: 1, title: '俄罗斯', parent_id: 0, },
]
function treeToList(data) {
let res = [];
const dfs = (tree) => {
tree.forEach((item) => {
if (item.children) {
dfs(item.children);
delete item.children;
}
res.push(item);
});
};
dfs(data);
return res;
}
手写promise.all
/**
* @param {Array<Function>} functions
* @return {Promise<any>}
*/
var promiseAll = function(functions) {
return new Promise((resolve,reject)=>{
if(functions.length===[]){
resolve([]);
return
}
const res=new Array(functions.length).fill(null)
let resolvedCount=0
functions.forEach(async(el,idx)=>{
try{
const subResult=await el()
res[idx]=subResult
resolvedCount++
if(resolvedCount===functions.length){
resolve(res)
}
}catch(err){
reject(err)
}
})
})
};
/**
* const promise = promiseAll([() => new Promise(res => res(42))])
* promise.then(console.log); // [42]
*/
大数相加
let a = "9007199254740991";
let b = "1234567899999999999";
function add(a ,b){
//取两个数字的最大长度
let maxLength = Math.max(a.length, b.length);
//用0去补齐长度
a = a.padStart(maxLength , 0);//"0009007199254740991"
b = b.padStart(maxLength , 0);//"1234567899999999999"
//定义加法过程中需要用到的变量
let t = 0;
let f = 0; //"进位"
let sum = "";
for(let i=maxLength-1 ; i>=0 ; i--){
t = parseInt(a[i]) + parseInt(b[i]) + f;
f = Math.floor(t/10);
sum = t%10 + sum;
}
if(f == 1){
sum = "1" + sum;
}
return sum;
}
Last updated