【问题标题】:AJAX call is not working because it proceeds to go to the linkAJAX 调用不起作用,因为它继续转到链接
【发布时间】:2015-02-16 16:11:23
【问题描述】:

我有一个从数据库动态生成的PDF 链接列表。我想要一个日志来跟踪下载每个用户的用户。

这似乎不起作用,因为单击链接后,它没有时间在重定向之前执行ajax

这里是javascript:

function insertlog(linkName)
{
    $.post( "insertlog.php", { linkName: linkName, user: "<?=$username?>" } );
}

这里是链接:

 <a href="http://www.test.com/media/pdf/test.pdf" onclick="insertlog('test.pdf')">test.pdf</a>

【问题讨论】:

  • 所以仅在 AJAX 调用完成后重定向。
  • 你能提供更多的上下文吗?我猜问题是您没有阻止默认链接导航行为。
  • 如何确保重定向仅在 AJAX 调用发生后发生,或者使用 promise 进行环绕,以便您的日志和跟踪功能也记录 AJAX 调用的成功和失败?
  • 是的,它必须在 ajax 调用完成后重定向。你是怎么做到的?
  • 如果您从insertLog 中选择return false,它不会重定向到作为href 值的URL。如何/何时将它们带到那里取决于您。

标签: javascript jquery ajax


【解决方案1】:

试试这个:

<script>                    
function logAndGo(target)
{
    $.post( "insertlog.php", { linkName: target, user: "<?=$username?>" } )
        .then(function(url) {
            window.location = url;
        });
}
</script>

让服务器返回正确的 URL 作为对日志 POST 的响应。然后把链接改成:

<a href="#" onclick="insertlog('test.pdf')">test.pdf</a>

@dave 提出的更好的选择是:创建一个处理重定向的服务器端页面,这样您就可以执行以下操作:

<a href="getFile.php?id=1234">test.pdf</a>

通过在服务器端处理它,您可以更多地控制日志记录、重定向到哪个 URL 等等。

【讨论】:

  • 为什么首先使用a 元素呢?如果您不想使用链接,请不要链接。
  • 在 insertlog.php 中返回 URL 会是什么样子?我有点困惑如何将 url 变量发送到 .then(function(url)
  • @dave:糟糕,在发布我的答案之前,我实际上并没有阅读您的答案。对不起;归功于你。
  • @AaronBucky 在 PHP 端只是 echo。有关示例,请参阅this answer
【解决方案2】:

我认为您想要做的最好的解决方案是链接到 pdf,而不是直接链接到您的 ajax 脚本调用的站点并将实际请求的源作为参数传递。

然后您可以在您的脚本中进行日志记录并重定向到实际源(或让脚本只返回实际源)。

这还允许您跟踪阻止 Javascript 的用户。它不需要两个请求。并且不需要您维护不必要的 Javascript 代码。

【讨论】:

    【解决方案3】:

    重定向到$.postcallback

    <script>                    
    function logAndGo(target)
    {
        $.post( "insertlog.php", { linkName: target, user: "<?=$username?>" }, fucntion(){
                window.location = 'http://www.test.com/media/pdf/' + target;
              });
    }
    </script>
    

    【讨论】:

      【解决方案4】:

      感谢大家的帮助。我接受了 Nate 的建议,这是最终的解决方案:

      function insertlog(linkName)
      {
      $.post( "insertlog.php", { linkName: linkName, user: "<?=$username?>" }, 
         function(linkName) {
              window.location = "http://www.test.com/media/pdf/"+linkName;
          });
      }
      

      然后在我的 insertlog.php 的末尾添加一个回显,并带有 PDF 文件名。

      我的链接是这样的:

       <a onclick="insertlog('1104.pdf')" href="#">1104.pdf</a>  
      

      【讨论】:

      • 仅供参考:这有点混淆了。如果您将1104.pdf 作为参数传递给insertLog(),则不需要从您的PHP 脚本中返回它(除非出于某种原因需要更改)。如果您只想等到请求完成,您不必返回除“好”标志之外的任何内容,然后设置 window.location,因为 linkName 已经存在于函数的范围内。
      猜你喜欢
      • 2016-05-02
      • 2018-07-05
      • 2010-09-30
      • 1970-01-01
      • 2013-05-06
      • 2011-08-28
      • 1970-01-01
      • 2018-09-12
      • 2018-12-24
      相关资源
      最近更新 更多