5

我正在尝试编写一种方法来捕获用户对站点菜单的点击,但我希望该过程对用户保持沉默,主要是当用户将鼠标悬停在锚标记上时,它会正常运行(显示链接它包含)。我已经尝试了各种方法来做到这一点,我现在几乎可以工作了,我的代码如下:

<div class="selectNode" id="selectNode_1" style="color: rgb(229, 229, 229); background-color: rgb(47, 47, 47); ">
  <a href="http://www.google.com" class="selectAnchor" style="color: rgb(229, 229, 229); ">
    Google
  </a>
  <img class="childImage" src="icon.png">
</div>

在 jQuery 中,我有:

$(".selectAnchor, .menuAnchor").click(function(event){
    event.stopPropagation();
    console.log(event.target.nodeName);
    //event.preventDefault();

    $.ajax({
      type: 'POST',
      url: 'http://localsite/menuRedirect.php',
      data: {id:0, module:'Module',source:'Source'},
      complete: function(data){
        console.log("DONE");
        return true;
      }
    });
});

链接重定向到所选页面,但 ajax 代码永远不会完成,因此永远不会注册用户的点击。

我尝试使用 event.preventDefault,但无法恢复已取消的事件。

部分问题来自额外的功能,例如,大多数用户右键单击锚标记以在新选项卡中打开(或使用控制+单击或中间单击),并使用类似

<a href="javascript:saveClick(o)">Google</a>

不允许在网站上使用(出于安全原因)。

任何建议如何做到这一点?

4

3 回答 3

14

使用event.preventDefault,然后在成功时使用location.href = self.href

$(".selectAnchor, .menuAnchor").click(function(event){
    event.preventDefault();
    console.log(event.target.nodeName);
    var self = this;

    $.ajax({
      type: 'POST',
      url: 'http://localsite/menuRedirect.php',
      data: {id:0, module:'Module',source:'Source'},
      complete: function(data){
        console.log("DONE");
        location.href = self.href;
      }
    });
});

或者使用 context 属性来移除var self = this

$(".selectAnchor, .menuAnchor").click(function(event){
    event.preventDefault();
    console.log(event.target.nodeName);

    $.ajax({
      type: 'POST',
      context: this,
      url: 'http://localsite/menuRedirect.php',
      data: {id:0, module:'Module',source:'Source'},
      complete: function(data){
        console.log("DONE");
        location.href = this.href;
      }
    });
});
于 2012-09-19T18:31:50.840 回答
1

最新的 chrome 浏览器不会完成 ajax 请求。由于浏览器页面从用户那里得到了新的 url 请求,所以浏览器会立即终止线程。

98% 的情况下,您可以看到 ajax 请求在网络选项卡中被取消。

所以解决方案是使用 sendBeacon API。这将异步执行 POST 请求。Google 分析使用此代码执行事件跟踪(例如:点击)。
https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon

 navigator.sendBeacon("{{url}}", param);
于 2019-06-20T09:21:05.650 回答
0

尝试这个

<div class="selectNode" id="selectNode_1" style="color: rgb(229, 229, 229); background-color: rgb(47, 47, 47); ">
  <a href="#" class="selectAnchor" style="color: rgb(229, 229, 229); ">
    Google
  </a>
  <img class="childImage" src="icon.png">
</div>

然后在jquery中:

$(".selectAnchor, .menuAnchor").click(function(event){
    event.preventDefault();
    console.log(event.target.nodeName);
    //event.preventDefault();

    $.ajax({
      type: 'POST',
      url: 'http://localsite/menuRedirect.php',
      data: {id:0, module:'Module',source:'Source'},
      complete: function(data){
        console.log("DONE");
        window.location = "http://www.google.com"
      }
    });
});
于 2012-09-19T18:31:41.143 回答