【问题标题】:Add onclick handler to hyperlink tag to trigger ajax?将 onclick 处理程序添加到超链接标签以触发 ajax?
【发布时间】:2017-05-05 11:23:55
【问题描述】:

我想在超链接标签“a”上添加 ajax 调用,这个 ajax 只会向服务器发送一些信息,我不必得到任何回报。
我试过这样的事情:

document.querySelector("#myId").onclick = function() {
    $.ajax({
        url: 'path',
        type: 'post',
        data: {key: 'value'},
    })
    .done(function() {
        console.log("success");
    })
    .fail(function() {
        console.log("error");
    });
}

我发现,如果我的“a”标签带有类似

的 href 链接
<a href="https://www.google.com" id="myId">click</a>

我的服务器不会“获取任何信息,并且我的 ajax 失败回调函数被触发,但是如果我删除 href-link 或将其替换为 # 之类的

<a href="#" id="myId"></a>
<a id="myId"></a>

我的服务器会收到我发送的信息,当然我的成功回调函数被触发了

fail回调函数没有返回任何错误信息,只是一个简单的字error
有谁知道发生了什么以及如何更改页面并在同一次点击中发送 ajax 调用?

顺便说一句,我不喜欢在我的成功回调函数中添加类似
window.location.href = "https://www.google.com.tw" 的东西,因为在这种情况下我要维护其他人的代码,我更喜欢将我的代码附加到下面而不是修改了已经存在的,谢谢!

【问题讨论】:

  • 如果你点击一个链接,你将被重定向到另一个页面,所以没有时间做ajax。您提到的解决方案效果很好,但是如果您愿意,可以将数据传递到其他页面并在此处进行处理。但我不知道你用 ajax 做什么这么复杂来帮助你。希望你能听懂我的英语
  • 顺便说一句,如果您的链接不应该将用户重定向到另一个页面,它应该是&lt;button&gt;。除非你真的想“欺骗用户”。
  • 我想在“a”标签上添加ajax调用的原因是,我想记录使用的行为(比如他们点击了哪个链接),但我不想修改代码已经存在。所以我决定将 onclick 函数添加到“a”标签,它可以通过我的代码记录使用点击行为,也可以通过原始代码重定向用户
  • 它看起来很相似,但我猜重点是彼此有点不同?

标签: javascript html ajax hyperlink


【解决方案1】:

首先,您应该通过添加 preventDefault() 来防止默认行为(重定向):

e.preventDefault();

希望这会有所帮助。

document.querySelector("#myId").onclick = function(e) {
  e.preventDefault();
  
  $.ajax({
    url: 'api_url',
    type: 'post',
    data: {key: 'value'},
  })
  .done(function() {
    console.log("success");
  })
  .fail(function() {
    console.log("error");
  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="https://www.google.com" id="myId">click</a>

【讨论】:

  • 对不起兄弟,我想这不是我想要的,ajax 将调用另一个 url,这是我的 api,而不是超链接标签上的 href 属性值,我已经修复了访问控制通过设置chrome浏览器的一些参数来解决问题。我没有使用 e.preventDefault();但重定向仍然有效,所以我猜 onclick 函数不会覆盖它
  • 是的,我明白了,也很抱歉,但 OP 不够清楚......只是 我没有使用 e.preventDefault(); 但重定向仍然有效 所以你应该使用它以防止重定向。 (更新了我的答案)。
  • e.preventDefault(); 解决了您的问题吗?
  • 还没有,仍然得到错误返回,除了“错误”之外没有任何文本
  • 哇,对不起兄弟,我昨天把 e.preventDefault() 放错了地方!它使重定向停止,然后我可以在我的ajax之后使用window.location.href!棒极了!感谢您的帮助,对我的误解深表歉意。
猜你喜欢
  • 1970-01-01
  • 2013-08-20
  • 2013-04-23
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 2011-12-21
相关资源
最近更新 更多