2016-09-22 28 views
2

後的變化考慮:事件。currentTarget的setTimeout

let sel=document.getElementById('mys'); 
 

 
sel.onchange=function(e) { 
 
    console.log(e.currentTarget===null); // false 
 
    setTimeout(e => { 
 
    console.log(e.currentTarget===null); // true 
 
    }, 0, e); 
 
}
<select id="mys"> 
 
    <option value="volvo">Volvo</option> 
 
    <option value="saab">Saab</option> 
 
    <option value="mercedes">Mercedes</option> 
 
    <option value="audi">Audi</option> 
 
</select>

  • 超時後爲什麼e.currentTarget變化?是一個瀏覽器(鉻)錯誤?

  • 如何將事件的確切克隆傳遞給超時函數?我想簡單的克隆,但currentTarget當前不可寫,不能ovverridden ..

+0

只能使用片段可運行代碼 – Li357

+1

它是可運行.. – kofifus

+1

看起來你需要一個關閉:https://jsfiddle.net/vrfv6gy7/ – Li357

回答

0

event.currentTarget和其他一些屬性在退出事件處理程序後發生更改。

在事件處理程序中執行上下文切換(setTimeout(... ,0);)很常見,似乎正確傳遞事件(包括currentTarget等)的唯一方法是克隆它,如下所示。

注意,這僅僅是「足夠好」 ......克隆不完全是原來的事件,它的背景是不同的...做例如clone.stopPropogation()是沒有意義的......

如果您需要更改currentTarget當前等在克隆刪除!d.writable || !d.configurable || !d.enumerable ||

let sel=document.getElementById('mys'); 
 

 
function cloneEvent(e) { 
 
\t function ClonedEvent() {}; 
 
\t let clone=new ClonedEvent(); 
 
\t for (let p in e) { 
 
\t \t let d=Object.getOwnPropertyDescriptor(e, p); 
 
\t \t if (d && (!d.writable || !d.configurable || !d.enumerable || d.get || d.set)) { 
 
\t \t \t Object.defineProperty(clone, p, d); 
 
\t \t } 
 
\t \t else { 
 
\t \t \t clone[p] = e[p]; 
 
\t \t } 
 
\t } 
 
\t Object.setPrototypeOf(clone, e); 
 
\t return clone; 
 
} 
 

 
sel.onchange=function(e) { 
 
\t console.log(e.currentTarget); 
 
\t let clone=cloneEvent(e); 
 
\t setTimeout(e => { 
 
\t \t console.log(e.currentTarget); 
 
\t }, 0, clone); 
 
}
<select id="mys"> 
 
    <option value="volvo">Volvo</option> 
 
    <option value="saab">Saab</option> 
 
    <option value="mercedes">Mercedes</option> 
 
</select>

-2

我建議你與其他瀏覽器試圖作爲代碼正在與我的,我不看任何問題的代碼段。

+0

這是如何回答這個問題的? – Li357

+1

我試過鍍鉻,你試過了哪一種? – kofifus

相關問題