簡體   English   中英

“ onclick”事件會自動觸發

[英]“onclick” event gets fired automatically

我有這段代碼具有onclick處理程序和IIFE

var btn = document.getElementById("btn");
btn.onclick = function clickHandler(){console.log("Button clicked"); } 

//btn.onclick = function clickHandler(){console.log("Now clicked"); };

(function(){
    console.log("Hello");
})();

問題是clickHandler在頁面加載后自動調用並且IIFE沒有被調用 但是,在注釋掉第2行和取消注釋第3行(上述代碼中的注釋掉的行)時,該代碼將按預期工作。

這兩行之間的唯一區別是第二行沒有 最后,但是第三行。

另外,如果我刪除IIFE並保持其余代碼不變,則代碼可以正常工作。

演示: https : //codepen.io/anon/pen/Pezpqv

這很棘手。 因為在代碼的第二行中缺少分號,所以解析器不會在那里停下來,而是會消耗所有可能的令牌。 最后,代碼被解析為...

btn.onclick = function clickHandler() {
  console.log("Button clicked");
}(
  //btn.onclick = function clickHandler(){console.log("Now clicked"); };

  function() {
    console.log("Hello");
  }
)
();

請參見difference () make-您的函數表達式將立即被調用。 有趣的是...

function() { console.log('Hello') }

...被視為其參數值-仍然會被忽略。

之后,嘗試將clickHandler結果作為函數重用-但由於返回undefined ,因此JS停止以(intermediate value)(...) is not a function


認為稍微修改一下代碼是一個好主意-並制作了以下代碼片段,以期在其中包含更多,更生動的內容來說明該想法。

 const btn = document.getElementById('btn'); btn.onclick = function clickHandler(e) { console.log('Now clicked'); return e; } //btn.onclick = function clickHandler(){console.log("Now clicked"); }; (function() { console.log('Hi!'); })(); 
 <button type="button" id="btn">Click me!</button> 

如果您想讓他們有點生氣,請向您的同事展示並詢問相同的問題(為什么單擊處理程序在這里不起作用?)。

您在這里錯過了半列

btn.onclick = function clickHandler(){console.log("Button clicked"); } ;

問題是在與起始碼(而代碼不與分號(結束前一行; )。此處理二者線被一起執行的代碼的這樣的:

}(

要解決這個問題要么你必須提出; 在statemnet的末尾,或將IIFE代碼移到代碼頂部:

 (function(){ console.log("Hello"); })(); var btn = document.getElementById("btn"); btn.onclick = function clickHandler(){console.log("Button clicked"); } 
 <button type="button" id="btn" >Click</button> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM