Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jQuery单击按钮后添加文档单击侦听器_Jquery - Fatal编程技术网

使用jQuery单击按钮后添加文档单击侦听器

使用jQuery单击按钮后添加文档单击侦听器,jquery,Jquery,我试图在页面上的某个按钮被单击后添加一个jQuery click监听器。单击按钮后,单击页面上的任意位置,脚本将运行。问题是处理程序在您单击按钮后立即运行,而不是等待“body”单击。代码如下: <html> <head> <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script> </head> <body> <butto

我试图在页面上的某个按钮被单击后添加一个jQuery click监听器。单击按钮后,单击页面上的任意位置,脚本将运行。问题是处理程序在您单击按钮后立即运行,而不是等待“body”单击。代码如下:

<html>
<head>
    <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
</head>

<body> 
    <button data-stat="off" onclick="handler(this);">Click here</button>

</body>
    <script>
    function handler(btn){
        if ($(btn).attr("data-stat")=="on"){
            $(btn).attr("data-stat", "off");
            console.log("A");
        }
        else {
            $(btn).attr("data-stat", "on");
            $(document).on("click", function (event) {
                console.log("body clicked!");
                $(this).unbind();
            });
        }     
    }
    </script>
</html>

点击这里
函数处理程序(btn){
如果($(btn).attr(“数据统计”)=“打开”){
$(btn).attr(“数据统计”、“关闭”);
控制台日志(“A”);
}
否则{
$(btn).attr(“数据统计”、“打开”);
$(文档)。在(“单击”)上,函数(事件){
log(“body clicked!”);
$(this.unbind();
});
}     
}

我认为应该在当前事件循环之后添加超时以附加侦听器:

function handler(btn){
    if ($(btn).attr("data-stat")=="on"){
        $(btn).attr("data-stat", "off");
        console.log("A");
    }
    else {
        $(btn).attr("data-stat", "on");

        // add after 1 ms
        setTimeout(function() {
            $(document).on("click", function (event) {
                console.log("body clicked!");
                $(this).unbind();
            });
        }, 1);
    }     
}

事件在DOM中冒泡,因此当您将新事件处理程序附加到父元素时,它将立即调用。有一个名为
stopPropagation()
的方法将停止事件冒泡。只需将其添加到
处理程序()
方法中即可

<html>
<head>
    <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
</head>

<body> 
    <button data-stat="off" onclick="handler(this, event);">Click here</button>

</body>
    <script>
    function handler(btn, ev){
        ev.stopPropagation();

        if ($(btn).attr("data-stat")=="on"){
            $(btn).attr("data-stat", "off");
            console.log("A");
        }
        else {
            $(btn).attr("data-stat", "on");
            $(document).on("click", function (event) {
                console.log("body clicked!");
                $(this).unbind();
            });
        }     
    }
    </script>
</html>

点击这里
函数处理程序(btn,ev){
ev.stopPropagation();
如果($(btn).attr(“数据统计”)=“打开”){
$(btn).attr(“数据统计”、“关闭”);
控制台日志(“A”);
}
否则{
$(btn).attr(“数据统计”、“打开”);
$(文档)。在(“单击”)上,函数(事件){
log(“body clicked!”);
$(this.unbind();
});
}     
}
是否在“页面上的任何位置”中再次单击原始按钮?(关于
.unbind()
,您可以使用
.one()
而不是
.on()
,解除绑定将自动进行。)