Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.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
Javascript 挂起jQuery中的默认事件_Javascript_Jquery - Fatal编程技术网

Javascript 挂起jQuery中的默认事件

Javascript 挂起jQuery中的默认事件,javascript,jquery,Javascript,Jquery,我试图延迟jQuery脚本中的一个或多个默认事件。上下文是,我希望在用户执行某些操作(主要是单击)几秒钟后,在触发默认操作之前,向用户显示一条消息 伪代码: -用户单击链接/按钮/元素 -用户收到一条弹出消息,说明“您将离开网站” -消息在屏幕上保留X毫秒 -触发默认操作(也可以不是href link) 到目前为止,我的尝试如下: $(document).ready(function() { var orgE = $("a").click(); $("a").click(func

我试图延迟jQuery脚本中的一个或多个默认事件。上下文是,我希望在用户执行某些操作(主要是单击)几秒钟后,在触发默认操作之前,向用户显示一条消息

伪代码: -用户单击链接/按钮/元素 -用户收到一条弹出消息,说明“您将离开网站” -消息在屏幕上保留X毫秒 -触发默认操作(也可以不是href link)

到目前为止,我的尝试如下:

$(document).ready(function() {
    var orgE = $("a").click();
    $("a").click(function(event) {
        var orgEvent = event;
        event.preventDefault();
        // Do stuff
        doStuff(this);

        setTimeout(function() {
            // Hide message
            hideMessage();
            $(this).trigger(orgEvent);
        }, 1000);
    });
});
当然,这并不像预期的那样有效,但可能会显示出我正在努力做什么

我无法使用插件,因为这是一个没有在线访问的托管环境。

有什么想法吗?

这可能有用:

$(document).ready(function() {
  $("a").click(function(event) {
    event.preventDefault();
    doStuff(this);

    setTimeout(function() {
      hideMessage();
      $(this).click();
    }, 1000);
  });
});

注意:完全未经测试

我可能会这样做

$("a").click(function(event) {
   event.preventDefault();
   doStuff(this);
   var url = $(this).attr("href");

   setTimeout(function() {
      hideMessage();
      window.location = url;
   }, 1000);
});
我不确定是否可以从定时函数内部看到
url
。如果不是,您可能需要在click处理程序外部声明它

编辑:如果需要从定时函数触发事件,可以使用类似于karim79建议的方法,不过我会做一些更改

$(document).ready(function() {
  var slept = false;
  $("a").click(function(event) {
    if(!slept) {
        event.preventDefault();
        doStuff(this);

        var $element = $(this);
        // allows us to access this object from inside the function

        setTimeout(function() {
          hideMessage();
          slept = true;
          $element.click(); //triggers the click event with slept = true
        }, 1000);
        // if we triggered the click event here, it would loop through
        // this function recursively until slept was false. we don't want that.
    } else {
        slept = false; //re-initialize
    }
  });
});

编辑:经过一些测试和研究后,我不确定是否能够触发
元素的原始单击事件。除了

之外,任何元素似乎都可以这样做。向所有要受影响的链接添加一个新类(可能具有比我选择的名称更合理的名称)。当您显示弹出窗口时,请删除该类,这样当您再次调用.click()时,您的代码将不再运行,并且将出现默认行为

$("a").addClass("fancy-schmancy-popup-thing-not-yet-shown").click(function() {
    if ($(this).hasClass("fancy-schmancy-popup-thing-not-yet-shown"))
        return true;

    doStuff();
    $(this).removeClass("fancy-schmancy-popup-thing-not-yet-shown");

    var link = this;
    setTimeout(function() {
      hideMessage();
      $(link).click().addClass("fancy-schmancy-popup-thing-not-yet-shown";
    }, 1000);

    return false;
});

可能最好的方法是使用unbind。比如:

$(document).ready(function() {
    $("a").click(function(event) {
        event.preventDefault();
        // Do stuff
        this.unbind(event).click();
    });
})

这不会再次触发相同的单击处理程序,包括
事件.preventDefault
?它不会工作,因为此上下文将是窗口,而不是锚定,需要引用锚定并在setTimeout内使用它。然而,它会导致无限循环。您需要解除click事件的绑定才能使其不运行。这种方法的问题是,我不知道原始操作是否要转到URL。它可能只是另一个javascript函数,与导航完全无关。我仍然不知道这将如何以任何方式保留原始事件。我遗漏了什么吗?稍后调用
$(link)。click()
将表现为用户刚刚单击了相关链接。当然,该click事件的事件处理程序将再次运行,但这次链接将不再承载该类,因此事件处理程序将返回true。每当事件处理程序返回true时,浏览器将继续执行与该事件相关联的其他操作,包括原始(默认)行为(例如,转到新页面);这个。点击()