Javascript 暂时禁用所有onclick事件并将其绑定回

Javascript 暂时禁用所有onclick事件并将其绑定回,javascript,jquery,cross-browser,bookmarklet,Javascript,Jquery,Cross Browser,Bookmarklet,如何禁用页面上的所有onclick事件,绑定我的自定义函数,并在执行后启用所有以前的事件 我正在构建一个bookmarklet,它应该可以在任何已经加载的页面上工作,并且我正在使用jQuery来处理我的自定义逻辑——页面在加载后被jQuery化。请注意,我无法控制绑定哪些事件以及何时绑定 目前,我找到的最稳定的解决方案是取消绑定事件,通过自定义函数绑定以防止默认操作,然后重新加载页面。这是可行的,但是我想避免重新加载。部分解决方法是重新加载页面并滚动到上一个位置如何实现此效果?。一些可能的解决方

如何禁用页面上的所有onclick事件,绑定我的自定义函数,并在执行后启用所有以前的事件

我正在构建一个bookmarklet,它应该可以在任何已经加载的页面上工作,并且我正在使用jQuery来处理我的自定义逻辑——页面在加载后被jQuery化。请注意,我无法控制绑定哪些事件以及何时绑定


目前,我找到的最稳定的解决方案是取消绑定事件,通过自定义函数绑定以防止默认操作,然后重新加载页面。这是可行的,但是我想避免重新加载。部分解决方法是重新加载页面并滚动到上一个位置如何实现此效果?。一些可能的解决方案可能会使用iframe,但我更愿意避免这种情况。

在所有组件上放置div元素更容易。。。差不多

CSS

jQuery


我看到过一个很好的方法,我自己也做过,就是使用一个模态“mask”覆盖

覆盖整个页面的灰显透明遮罩,与之交互的元素除外,例如模式弹出窗口


还有一种方法是使用。

可以将onclick重新分配给另一个属性,而不是重写它

带有一个元素的示例

var btn = document.getElementById("button");
btn._onclick = btn.onclick;
btn.onclick = function(){ return false; };
当您想要将其传输回原始事件时

var btn = document.getElementById("button");
if (btn._onclick) {
    btn.onclick = btn._onclick;
    btn._onclick = null;
}

这取决于onclick事件是否依赖于被单击的元素,即是否需要知道单击了哪个元素:

如果它是独立的,那么您可以只向body元素或其他父元素添加一个事件处理程序,因为首先调用父事件,然后调用子事件,这就是您想要的:

$('body').click(function() { /* your code here */});
它取决于元素的属性,然后您可以访问先前的onclick事件代码,该代码已注册到正在被单击的元素的“click”属性中,因此类似这样的内容可能对选择器更为具体:

$('body *').each(function() {
  var previousClick = this.click;
  this.click = null; // remove previous
  $(this).click(function() { /* your code here */});
  $(this).click(function() { previousClick();}); // run the code that was already there.
})

我的回答有些问题。 其思想是用透明元素覆盖链接。您可以使用伪元素,例如:after

要防止tab键集tabindex:


当用户在页面上单击时会发生什么?您仍然可以通过键盘导航单击元素;显示你当前的功能。这不起作用,你能检查你的答案并修复它吗?
$('body').click(function() { /* your code here */});
$('body *').each(function() {
  var previousClick = this.click;
  this.click = null; // remove previous
  $(this).click(function() { /* your code here */});
  $(this).click(function() { previousClick();}); // run the code that was already there.
})