如何记录超链接点击?

5

我有一个超链接需要在被点击时进行日志记录。

我创建了一个小型原型,通过创建新的MVC 2 Web应用程序项目可以重复出现该问题。

添加

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

添加到 Site.Master 文件中。

public ActionResult LogSomething()
{
    string doNothing = DateTime.Now.ToString();
    return new EmptyResult();
}

请打开HomeController.cs文件

并且

<p>
    <a id="lnkTestPost" href="/home/about">Test Post</a>

    <script type="text/javascript">
        $("#lnkTestPost").click(function() {
            $.post("/home/LogSomething");
        });
    </script>
</p>

在Home/Index.aspx页面中。

在HomeController的LogSomething()操作方法中设置断点。

但是当我运行它时,有时会触发断点,有时不会。

我认为它没有被触发是因为实际链接将浏览器发送到另一个页面,但是在链接被触发之前,提交不应该已经完成吗?

有没有办法确保日志记录代码已经被触发?

请注意:在链接目标中添加日志功能不是一个选项。

编辑:原始超链接实际上是针对用户PC上安装的应用程序的自定义协议。因此,链接指向类似于“myapp:myArgs”的内容。我没有提及这一点是为了保持简单,不幸的是,由于没有答案真正适用于我,现在我认为有必要提及它。

5个回答

12

如果是我做的话,我可能会像Google一样设置一个记录并重定向的URL。例如:

<a href="/home/about">stuff</a>
<script>
    $("a:href").each(function(){
        this.attr("href", "/log?url=" + encodeURIComponent(this.attr("href")));
    });
</script>

然后/log处理程序会执行以下操作:

def log(request):
    target_url = request.GET["url"]
    log_link(target_url)
    return HttpRedirect(target_url)

您需要考虑一下如何处理外部链接(例如,您想如何处理http://example.com/log?url=http://evil.com/)... 但这是可以解决的问题。

此外,如果你能在链接被点击时交换URL(这就是Google在其搜索结果中所做的),那么鼠标悬停时预览的链接将会更正确。


而为了更加恶劣:var oldUrl = this.attr("href"), self = this; setTimeout(function(){ self.attr("href", oldUrl) }, 10) - David Wolever
哈哈,我喜欢你编写 Django 风格的视图函数,尽管它被标记为 .net MVC。 - mpen
是的...我实际上对.NET(更不用说.NET-MVC)一无所知 :P - David Wolever

3

或者,您可以像Google Reader一样,在每个链接中添加“来自url”:

<script>
$("a:href").each(function(){
    this.attr("href", this.attr("href") + "?from=" + encodeURIComponent(window.location));
    // (note: this exact code won't handle links which already have GET vars…)
});
</script>

接下来使用一些中间件来记录入站请求中的“来源”。

这种方法的缺点是无法记录跳转到另一个域名的点击……但这可能没问题。


1

我认为浏览器在记录点击之前可以轻松地导航到URL。怎么样:

<p>
    <a id="lnkTestPost" href="#">Test Post</a>

    <script type="text/javascript">
        $("#lnkTestPost").click(function() {
            $.post("/home/LogSomething", function(data) {
              // only tell the browse to navigate away once its logged
              window.location = '/home/about';
            });
        });
    </script>
</p>

1
此外,这将与例如“在新标签页中打开”等功能产生严重的错误。 - David Wolever
@John,它为什么不总是有效?它不会像你的代码一样遇到时间问题。 - waterlooalex

0
我看到许多网站,包括谷歌在内,使用的一种方法是设置一个“重定向”页面或控制器,使所有链接都通过该页面/控制器,您可以记录它,然后从那里将其重定向。

0
如何在每个页面上添加一个可选的“日志”参数,作为链接的一部分,这样您就不必使用任何JavaScript了?当然,每个页面都可以记录来自引用页面的某些信息,但它不应该关心这些信息,因为您可以让它将日志参数中的任何内容传递给日志记录基础设施并继续执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接