为什么点击事件没有在相关的javascript中注册?

时间:2013-10-09 20:14:30

标签: javascript asp.net-mvc

当我点击页面中的链接时,它并不总是在javascript中注册。这是一个MVC解决方案,这是封装在Site.Master页面中的视图之一。

这是第一个例子。 页面:(someView.aspx)

<%: Html.ActionLink("Add", "AgentNotesCreate", "AgentNotes", new { id = Model.AgentId }, new { @class="addLink"} )%>

(渲染链接)

<a class="addLink" href="/AgentNotes/AgentNotesCreate/152">Add</a>

使用Javascript:

$(function () {
$(document).on("click", "a.addLink", function () {
    var newHref = $(this).attr("href");

    if (newHref.split("?").length > 1) {
        // There's already a query string attached - we're adding our own on top.
        newHref += "&returnToken=" + $("#page_redirect_token").val();
    }
    else {
        // We're adding the only querystring parameter
        newHref += "?returnToken=" + $("#page_redirect_token").val();
    }

    $(this).attr("href", newHref);
});

});

然而,第二个也引用上面相同的javascript的例子不起作用 - 它转到$(document)...行然后跳过整个函数,所以没有returnToken被添加到URL。

第二个例子:( someSecondView.aspx)

<%:Html.ActionLink("Add", "EMDProductShelfCreate", "EMDProductShelf", new{id = Model.PersonId}, new{@class="addLink"} ) %>

(渲染链接)

<a class="addLink" href="/EMDProductShelf/EMDProductShelfCreate/45">Add</a>

1 个答案:

答案 0 :(得分:1)

正如您最初编写的问题,您的第一个渲染链接示例:

<a href='#' class="deleteAgentNotes">Delete</a>

与事件处理程序中的选择器"a.addLink"不匹配:

$(document).on("click", "a.addLink", function () {

因此,当您单击该呈现的链接时,它与事件处理程序不匹配,因此没有任何反应。如果这是你想要这行代码的渲染链接,那么它应该是这样的:

$(document).on("click", ".deleteAgentNotes", function () {

此外,由于我发现您正在更改点击链接上的href,您应该意识到委托事件处理程序在实际链接上处理点击后运行,因此链接中的href将会首先执行操作,如果将浏览器带到新页面,则委派的事件处理程序甚至不会有机会运行。因此,基本上不可能使用委托事件处理来覆盖链接的行为,因为默认行为已经发生在委托事件处理程序获取事件之前。如果您希望链接具有的ONLY行为是通过委派的事件处理程序,那么您可能希望将<a>标记更改为<span>,因此没有对单击处理程序的默认处理,然后处理完全点击您的事件处理程序。如果您希望在单击时将用户带到新页面,则只需在事件处理程序中执行window.location = "your url"。没有要求使用链接。