- HTML: 是一門超文本標記語言,「超文本」就是指頁面內能夠包含圖片、連接,甚至音樂、程序等非文字元素。
- CSS : 層疊樣式表。CSS不只能夠靜態地修飾網頁,還能夠配合各類腳本語言動態地對網頁各元素進行格式化。
- JS:JavaScript:是腳本語言,是基於對象的語言,是弱數據類型的語言,是基於事件驅動的語言,能夠寫業務邏輯
基於對象:就是說對象已經被定義好了,只須要用對象便可
弱數據類型:對數據類型不敏感,(java是強數據類型的語言)
基於事件驅動:即點擊,鍵盤等各類事件驅動
運行在瀏覽器:有瀏覽器便可。無需編譯:由瀏覽器直接解釋
通常用來給HTML網頁增長動態、交互、拖拽等功能。javascript
ES是JavaScript的核心,描述了語言的基本語法(var、for、if、array等)和數據類型(數字、字符串、布爾、函數、對象(obj、[]、{}、null)、未定義)ECMAScript是一套標準,定義了一種語言(好比JS)是什麼樣子。css
document object model文檔對象模型,裏面提供了元素屬性啥的,可讓咱們操做頁面中的元素操做DOM時,想操做誰,先獲取誰。
操做DOM的本質是=獲取(想操做誰就先獲取誰)+觸發(獲取後能夠綁定本身想要的事件)+改變(事件函數觸發後就能發生對應的改變)
html
一、直接經過元素的ID獲取 只支持高版本瀏覽器
二、經過getElementById('ID'), getElementsByTagName('標籤名'), getElementsByClassName('類的名稱')java
對瀏覽器窗口進行訪問和操做。這是瀏覽器裏默認的瞭解就行node
- script腳本推薦放在最下邊好處:防止因網絡問題,頁面加載時間長,出現空白;即使網絡問題,瀏覽器也把DOM加載渲染完成,等待從服務端下載完js腳本,出現效果
- css不放在最下面緣由通俗地講:比如先穿好衣服在出去,瀏覽器先把css樣式準備好,在加載結構層,使得頁面有樣子;若是放在下面,由於頁面是從上往下加載,沒有css,就剩下裸露的標籤,很難看,使得用戶體驗很差
- 綜上兩點所述故css腳本必須在script上面
- 內嵌式 在頁面中直接寫入
<script type="text/javascript">js代碼</script>。
- 外鏈式 在頁面中引入外部文件
<script src="xx.js"></script>。
- 行內式 在標籤中(也就是元素裏)直接寫
<input type="button" value="點擊有驚喜" onclick="javascript:alert('哈哈哈哈')"/>
ios
- console.log(js,cs,html);在控制檯輸出,能夠輸出一個或者多個,其間用逗號隔開
- console.dir(js);在控制檯輸出詳細信息,用法同上
- alert('hello world');在頁面上彈出helloworld
- alert都是把要輸出的內容首先轉換爲字符串而後在輸出(調用了toString)
- document.write("hello world"); 在頁面中直接顯示hello world
- document.getElementById("search").value = "hello world" ;給id爲search這個文本框添加的內容
- innerHTML/innerText ->給除了表單元素的標籤賦值內容
- document.getElementById("div1").innerHTML = "吧啦吧啦吧啦吧啦";
常量的值是不可變的,反之爲變量。常量用const定義ajax
注意:基本數據類型是操做值的編程
數字類型包括整數、小數、NANaxios
注意:引用數據類型要轉爲數字類型,先轉爲字符串在轉爲數字類型(隱式轉換)
一、Number()將其餘數據類型轉化爲純數字類型,若沒有數字類型則返回NAN
二、parseInt()將其餘數據類型轉爲數字類型並取整,若沒有數字則返回NAN
三、parseFloat()將其餘數據類型轉爲數字類型並取小數點,若沒有數字則返回NAN設計模式
全部字符串的方法都不會改變原字符串
一、字符串的拼接
二、獲取字符串中對應索引的數據
注意:以上二者的區別是當str中無此索引時,str[0]返回的是undefined,charAt[0]返回的是空字符串
三、字符串的轉換
str.toLocaleUpperCase()
將字符串轉爲大寫
str.toLoCaleLowerCase()
將字符串轉爲小寫
str.slice(n,m)
從索引n複製到索引m(可是不包括索引m)
str.substr(n,m)
從索引n獲取m個
str.split('+')
以指定的分割符,把字符串分割爲數組
str.replace('要被替代的字符','用來代替的字符') 替換
eval('str'):將字符串str當成有效的表達式來求值並返回計算結果。eval裏面必須是字符串,若是其餘數據類型想調用eval函數,則須要先轉化爲字符串再進行計算,例如eval(ary.jion('+'))返回值是改數組各項值相加的結果
一、原數組發生改變的方法
- ary.push(1,2) 向數組的最後一項或者多項添加數據
- ary.unshift(1,2) 向數組的最前面一項添加一項或者多項數據
- ary.pop() 刪除數組中的最後一項
- ary.shift() 刪除數組中最前面的一項
- ary.length-1 刪除數字對應索引位置的數據
- ary.splice()
- 狀況一:splice(x) 只傳一個參數,表示從索引x開始刪除到末尾;
- 狀況二:splice(x,y) 傳兩個參數,表示從索引x開始向後刪除y個
- 狀況三: splice(x,y,z,f) 傳三個或者三個以上的參數時,表示從索引x日後刪除y項,並將第三位後面的參數替換刪除的地方
二、不改變原數組的方法
- indexOf:查找數組中對應數據的索引值,若是沒有則返回-1。這是從左到右查找對應值;只要找到就會輸出結果;若是後面有重複的內容也不會輸出其索引值。廣泛用於數組的查重
- lastIndexOf:查找數組中對應值的索引值;若是沒有返回-1;廣泛用於數組的查重;這是從右到左查找對應值;只要找到就會輸出結果;若是前面有重複的內容也不會輸出其索引值
- ary.includes("x"):查找數組中是否有x這個數據;若是有返回結果ture;若是沒有返回false。能夠用來判斷數組中是否有這個數據
- ary.slice() 返回值都是一個新的數組
- 狀況一:ary.slice() 若是沒有傳參,則表示複製一份原有數組,返回值是一個新的數組
- 狀況二:ary.slice(x) 只傳了一個參數,則表示從索引x開始一直複製到數組的末尾
- 狀況三:ary.slice(x,y) 若傳了兩個參數,則表示從索引x開始日後複製y個
- 狀況四:ary.slice(-x) 若傳了一個負數則表示從倒數的索引x開始日後複製
- ary.sort():數組的自動排序,數字從0到9依次遞增,若是大於10,則會按照十位數的數接着排
- 數字大於10時;且想用sort排序則能夠這樣用ary.sort(function(a,b){return a-b})當return裏的值是a-b時表示數組從小到大進行排序,如果b-a則表示從大到小排序
- ary.resever():表示將數組倒序排列,返回的倒序數組和原數組相等
- ary.concat()
- ary.concat(x,y,z):表示將x,y,z拼接到數組裏,返回值是一個拼接好的新數組若是拼接的是數組則先將其拆開後再進行拼接
- ary.concat():若沒有傳參則表示複製一份原有數組
- ary.toString():表示將數組轉化爲新的字符串
- ary.join():表示以指定分割符將數組轉化爲字符串。若沒有傳參則默認是逗號爲分割符
let ary = [1,2,2,4,55,6];
let obj = {};
let arr = [];
function removeRep(ary){
ary.forEach(item=>{
obj[item] = 1
})
for(var i in obj){
arr.push(i*1)
//由於對象的屬性名是字符串,要將其轉換爲數字再放進數組;
//Number(K)也能夠換車給k*1 需求是同樣的
}
return arr
}
console.log(arr)//[1,2,4,6,55]
複製代碼
let ary = [1,1,2,3,4,5,4]
function removeRep (ary){
for(let i = 0 ; i<ary.length-1 ; i++){
let before = ary[i]
for(let k = i+1 ; k<ary.length ; k++){
if(ary[i]===ary[k]){
ary.splice(k,1);
k = k-1
}
}
}
return ary
}
console.log(ary)//[1,2,3,4,5]
複製代碼
let ary = [1,2,3,4,5,7,11,5,2,1];
function removeRep(a){
let arr = [];
a.forEach(item=>{
if(arr.indexOf(item)===-1){
arr.push(item)
}
})
return arr
}
removeRep(ary)
console.log(arr)//[1, 2, 3, 4, 5, 7, 11]
複製代碼
普通對象;例如{屬性名:屬性值};普通對象是用大括號包住的。其中屬性值能夠時數字。而屬性名和屬性值成爲鍵值對,一個對象中可有多個鍵值對,多個鍵值對間用逗號隔開普通對象中的屬性名不能夠是數字加字母,但能夠是數字。且屬性名都是字符串,只是平時將其省略了
改和增的方式和用法和上面一致,只須要直接賦值就能夠。例如:obj.name='hello';obj[2]=3
而已
function fn(num1 , num2 , callback){
return callback(num1 , num2)
}
function fn2(num3 , num4){
return num3 + num 4
}
fn(1,2,)
複製代碼
let num = 0;
function sum(n){
if(n<5){
num = n + sum(n+1)
}
return num
}
sum(1)
console.log(num) //10
複製代碼
let total = 0;
function sum(num){
for(let i = 0 ; i<num+1 ; i++){
total += i
}
return total
}
sum(100)
console.log(total) // 5050
複製代碼
let total = 0
function sum(num){
if(num<101){
total = num + sum(num+1)
}
return total
}
sum(0)
console.log(total) // 5050
複製代碼
function getNum(n){
let str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
let str2 = '';
function num(n){
n = n || 4;
let ary = [];
while(ary.length<n){
let index = Math.round(Math.random()*61);
if(ary.indexOf(index)==-1){
ary.push(index)
}
}
return ary
}
function getCode(n){
n = n || 4;
num(n)
ary.forEach(item=>{
str2 += str[item]
})
}
getCode(n)
return str2
}
consloe.log(getNum(5))
複製代碼
<body>
<ul>
<li>1<li>
<li>2<li>
<li>3<li>
<li>4<li>
</ul>
</body>
<script>
let lis = document.getElementByTagName('li');
for(let i = 0 ; i<lis.length ; i++){
if(i%2===0){
lis.style.backgound = 'red'
}else{
lis.style.background = 'green'
}
}
</script>
複製代碼
function sum(m,n){
return Math.floor(Math.random()*(m-n)+n)
}
sum(1,100)
複製代碼
console.log(typeof('你好'))// 'string';
console.log(typeof(null)) // 'object';
console.log(typeof(undefined)) //'undefined';
console.log(typeof(5)) //'number';
console.log(typeof(Function)) //'function'
console.log(typeof(false)) //'boolean'
console.log(typeof(NaN)) //'number'
複製代碼
console.log([] instanceof Array) // true
console.log(function fn(){} instanceof Function) // true
console.log({} instanceof Object) // true
複製代碼
console.log([].constructor) // f Array{} [native code]
console.log({}.constructor) // f Object{} [native code]
複製代碼
console.log(Object.prototype.toString.call(5)) // [object Number];
console.log(Object.prototype.toString.call(null)) // [object Null];
console.log(Object.prototype.toString.call(NAN)) // [object Number];
console.log(Object.prototype.toString.call('')) // [object String];
複製代碼
let a1 = 2;
let b2 = a1;
b2 = 10
console.log(a1) //2
let a = {
name:'小可愛',
obj:{
age:20
}
}
let b = a
b.name = '大可愛'
console.log(a) //{name:'大可愛',obj:age:20}
複製代碼
let a = {
name:'小可愛',
obj:{
age:20
}
};
let b = {
name:'乖乖',
b:2
}
let target = {}
Object.assign(traget,a,b)
console.log(traget)//{name:'乖乖',b:2,age:20}
target.b = 20;
console.log(b)//{name:'乖乖',b:2}
target.obj.age = 30
console.log(a)//{name:'小可愛',obj:{age:30}}
複製代碼
let a = {
name:'小可愛',
obj:{
age:20
}
};
let target = {...a};
target.name = '糟老頭';
target.obj.age = 10;
console.log(a)//{name:'小可愛',obj:{age:10}}
複製代碼
let a = ['小可愛',{age:20}];
let target = a.slice();
target[0] = '糟老頭';
target[1].age = 30;
console.log(a)//['小可愛',{age:30}]
複製代碼
let ary = [1,{age:10}];
let arr = JOSN.parse(JSON.stringify(ary));
arr[2].age = 20
console.log(ary)//[1,{age:10}];
let obj = {age:2,name:'小可愛'};
let obj2 = JSON.parse(JSON.stringify(obj));
obj2.name = '糟老頭子';
console.log(obj)//{age:2,name:'小可愛'};
//JSON.stringify(),將普通對象轉化爲JSON字符串,被轉化的參數必須是對象。
//注意:JSON.prase(),轉化的對象必須是JSON字符串,他的做用是將JSON字符串轉化爲JSON對象
複製代碼
//第一題
function F(){};
function O(){};//原型是對象
O.prototype = new F(); //O如今原型是對象
let obj = new O(); //obj是O的實例,原型是Obj.prototype
console.log(obj instanceof O) //true obj在O的原型鏈上
console.log(obj instanceof F) //true obj也在F的原型鏈上
obj.__proto__ == O.prototype //true
obj.__proto__.__proto__ === F.prototype //true
//第二題
function F(){};
function O(){}; // O的原型是對象
let obj = new O() //
O.prototype = new F()
console.log(obj instanceof O) //false
console.log(obj instanceof F)//false
console.log(obj.__proto__ === obj.prototype) //false
複製代碼
let new1 = function(foo){
let obj1 = Object.create(foo.prototype)//建立一個新對象,這個對象繼承了foo構造器的原型
let obj2 = foo.call(obj1)//執行foo,並把this指針指向obj1;new建立一個實例時;實例的this
//指向它自己。這裏的obj2返回的時[],由於Array()執行了
if(obj2 === 'object'){
return obj2
}else{
return obj1
}
}
new1(Array)
複製代碼
//第一題
function Person(name){
this.name = name;
return name
}
let p = new Peron('tom');//Person{name:tom}
// 第二題
function Person(name){
this.name = name;
return {}
}
let p = new Person('tom');//{}
複製代碼
let timer = setTimeout(()=>{},2000)
function fn(){
console.log(this)
}
docoment.getElementById('div').onclick = function(){
console.log(this)//div
fn() //window
}
document.getElementById('div').onclick = fn;//div
複製代碼
Function.prototype.newCall = function(arg){
let ctx = arg || window;
ctx.fn = this;
let params = [...arguments].slice(1);
let res = ctx.fn(...params);
delete ctx.fn
return res
}
let obj = {
name:'你好',
fn:function(...arg){
console.log(this.name,...arg)
}
}
obj.fn.newCall(obj,'年齡22','體重25Kg')
複製代碼
2.手寫apply
Function.prototype.newApply = function (context, arg) {
let ctx = context || window;
ctx.fn = this;
let res = ctx.fn(...arg);
delete ctx.fn
return res
}
let obj = {
name: '你好',
fn: function (...arg) {
console.log(this.name, ...arg)
}
}
obj.fn.newApply(obj, ['年齡22', '體重25kg'])
複製代碼
3.手寫bind
Function.prototype.newBind = function (context=window){
let ctx = context;
ctx.fn = this;
let arg = [...arguments].slice(1);
return function(){
ctx.fn(...arg)
}
}
let obj = {
name: '你好',
fn: function (...arg) {
console.log(this.name, ...arg)
}
}
複製代碼
- 變量提高:該變量還未被聲明,在代碼執行以前,先在詞法環境種進行註冊。若是變量聲明的是一個全局變量就會將變量聲明提高到全局做用域頂部。若是變量的聲明是在函數裏,則將變量提高到函數做用域的開頭。
- 變量的提高:var既聲明一個變量又定義;只有var有變量提高;let和const沒有變量提高。
- 函數的提高:函數既聲明也定義。函數的聲明優先級高於變量。
var sun = 1;
if(true){
sun = 1;//報錯;
let sun = 2;
}
複製代碼
let ary = [1,2,3];
let sum = 0;
ary.forEach((item,index,arr)=>{
sum += item //6
console.log(index) //0,1,2
console.log(arr) // [1,2,3]
})
複製代碼
let ary = [1,2,3];
let ary = ary.forEach((item,index,arr)=>{
return item*2
})
console.log(ary)//[2,4,6]
複製代碼
let ary = [1,2,3];
let arr = ary.filter((item,index,arr2)=>{
return item>2
})
console.log(arr)//[3]
複製代碼
let ary = [1,2,3];
let sums = ary.reduce((sum,element,index,arr)=>{
//sum 上一次的累加值;elememt當前元素;index當前元素索引;arr原數組
return sum + element
})
console.log(sums)//6
複製代碼
let ary = ['one','two','three'];
let [a,b,c] = ary;
console.log(a,b,c);// 'once','two','three'
複製代碼
let a,b;
[a = 2,b = 3] = [1,2];
console.log(a,b);//1,2
複製代碼
let [a,b] = [1,2];
[b,a] = [a,b]
console.log([a,b]) //2,1
複製代碼
function fn(){
return [1,3]
};
[a,b] = fn();
console.log(a,b);//1,3
複製代碼
,
表示忽略的值。一個逗號表明一個值。let ary = [1,2,3,4];
[a,,b] = ary;
console.log(a,b)//1,3
複製代碼
let ary = [1,2,3,4];
[a,...b] = ary;
console.log(a,b)//1,[2,3,4]
複製代碼
let obj = {key:1,all:2};
let {key:num1,all:num2} = obj;
console.log(num1,num2);//1,2
複製代碼
let obj = {key:1,all:2};
let {key,all} = obj;
console.log(key,all);//1,2
複製代碼
let obj = { key : 1 , all : 2};
({key,all} = obj);
console.log(key,all)
複製代碼
let obj = {
a:()=>{
console.log(this)
}
}
obj.a() //window;由於obj的this是window
複製代碼
let obj = {
a:()=>{
console.log(this)
}
}
console.log(obj.a.prototype)//undefined
複製代碼
class Obj {
constructor(x,y){
//this是obj類的實例;這些屬性是私有屬性
this.x = x;
this.y = y;
},
to(){
return this.x+this.y
}
}
let obj = new Obj(1,2);
console.log(obj); {x:1,y:2}
obj.to()//3
複製代碼
class Obj {
constructor(x,y){
//this是obj類的實例;這些屬性是私有屬性
this.x = x;
this.y = y;
},
to(){
return this.x+this.y
}
}
class Arr extends Obj {
constructor(a){
super(2,3)
this.c = a
}
fn(){
return this.x+this.y+this.c
}
}
let arr = new Arr(5)
console.log(arr){x:2,y:3,c:5}
arr.fn()//8
複製代碼
function fn(num1,num2){
return new Promise((resolve,reject)=>{
let sum = num1 + num2;
resolve([sum,num1])
})
}
fn(1,2).then(([sum,num1])=>{
console.log(sum,num1) //3,1
return sum
}).then((num)=>{
console.log(num+5) //8
})
複製代碼
let str = 'abc'
let arr = Array.from(str)
console.log(str)//['a','b','c']
複製代碼
let ary = [1,1,2,4,5,4,5,6,7];
let set = new Set(ary);
let a = Array.from(set)
console.log(a)//[1,2,4,5,6,7]
複製代碼
let obj = {1:220,2:300,5:400}
let result = Array.from({length:5},(item,index)=>{
return obj[index+1] || null
})
console.log(result)//[220,300,null,null,400]
//必須有item,不然返回的數組都是null
複製代碼
function callback(num1,num2,back){
let sum = num1+num2;
back(sum)
}
function print(num){
console.log(num)
}
callback(1,2,print)
//用promise實現
function fn(num1,num2){
return new Promise((resolve,reject)=>{
let sum = num1+num2
resolve(sum)
})
}
fn(1,2).then((sum)=>{
console.log(sum)
})
複製代碼
function Father(){
this.x = 2;//私有屬性
this.method = function(){
console.log(this.x)
}
}
Father.prototype.pub = 5 //公有屬性
function Son(){
this.a = 4
}
Son.prototype = new Father
Son.prototype.constructor = Son
let son = new Son()
console.log(son) //{a:4}=>__proto__=>Father=>{x:5}
複製代碼
function Father(){
this.x = 2;//私有屬性
this.method = function(){
console.log(this.x)
}
}
Father.prototype.pub = 5 //公有屬性
function Son(){
Father.call(this)//將父類的函數看成一個普通函數執行
}
複製代碼
function Father(){
this.x = 2;
this.method = function(){
console.log(this.x)
}
};
Father.prototype.pub = 5;
//繼承公有屬性
Son.prototype = Object.create(Father);//建立一個新對象,這個對象的原型指向Father.prototype
Son.prototypr.constructor = Son;
function Son(){
Father.call(this);//將Father的私有屬性賦給Son的私有
}
let son = new Son()
複製代碼
HTML中與js的交互是經過事件來實現的,例如點擊事件、頁面滾動事件onscroll。
什麼是事件流:事件流指的是從頁面中接收事件的順序。 事件流的順序是先捕獲後冒泡。
事件流有下面幾個階段:
e.stopPropagation()
e.stopImmediatePropagation()
e.preventDefault()
e.addEventListener(event,function,useCapture)
方法,用於向指定元素添加事件,他能夠更簡單的控制事件的觸發階段。
鼠標事件
鍵盤事件
表單事件
拖動事件
框架/對象事件
事件委託就是利用事件冒泡,大大的提升了性能優化。在須要觸發事件的父元素上設計函數監聽,父元素經過監聽子元素上觸發的事件來觸發事件。最經典就是ul下的li。
好處:比較適合動態元素的綁定,新增長的新元素也會有監聽函數。也能夠有事件觸發機制。
let xhr = new XMLHttpRequest() //建立一個ajax對象
//必須在open()以前指定onreadystatechange 事件處理程序才能保證跨瀏覽器的兼容性 xhr.onreadystatechange = function(){
if (xhr.readystate === 4 ){
if(xhr.state === 200 && xhr.state < 300 || xhr.state === 304){
console.log(xhr.responseText) }else{
console.log('Error'+ xhr.status)
}
xhr.open('get','url',true) // 第三個參數true表明異步,若是是false表明是同步
xhr.send(data) // 參數做爲請求主體發送的數據 }}
document.addEventListenner(DOMContenLoaded,function(){},flase)
function callback(fn){
setTimeout(()=>{
fn()
},100)
}
function fn2(){
console.log(11)
}
callback(fn2)
複製代碼
function p(num1,num2){
return new Promise((resolve,rejece)=>{
setTimeout(()=>{
let sum = num1 + num2
resolve(sum)
},100)
})
};
p(1,2).then(sum=>{
console.log(sum)
})
複製代碼
function* gen(){
let res = yield 'hello';
yield res;
return '你好';
}
let g = gen()
console.log(g.next())//{value:"hello",done:false};
conso.log(g.next(20))//{value:20,done:false}//在next中傳入的參數會做爲上次yield的返回值
console.log(g.next())//{value:'你好',done:true}
複製代碼
function fnA(n){
return new Promise(resolve=>{
//異步操做
resolve(n)
})
}
function fnB(n){
return new Promise(resolve=>{
//異步操做
resolve(n)
})
}
async function gen(){
let resA = await fnA(1)
let resB = await fnB(resA)
}
gen()
複製代碼
function getNum(n){
return new Promise((resolve,reject)=>{
let sino = parseInt(Math.random()*6+)
if(sino>3){
if(n=="大"){
resolve(sino)
}else{
reject(sino)
}
}else{
if(n == '大'){
reject(sino)
}else{
resolve(sino)
}
}
})
}
async function test(n){
try{
let num = await getNum(n)
console.log('贏了',num)
}catch(error){
console.log('輸了',error)//這裏error接收的是reject的值
}
}
test('大')
console.log(test('大'))//返回的是一個Promise對象。
複製代碼
function fn(){
return new Promise(resolve=>{
console.log(1)
//resolve
})
}
async function f1(){
await fn()
console.log(2)
}
f1()
console.log(3)
//1,3
//若是有resolve,1,3,2
複製代碼
let ary = [1,2,[3,4,5,[6,7]],8];
let arr = [];
ary.forEach(item=>{
if(Array.isArray(item)){
arr = arr.concat(...item)
}else{
arr = arr.concat(item)
}
})
console.log(arr)//[1,2,3,4,5,6,7,8]
複製代碼
<div class="main">
<input type="file" onchange="change(event)" onclick="click()" style="display: none;" id="fileEle"
multiple='multiple'>
<div class="avatar" style="width: 50px; height: 50px; border-radius: 100%; background: yellow;" onclick="fn()"></div>
<img src="" id="img" onclick="getImg()" style="width: 50;height: 50px;background: red;">
</div>
<script>
//multiple="multiple"表示支持選中多個文件
let fileEle = document.getElementById('fileEle');
let img = document.getElementById('img');
function getImg() {
fileEle.click()
}
function change(event) {
console.log(event.target.files[0])
let files = fileEle.files[0]; //fileEle.file是一個Filelist對象
let render = new FileReader();
render.readAsDataURL(files);
render.onload = function () {
img.setAttribute('src', render.result);
}
}
function fn(){
fileEle.click()
}
</script>
複製代碼