2017-05-05 114 views
2

測試:'點擊()'的click事件處理

var btn = document.querySelector('button') 
 
btn.addEventListener('click', log) 
 

 
function log(event) { 
 
    var p = document.createElement('p') 
 
    p.textContent = event.type 
 
    document.body.appendChild(p) 
 
    fire() 
 
} 
 

 
function fire() { 
 
    btn.click() 
 
}
<button type="button">Click me</button>

我認爲一個異常將被拋出。點擊事件處理程序中的click()分派點擊事件,點擊事件處理程序再次調用click(),再次分派點擊事件,依此類推。但結果與我想的不一樣,只輸出兩次'點擊'(IE輸出一次'點擊')。

現在更改fire函數,創建一個click事件並分派它,結果如預期。

var btn = document.querySelector('button') 
 
    btn.addEventListener('click', log) 
 

 
    function log(event) { 
 
    var p = document.createElement('p') 
 
    p.textContent = event.type 
 
    document.body.appendChild(p) 
 
    fire() 
 
    } 
 

 
    function fire() { 
 
    var event = new MouseEvent('click') 
 
    btn.dispatchEvent(event) 
 
    }
<button type="button">Click me</button>

我的問題是,爲什麼click()行爲有所不同?

注意事項:沒有使用jQuery,與jQuery方法.click()無關。

回答

-1

你的.click()做了與之相關的動作(如下面的鏈接)bud並沒有觸發click event> no log函數再次被調用,所以沒有執行重複的點擊事件。

在第二個版本中,你經常觸發click事件,所以你的log函數執行無限次。

+0

你能解釋一下嗎?爲什麼日誌不再被調用? – Rajesh

+0

@Rajesh沒有執行'click'事件 - 沒有'log'函數執行 – Justinas

+1

@Justinas爲什麼'log'和'fire'被調用兩次?據你說,'log'應該只被調用過一次。但console.log顯示兩個執行:https://jsfiddle.net/wostex/82d39L4n/1/ – wostex

1

dispatchEvent將事件同步發送到目標,所以當您使用dispatchEvent時,事件處理程序幀在堆棧上累積並最終溢出。因此,打印無限click並填充您的堆棧(控制檯異常)。請參閱documentation

但是,當您在javascript中使用.click()受控事件時。它僅模擬一個事件,即click而不是連續同步呼叫。請參閱documentation獲取更多幫助。

+0

呃,這裏沒有使用jQuery。 –

+0

appologies。但是這兩種方法(JavaScript和JQuery的'click()')都以相同的方式工作。看到更新的答案。 –