event.preventDefault () не работает - PullRequest
       11

event.preventDefault () не работает

3 голосов
/ 24 февраля 2012

у меня есть эта строка кода в моем представлении с использованием 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);

JS-коды GridSelection и отключить выбранные функции:

  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...

Когда я запускаю веб-приложение MVC3 в IE, оно работает хорошо благодаря функции GridSelection.disableSelected, но в Chrome и Mozilla Firefox , event.preventDefault(); не Работа. Якорная ссылка по-прежнему добавляет элемент данных даже после того, как пользователь уже добавил его туда.

Нормально ли иметь метод preventDefault внутри функции GridSelection.addItem, который был предотвращен?

Какой атрибут предотвращается preventDefault, это href или onclick ?

Что не так с этим? Как я могу исправить эту ошибку? Кто-нибудь может помочь?

Ответы [ 4 ]

4 голосов
/ 24 февраля 2012

Разметка для вашей ссылки имеет встроенный обработчик щелчков и не href:

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

Если это GridSelection.verify(), который вы пытаетесь предотвратить, вы должны заметить, что:

  1. Встроенный обработчик щелчков, вероятно, вызывается до вашего другого обработчика событий, что означает, что уже слишком поздно отменять его из другого обработчика, и в любом случае
  2. e.preventDefault() не останавливает запуск других обработчиков, он останавливает действие по умолчанию для события, которое для ссылки заключается в переходе по URL, указанному в атрибуте href.И вы не указываете href.

Если вы хотите иметь несколько обработчиков для одного и того же события на одном и том же элементе, вы должны назначить их все с помощью jQuery в нужном вам порядке.их нужно назвать , а затем использовать метод event.stopImmediatePropagation() в одном из обработчиков, если вы хотите остановить запуск остальных из них.

Я не знаюкак вписать это в код, который вы показали, учитывая, что вы не показываете часть кода, которую хотите предотвратить, но общий принцип таков:

<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>

Сказав все это, если *Функция 1029 * вызывает вашу функцию .addItem(), и вы намерены не допустить, чтобы события future click работали по той же ссылке, потому что первый щелчок должен подтвердить / добавить, и тогда вы не захотитедобавьте еще раз, затем в вашей функции .addItem() сделайте что-то вроде этого:

anchorOption.removeAttr("onclick");
// or
anchorOption[0].onclick = null;
2 голосов
/ 24 февраля 2012

Вы пытались добавить return false; вместо event.preventDefault();

1 голос
/ 24 февраля 2012

Вы пытались переименовать переменную события? называйте меня сумасшедшим, но я, кажется, вспоминаю, что у меня проблемы, просто попробуйте function(e) {e.preventDefault();} и посмотрите, что произойдет

1 голос
/ 24 февраля 2012

Если якорь имеет id, используйте селектор идентификатора вместо его использования в качестве селектора атрибута.

Измените

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

на

$("#source" + value)

IЯ не говорю, что это проблема, но вы можете попробовать изменить это.

Обновление:

event.preventDefault() останавливает браузер, чтобы перейти по ссылке, установленной в атрибут hrefякорного элемента.Это не предотвратит и не остановит событие click.

...