js的构造函数

        var btn=document.querySelector('button');
        function Mask() {
            this.mask=null
            this.createMask=function(){
                var html="";
                    html='<div class="mask"></div>';
                    document.body.innerHTML+=html;
                    // this.mask=document.querySelector('.mask');
            };
        }
        var obj=new Mask();
        btn.onclick=function(){
            console.log('a')
            obj.createMask();
            
        }

为什么只有第一次点击会执行函数。第二次点击连console.log()也不打印了。。麻烦知道的给回答下。。蟹蟹

阅读 3.7k
6 个回答

你得改改:

var btn = document.querySelector('button');
function Mask() {
    this.mask = null
    this.createMask = function() {
        var mask = document.createElement('div');
        mask.className = 'mask';
        document.body.appendChild(mask);
    };
}
var obj = new Mask();
btn.onclick = function() {
    console.log('a')
    obj.createMask();
};

现在试试看

为了方便理解,我把代码写了一下

楼上说的都对,原理参考一楼,解决方案参考二楼.

var btn=document.querySelector('button');
    function Mask() {
        this.mask=null
        this.createMask=function(){
            var html="";
                html='<div class="mask"></div>';
                document.body.innerHTML+=html;
                   
                // 每一次改变innerHTML之后,都需要重新获取
                btn=document.querySelector('button');    
                btn.onclick=function(){
                    console.log('a')
                    obj.createMask();
                    
                }
        };
    }
    var obj=new Mask();
    btn.onclick=function(){
        console.log('a')
        obj.createMask();
        
    }

mask可以全局就用一个,没必要每次 innerHTML+= 或者 body.appendChild

试试把
btn = document.querySelector('button');放到点击事件函数里
btn.onclick=function(){
btn = document.querySelector('button');
console.log('a');
obj.createMask();
}

把onclick函数写进html元素里就可以了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题