神奇的iframe现象:居然能够自动触发onclick 事件,这是什么原因??

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
   <button id='chg'>change</button>
   <iframe id='frame' src=''></iframe>
   <script>
     function $id(id){
       return document.getElementById(id);
     }
     var btn=document.getElementById('chg');
     var tip=true;
     btn.onclick=function(){
        alert('你居然在按钮没有被按下的时候就触发了!!!');
     }

     (function(){
         var iList=document.getElementsByTagName('iframe');
         for (var i=0;i<iList.length;++i)
          {
             iList[i].onload=function(){
                
               this.style.height=this.contentWindow.document.documentElement.scrollHeight+'px';
             }
          } 
     }());
   </script>
 </body>
</html>
阅读 12.5k
15 个回答

图片描述

兄弟这样看你看到了什么?

btn.onclick=function(){
        alert('你居然在按钮没有被按下的时候就触发了!!!');
     }(calegeca);
     
     
var calegeca = function() {
            var iList = document.getElementsByTagName('iframe');
            for (var i = 0; i < iList.length; ++i) {
                iList[i].onload = function() {

                    this.style.height = this.contentWindow.document.documentElement.scrollHeight + 'px';
                }
            }
        }();
        

尽量使用“;”号哦;在闭包前加,效果更好哦;

;(function(){
    //calegeca
}())

iframe:这锅我不背。

[哭笑不得的表情]我觉的这题可以当做面试题来考了。看了好久。。。才懂[哭笑不得的表情]

JS 大部分时候可以省略分号,除了以 () 或 [] 等开头的五种情况的时候。

btn.onclick=function(){
    alert('你居然在按钮没有被按下的时候就触发了!!!');
 };

这里}后面缺个分号,你竟然想让iframe背锅

所以 js 分号还是加的好。。。

看了 评论 我才看明白 问题 。。。。。

我还以为有黑科技。。

onclick方法后面没加分号。。。恰好后面跟了个自执行函数。。。

  1. 函数声明不可以直接用()调用,函数表达式可以直接用()调用。

  2. “函数声明” 与 “函数表达式” 之间的区别就是 function 是不是那一行的句首的第一个单词。

  3. 函数声明 可以在声明所在的作用域中被调用, 函数表达式 只能在函数表达式中调用自己。

函数声明

function foo(){console.log(1)};
foo(); //=> 1 

函数表达式

var a = function bar(){}();
!function baz(){}();
(function baa(){}());

(function draw(){
    requestAnimationFrame(draw);
})();

draw(); //=> ReferenceError: draw is not defined

参考1

好吧,我没看出来!

新手上路,请多包涵

吓到我了……

;(function(){
    
})()

对比

;(function(){
    
}())

对比

;function(){
    
}()

同意楼上把这题作为面试题,在感受到js这门缺个分号就能把函数定义变成IIFE的语言的威力之后,新手再也不会忘记加分号了哈(不用分号的大神请无视)

推荐问题
宣传栏