【问题标题】:window.location change fails AJAX callwindow.location 更改失败 AJAX 调用
【发布时间】:2010-02-12 15:34:39
【问题描述】:

我有一个点击跟踪 AJAX 函数(在 .aspx 页面上调用 WebMethod),我需要在用户点击链接时调用它。

不幸的是,我正在使用window.location = "newUrl" 更改页面,这似乎使AJAX 调用失败。有没有办法解决这个问题?

我不需要从 AJAX 调用中获取任何信息,我只需要确保调用了 WebMethod

我知道我可以重定向 success()failure() 调用,但是我必须等待 clickTracking() 方法运行,这需要 ~ 1s。这是项目规范中的协议不可接受的,因此不是可行的解决方案。

【问题讨论】:

  • @Ed:你的用户真的会对你的主机有大约 1 秒的延迟吗?这可能是一个非常保守的估计。我的目标是 100 毫秒。
  • @Daniel 我们同意在大多数页面上大约 1 秒完成周转,实际上他们期望更低,并且 trackclick 方法做了一些令人惊讶的耗时的事情(这可能会在以后简化)。可以说,等待方法完成不是一个可行的选择,因此首先使用 AJAX。

标签: asp.net javascript jquery ajax pagemethods


【解决方案1】:

您为什么不直接将用户发送到记录点击的 ASPX 页面,然后发送 location 标头以重定向到新的 url,而不是使用 AJAX?例如,点击链接时,会发生以下情况:

window.location = "/redirect.aspx?track=true&url=" + encodeURIComponent(newUrl);

redirect.aspx 然后将处理跟踪和重定向到新 URL。这几乎是您在发送用户之前无需等待 AJAX 请求完成的唯一方法。

另请参阅:Redirecting Users to Another Page (MSDN)

可能值得注意的是,您每天都会在许多网站上看到这种方法。最常见的是,它们出现在广告中。 AdSense 广告链接如下所示:

http://www.google.com/aclk
    ?sa=L&ai=C6DnFKnl1S5zhKoSBjAeqyKzKBPOD_2ehlIXfD9WsvQsQAVDQzK______
    8BYLvOuYPQCsgBAaoEGU_Q8k4OJin9jMDXAD6KQ_2Dsv7xyokLxRY
    &num=1&ggladgrp=13269254452699041863&gglcreat=8511532373602616220
    &sig=AGiWqtwzFm2sTimBuQpkD5kazyRNkkqH3w
    &q=http://www.amazon.co.uk/s/%3Fie%3DUTF8%26keywords%3Dhello%2Bworld

ish,无论如何(我把它打倒了一点)。当您点击它时,您会到达http://www.google.com/aclk,它会在跟踪点击后将您重定向到最终站点。

【讨论】:

  • 仍然没有完全异步,所以我必须等待点击方法完成,这会弄乱加载时间。
  • @Ed Woodcock:我认为在不打开新窗口的情况下执行此异步操作是不可能的。一旦您离开该页面,任何当前请求都将被取消。最好的解决方案 IMO 是大多数网站使用的yourpage.aspx -> redirect.aspx -> result url
  • 是的,我以前用过它,这不是一个糟糕的解决方案,但是我希望有某种神奇的一次性解决方案。考虑到数据挖掘作为商业营销选择的重要性,您认为现在应该会有。
【解决方案2】:

我只需要确保 WebMethod 被调用。

如果以上内容真的很重要,您可以执行以下操作:

function onLinkClicked() {
    $.ajax({
        url: 'WebMethod.aspx',
        success: function(data) {
            window.location = "newUrl";
        }
    });
}

页面重定向时会有一些延迟。这可能是可接受的,也可能是不可接受的,具体取决于您的应用程序以及从用户到主机的平均延迟。


编辑:

关于下面的新评论,不幸的是,window.location 更改将中断您的 AJAX 请求。

对于内部链接:您可能希望在用户登陆新页面时立即跟踪您的链接,而不是在他们点击超链接时。

对于外部链接:我会使用服务器端重定向方法,如Andy E suggested in another answer

【讨论】:

  • 咳咳。我将用这个来编辑问题:1 秒以上的页面重定向时间是不可接受的!
  • “确保它被调用”的意思是确保调用通过网络方法,而不是等待它返回。
  • @Ed:不幸的是,你永远无法确定它是否通过了,除非你等待它的回归 :)
  • @Daniel 是的,但这不是关键业务,所以如果有些人迷路了,这不是问题。至于跟踪,我们跟踪查看、点击、弹出和点击(以及其他一些)。我们的客户喜欢数据挖掘,他们在零售行业!
  • @Ed:我也很好奇其他解决方案,但我敢打赌,Andy E 的解决方案最终会是最合理的。
【解决方案3】:

使用<iframe> 包装器来包装您的页面。然后,当您有 AJAX 请求时,将请求传递给包装器并在 <iframe> 上导航。这样做将使您能够在保持应用响应能力的同时拥有完美的异步请求。

当然,您也不会更改地址栏并有效地扼杀您的 SEO,但这是架构糟糕的权衡。您的点击跟踪功能大约需要一秒钟的事实简直令人震惊。也许您应该在服务器上的异步线程上启动它,然后使用单独的线程 (System.Threading) 将数据提供给客户端。这将缓解您遇到的问题。

否则,您可以有异步可靠“不一起破解”。选择任意两个。

编辑

我的错,您也可以将 AJAX 请求作为弹出窗口运行:

window.open(url,'ajax','height=0,width=0');

这仍然不是一个好主意,但它会起作用。

【讨论】:

  • 我不确定我是否能忍受将整个网站包裹在 iFrame 中,那些东西是邪恶的。此外,出于 SEO 目的,Google 讨厌它们。
  • @Ed 好吧,你真的别无选择。就像我说的,你可以有三个选择中的任何两个。我认为这是一个处理后端代码的机会,而不是一个将前端代码组合在一起的机会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2012-01-30
  • 2015-07-23
相关资源
最近更新 更多