Javascript 在准备就绪之前防止任何咔哒声

Javascript 在准备就绪之前防止任何咔哒声,javascript,jquery,events,Javascript,Jquery,Events,在设置标志之前,我需要禁用网页上的任何活动。让我们忽略该标志,并说我只想永远禁用页面上的任何单击。我认为这很简单: $(window).click(function(e) { e.preventDefault(); }); 鉴于上述情况,我仍然可以点击链接 如何通过仅返回false来呈现所有单击无效? $("*").on("click",function(e) { e.preventDefault(); return false }); 或 这两种方法都会停止向其父元素的传播

在设置标志之前,我需要禁用网页上的任何活动。让我们忽略该标志,并说我只想永远禁用页面上的任何单击。我认为这很简单:

$(window).click(function(e) {
    e.preventDefault();
});
鉴于上述情况,我仍然可以点击链接


如何通过仅返回false来呈现所有单击无效?

$("*").on("click",function(e) {
    e.preventDefault();
return false
});


这两种方法都会停止向其父元素的传播,因此会阻止默认值

您不能这样继续,因为单击首先被链接捕获,然后再转发到封闭元素

最简单的解决方案是在窗口上放置一个不可见的div:

#mask {
    position: fixed;
    left:0; right:0; top:0; bottom:0;
}
正如Connor所指出的,您可能需要设置一个
z-index
(实际上它取决于页面的其余部分)

这就是我要做的:

var done = false;
$('body').on('click', '*', function(e) {
    if (!done) e.preventDefault();
}).on('load', function() {
    done = true;
});

如果需要完全停止页面上的单击,可以解除所有单击事件的绑定,如以下回答:

您可以这样调用函数:

RecursiveUnbind($(window));

我想这就是你要找的。使用名称空间,以便不撤消任何其他单击事件

注意:执行阻止操作的单击必须位于任何其他脚本标记的上方

例如:


除此之外,你可以做的另一件事是为你的身体和下面的css设置一个class
no click

body.no-click * {
    pointer-events: none;
}
要启用单击,只需从身体中删除类
no click

如果您需要支持指针事件


只是一个问题,为什么要这样做?事件传播是从父树冒泡出来的,但在这种情况下,父树是主要的window@SimoEndre:同意。忘记提到哪些元素,因此更新了答案+1
z-index
,这可能是最好的解决方案。值得思考的是:精明的用户仍然可以打开他们的web检查器并删除覆盖元素,从而允许他们与页面进行交互。但是,他们在dom就绪之前能够做到这一点的可能性很小,除非您的dom就绪事件需要一段时间。在我的情况下,他们只有600毫秒或更少的时间来打开控制台并执行此操作。即使这样,如果他们使用控制台,即使在dom就绪之后,他们仍然可以删除所有的点击处理程序@dystroy-这将要求主体已经呈现,这可能(不太可能)允许某些单击事件受到攻击。也许
#mask{display:none;}
@mayabelle解释-1?@dysoy,您将整个fiddle js设置为加载状态,即使没有,至少我无法检查clickme是否可以在请求和加载之间单击。你试过马修·福斯卡里尼的方法吗?这可以很好地工作这在jQuery应用程序的一般情况下不起作用:(在框架和扩展下的JSFIDLE左侧,你在加载之前没有运行javascript,这就是我所做的所有更改。我看到了。但是你仍然只处理一些特定的情况。看到了。我认为OP需要一个通用的解决方案。顺便说一句,我没有否决你,我不认为你的答案应该被否决。没有意识到这个问题哟你介绍了。谢谢。OP最初问他如何将此应用于a链接,以及我的解决方案地址this@dystroy,我认为你提出的这个问题已经解决了,只要你确保阻止按钮被点击的脚本在加载之前就被加载了。这对我来说是可行的,但是说它不受支持在ie10-。
RecursiveUnbind($(window));
$('*').on('click.startup', function (e) {
    e.preventDefault();
    e.stopPropagation();
    e.stopImmediatePropagation();
});

$(document).ready(function () {
    $('*').off('click.startup');
});
body.no-click * {
    pointer-events: none;
}