Joh*_*yre 5 javascript asp.net-mvc jquery
我有一个超链接,我点击它时需要记录.
我创建了一个小型原型,通过创建一个新的MVC 2 Web应用程序项目可以重复该问题.
加
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
到Site.Master文件.
和
public ActionResult LogSomething()
{
string doNothing = DateTime.Now.ToString();
return new EmptyResult();
}
Run Code Online (Sandbox Code Playgroud)
到HomeController.cs文件
和
<p>
<a id="lnkTestPost" href="/home/about">Test Post</a>
<script type="text/javascript">
$("#lnkTestPost").click(function() {
$.post("/home/LogSomething");
});
</script>
</p>
Run Code Online (Sandbox Code Playgroud)
在Home/Index.aspx
在HomeController的LogSomething()操作方法中放置一个断点.
但是当我运行它时,有时断点被击中,有时则不然.
我假设由于实际链接将浏览器发送到另一个页面而没有被击中,但是在链接被触发之前不应该发布帖子?
无论如何我可以确保触发日志代码吗?
请注意; 在链接目标中添加日志记录功能不是一种选择.
编辑:原始超链接实际上是用户PC上安装的应用程序的自定义协议.所以这个链接就像"myapp:myArgs".不幸的是,为了简单起见,我没有提到这一点,因为没有一个答案真的适用于我,我现在认为有必要提一下.
Dav*_*ver 11
如果我这样做,我可能会做什么,例如,Google会做什么并设置一个记录然后重定向的URL.例如:
<a href="/home/about">stuff</a>
<script>
$("a:href").each(function(){
this.attr("href", "/log?url=" + encodeURIComponent(this.attr("href")));
});
</script>
Run Code Online (Sandbox Code Playgroud)
然后/log处理程序将执行以下操作:
def log(request):
target_url = request.GET["url"]
log_link(target_url)
return HttpRedirect(target_url)
Run Code Online (Sandbox Code Playgroud)
你需要考虑处理外部链接(例如,你想如何处理http://example.com/log?url=http://evil.com/)......但这是一个可解决的问题.
此外,对于奖励积分,您可以在点击链接时交换URL(这是Google在搜索结果中执行的操作),因此鼠标悬停链接预览看起来正确.
我认为浏览器可以在记录点击之前轻松导航到 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>
Run Code Online (Sandbox Code Playgroud)