Ошибка с .closest в IE [duplicate]

Итак, я собираюсь немного глубже понять, почему это не работает, потому что я такой человек, который не может спать по ночам, не зная ха-ха. Я использую jQuery validate 1.10 и Microsoft jQuery Unobtrusive Validation 2.0.20710.0, который был опубликован в 1/29/2013.

Я начал с поиска метода setDefaults в jQuery Validate и нашел его в строке 261 unminified file. Вся эта функция действительно объединяет ваши настройки json в существующие $.validator.defaults, которые инициализируются с использованием свойства ignore, которое установлено как «: hidden», а также другие значения по умолчанию, определенные в jQuery Validate. Поэтому в этот момент мы переопределили игнорирование. Теперь давайте посмотрим, на что ссылается это свойство по умолчанию.

Когда я прорисовывал код, чтобы увидеть, где ссылается $.validator.defaults. Я заметил, что это используется только конструктором для валидатора формы, строка 170 в jQuery проверяет unminified файл.

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

На этом этапе валидатор объединит все установленные по умолчанию настройки, которые были установлены и прикреплены к валидатору формы. Когда вы смотрите на код, который выполняет проверку, подсветку, подсвечивание и т. Д., Все они используют объект validator.settings, чтобы вытащить свойство ignore. Поэтому нам нужно убедиться, что мы должны установить игнорирование с помощью метода setDefaults, тогда он должен произойти до $ («form»). Вызывается функция validate ().

Если вы используете Asp .net MVC и ненавязчивый плагин, тогда вы поймете, посмотрев на javascript, который validate вызывается в документе .ready. Я также назвал свои setDefaults в блоке document.ready, который будет выполняться после скриптов, jquery проверяет и ненавязчив, потому что я определил эти сценарии в html перед тем, у кого есть вызов в нем. Таким образом, мой вызов, очевидно, не повлиял на функциональность по умолчанию пропуска скрытых элементов во время проверки. Здесь есть пара вариантов.

Вариант 1 - Вы могли бы, как указал Хуан Мелладо, вызвать вызов за пределами документа. Уже выполнив его, как только скрипт будет загружен. Я не уверен в сроках этого, так как браузеры теперь могут выполнять параллельную загрузку скрипта. Если я просто буду осторожен, то, пожалуйста, поправьте меня. Кроме того, возможно, есть способы обойти это, но для моих нужд я не пошел по этому пути.

Вариант 2a - Безопасная ставка в моих глазах - просто заменить $.validator.setDefaults({ ignore: '' }); внутри события document.ready с $("form").data("validator").settings.ignore = "";. Это изменит свойство ignore, которое фактически используется проверкой jQuery при выполнении каждой проверки на ваших элементах для данной формы.

Параметры 2b - После просмотра кода немного больше вы также можете использовать $("form").validate().settings.ignore = ""; как способ установки свойства ignore. Причина в том, что при просмотре функции validate он проверяет, был ли объект-валидатор уже сохранен для элемента формы с помощью функции $.data(). Если он находит объект валидатора, хранящийся в элементе формы, он просто возвращает объект validator вместо создания другого.

5
задан Tushar 22 March 2016 в 15:48
поделиться

3 ответа

Не используйте цель, если вам это не нужно. Это не объект jQuery, поэтому не имеет методов jQuery

Вместо этого используйте $(this) (объект jQuery)

$('body').on('change', 'select', function(event) {
  var $sel = $(this), // the select changed
    id = this.id, // or $(this).attr("id"); 
    val = $(this).val();
  if (id.indexOf("couche") >= 0) {
    $.ajax({
      url: "{{ redir2 }}",
      type: "POST",
      data: {
        ident: id,
        value: val,
        iscouche: "True"
      },
    }).done(function(msg) {
      if (msg.nothing == 1) {
        var what = $sel.closest('tbody')
        $(what).find("tr:gt(0)").remove();
      } else {
        var add = $sel.closest('tr');
        var toremove = msg.toremove.split(" ")
        for (var i = 0; i < toremove.length; i++) {
          if (toremove[i].length > 0) {
            jQuery(toremove[i]).remove();
          }
        }
        jQuery(add).after(msg.ret);
      }
    });

  } else {
    $.ajax({
      url: "{{ redir2 }}",
      type: "POST",
      data: {
        ident: id,
        value: val;,
        iscouche: "False"
      },
    }).done(function(msg) {});
  }
});

или neater:

$('body').on('change', 'select', function(event) {
  var $sel = $(this), // the select changed
    id = this.id,
    isCouche = id.indexOf("couche") != -1,
    val = $(this).val();
  $.ajax({
    url: "{{ redir2 }}",
    type: "POST",
    data: {
      ident: id,
      value: val,
      iscouche: isCouche ? "True" : "False";
    },
  }).done(function(msg) {
    if (isCouche) {
      if (msg.nothing == 1) {
        var what = $sel.closest('tbody')
        $(what).find("tr:gt(0)").remove();
      } else {
        var add = $sel.closest('tr');
        var toremove = msg.toremove.split(" ")
        for (var i = 0; i < toremove.length; i++) {
          if (toremove[i].length > 0) {
            $(toremove[i]).remove();
          }
        }
        $(add).after(msg.ret);
      }
    } else {
      // handle not couche
    }
  });
});
9
ответ дан mplungjan 17 August 2018 в 10:04
поделиться

Вы должны включить его в $(), поскольку event.target не является элементом jQuery

   $(event.target).closest('tr')
2
ответ дан Ashkan Mobayen Khiabani 17 August 2018 в 10:04
поделиться

closest() определен в прототипе jQuery, его нельзя использовать для обычного объекта JavaScript.

event.target является элементом DOM, на котором произошло событие, используйте jQuery-методы на нем, элемент должен быть обернут в jQuery.

Измените

var what = event.target.closest('tbody')

на

var what = $(event.target).closest('tbody')
11
ответ дан Tushar 17 August 2018 в 10:04
поделиться
  • 1
    Зачем использовать event.target вообще? – mplungjan 22 March 2016 в 15:55
  • 2
    @mplungjan Правильно, но, поскольку вы ответили на использование $(this), я не буду добавлять это в ответ. :). Использование this является правильным способом. – Tushar 22 March 2016 в 15:57
Другие вопросы по тегам:

Похожие вопросы: