event.preventDefault()不起作用

时间:2012-02-24 03:53:47

标签: javascript jquery asp.net-mvc-3 telerik-grid preventdefault

我在使用Telerik Grid的视图中有这行代码:

      columns.Bound(o => o.URI).Width(10).Sortable(false)
                .ClientTemplate("<A class='btnGrid' id=source<#= ID #> onclick=GridSelection.addItem('<#= ID #>') >Add</A>").Title("").Width(50);

GridSelection addItem和disableSelected函数的JS代码:

  GridSelection = {
      addItem: function (value) {

         var anchorOption = $("a[id=source" + value + "]");

         anchorOption.click(function (e) { // variable name changed from "event"
               e.preventDefault();
               return false;    // as suggested by mr. Hamdi
               });

         anchorOption.fadeTo("slow", .5);

         GridSelection.disableSelected(anchorOption, true);

         var data = $("#GridSource").data('tGrid').data;
         var selectedObject;
         for (var item in data) {
            if (data[item].ID == value) {
               selectedObject = data[item];
               break;
            }
         }

          var grid = $("#GridSelected").data('tGrid');
          var newData = $("#GridSelected").data('tGrid').dataSource._data;
          newData.push(selectedObject);
          grid.dataBind(newData);
          grid.sort("");
          anchorOption.fadeTo("slow", .5);
      },

      disableSelected: function (element, disable) {
              //false on IEs 6, 7 and 8
              if (!$.support.leadingWhitespace) {
                  if (disable) {
                      $(element).attr('disabled', 'disabled');
                  } else {
                      $(element).removeAttr('disabled');
                  }
              }
     },
         // other GridSelection subfunctions here...

当我在IE中运行MVC3网络应用程序时,由于GridSelection.disableSelected功能,它运行良好,但在 Chrome Mozilla Firefox 中,{{1} }不起作用。即使用户已将数据项添加到那里,锚链接仍会添加数据项。

event.preventDefault();函数中使用preventDefault方法是否可以阻止?

GridSelection.addItem阻止了哪个属性,是 href 还是 onclick

这有什么问题? 我该如何解决这个错误? 有谁可以提供帮助?

4 个答案:

答案 0 :(得分:4)

您的链接的标记有一个内联点击处理程序,没有href

<A class='btnGrid' id=source<#= ID #> onclick=GridSelection.verify('<#= ID #>') >Add</A>

如果是您要阻止的GridSelection.verify(),请注意:

  1. 在你的其他事件处理程序之前,内联点击处理程序可能被称为,这意味着从其他处理程序取消它是为时已晚,无论如何
  2. e.preventDefault()不会阻止其他处理程序运行,它会停止事件的默认操作,链接将导航到href属性中指定的网址。而且您没有指定href
  3. 如果你想在同一个元素上为同一个事件设置多个处理程序,你应该按照希望它们被称为的顺序用jQuery 分配它们,然后使用{{3}在其中一个处理程序中,如果你想阻止其余的处理程序运行。

    我不知道如果你没有展示你想要防止的部分代码,你在所展示的代码中是如何适应的,但一般原则是:

    <a id="myLink" href="someURL">My link</a>
    
    <script>
    $("#myLink").click(function(e) {
        // some processing
        if (someCondition)
           e.stopImmediatePropagation();
        // some other processing
    });
    
    $("#myLink").click(function(e) {
        // some processing
    });
    </script>
    

    说了这么多,如果.verify()函数调用了您的.addItem()函数,并且您打算阻止 future 点击事件来处理同一个链接,因为第一个点击应验证/添加,然后您不希望再次添加,然后在您的.addItem()函数中执行以下操作:

    anchorOption.removeAttr("onclick");
    // or
    anchorOption[0].onclick = null;
    

答案 1 :(得分:2)

您是否尝试过添加return false;而不是event.preventDefault();

答案 2 :(得分:1)

如果锚具有id,则使用id选择器而不是将其用作属性选择器。

更改

$("a[id=source" + value + "]")

$("#source" + value)

我不是说这是问题,但您可以尝试更改此问题。

<强>更新

event.preventDefault()停止浏览器按照设置为锚元素的href属性的链接。它不会阻止或停止click事件。

答案 3 :(得分:1)

您是否尝试重命名事件变量?叫我疯了,但我似乎记得有问题只是尝试function(e) {e.preventDefault();},看看会发生什么