javascript - JQuery 条件 PreventDefault() 在未调用时触发

标签 javascript jquery ajax loops preventdefault

我编写了以下脚本。

  <script>
    $(document).ready(function(){
      $('a').data('loop',true);
      $('body').on('click', 'a', function(event){
        console.log($(this).data('loop'));
        if ($(this).data('loop') == 'true') {
          console.log('hit');
          event.preventDefault();
          caller = $(this);
          $(this).data('loop',false);
          var linkref = $(this).attr('href');
          var linkpos = $(this).offset();
          var screenwidth = $(window).width();
          var json_data = JSON.stringify({linkref: linkref, linkpos: linkpos, screenwidth: screenwidth});
          $.ajax({
            url: "content/submitcontenthandler?handler=core/_dashboard&method=tracking_ping",
            method: "POST",
            data: "json=" + json_data,
            complete: function (jqXHR, status) {
              console.log(status);
              console.log(caller);
              $(caller).click();
            }
          });
        } else {
          console.log(event.isDefaultPrevented());
          console.log('miss');
          $(this).data('loop',true);
        } 
      });
    });
  </script>

它有效,向我发送我想要的详细信息等等。但是!!!

当我单击一个链接时,它会通过 Ajax 向我发送详细信息,然后它意味着再次“单击”该事件,它确实做到了!但该事件不会触发它的正常操作。因此,当单击另一个页面的链接时,我会转到另一个页面...但这种情况并没有发生。

如果我注释掉 event.preventDefault(); 行然后事件按照我的预期触发...

所以对我来说,看起来 event.preventDefault 正在执行,即使它不应该在第二次调用期间执行......

抱歉,如果这有点难以理解。我自己也不太明白发生了什么事。 这可能是一个错误,还是我做了什么导致了这个问题?

我不认为我可以,但我已经成功地为此制作了一个jsfiddle。 https://jsfiddle.net/atg5m6ym/2001/

最佳答案

您可以尝试这个,不再担心“循环”:

$(document).ready(function () {
    $('body').on('click', 'a', function (event) {
        event.preventDefault();
        var caller = $(this);
        var linkref = $(this).attr('href');
        var linkpos = $(this).offset();
        var screenwidth = $(window).width();
        var json_data = JSON.stringify({linkref: linkref, linkpos: linkpos, screenwidth: screenwidth});
        $.ajax({
            url: "content/submitcontenthandler?handler=core/_dashboard&method=tracking_ping",
            method: "POST",
            data: "json=" + json_data,
            complete: function (jqXHR, status) {
                console.log(status);
                console.log(caller);
                window.location.href = linkref; // Redirect happens here
            }
        });

    });
});

更新

这里有几个问题需要注意:

1)某些链接不需要重定向(如上所述,控制显示/隐藏或在文档 anchor 内控制的引导模型链接

要纠正这个问题实际上取决于具体情况。通常 Bootstrap 会向链接添加特定的类或数据属性,以便您可以执行类似的操作。

$('body').on('click', 'a:not(list of things to exclude)'..

就我个人而言,我会将我想要跟踪的链接定义为:

<a href=<link> data-tracked='true'...

<script> 
      $('body').on("click","a[data-tracked='true']"...

或者,如果您想跟踪大多数链接(但有一些异常(exception)),您可以:

     <a href=<link> data-tracked='false'...
     <script> 
          $('body').on("click","a:not([data-tracked='false'])"...

或者更一般地说:

 <script> 
      $('body').on("click","a", function () {
            if ($(this).attr("data-tracked") == "false" || <you can check more things here>){ 
                  return true; //Click passes through
             } 
             //Rest of the tracking code here
      });

关于javascript - JQuery 条件 PreventDefault() 在未调用时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36151282/

相关文章:

javascript - Node : allow event loop in long task with return

javascript - 停止监听或删除 Image() 对象 onload 事件的事件

javascript - 使用moment.js转换时间(HH :mm:ss) to (HH:mm)

javascript - jQuery DataTable 日期范围搜索

ajax - 这个 session / token 身份验证系统对我的 Web api 有意义吗?

javascript - 向 Rails Controller 指示哪个 View 调用了操作

javascript - HighCharts x轴和y轴标签居中对齐

javascript - 动态添加行到日期数组

javascript - 在工具提示中显示月份名称

javascript - 使用 ajax/js 隐藏 TR