Как предотвратить запуск события изменения JQuery при изменении HTML-кода select? - PullRequest
1 голос
/ 28 июня 2010

У меня есть элемент select, к которому прикреплено событие change, так что, когда пользователь выбирает новую опцию, этот текст помещается в соответствующий элемент ввода.Это работает нормально:

$("select[name='" + dropdown_name + "']").live("change", function()
{
    text = $("select[name='" + dropdown_name + "'] option:selected").text();
    $("#" + inputfield).val(text);
});

Однако, когда другой выбор изменяется, html этого поля выбора изменяется согласно запросу AJAX.Когда это происходит, выбранное значение из изменения pre-HTML элемента select помещается в поле ввода.

$.get("file.php", {x: x, y: y}, function(text)
{
$("select[name='dropdown_name']").html(text).removeAttr("disabled");
    if (!$("select[name='dropdown_name'] option.selected").length)
    {
        $("select[name='dropdown_name'] option[value='1']").attr("selected", "selected");
    }
    $("#_inputfield").removeAttr("disabled");
});

Как предотвратить появление этой конкретной функции только при изменении HTML?

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Вы можете зарегистрировать, что изменение было в элементе управления ajax, и получить доступ к нему в вашем событии изменения.

(function(){
  var changedByAjax;
  $(document).on('change', 
                 "select[name='" + dropdown_name + "']", 
                 function() {
    var $select = $(this);
    // make sure the change wasn't by ajax
    if( !changedByAjax ) { 
      text = $select.find("option:selected").text();
      $("#" + inputfield).val(text);
    }
    changedByAjax = false; 
  });

  $.get("file.php", {x: x, y: y}, function(text) {
    var $select = $("select[name='dropdown_name']")
    $select.html(text).removeProp("disabled"); 

    // make note that we changed the value by ajax
    if ( !$select.find("option.selected").length ) {
      $select.find("option[value='1']").prop("selected", true);
    }
    $("#_inputfield").removeProp("disabled");
  });
}());

Я добавил changedByAjax в ваш вызов ajax и проверил его в вашем событие change (также сбросьте значение в измененном событии).Это меньше накладных расходов, чем открепление и повторное связывание.Держите это в секрете, поместив его в IIFE - сила охвата.Тем не менее, это слишком DOM-ориентированный подход.Но, увы, ответ.

2 голосов
/ 28 июня 2010

1) удалить привязку;

2) внести изменения;

3) восстановить привязку.

Или использовать какое-либо проверенное значение (возможно, значение скрытого ввода) -уменьшить изменения привязки к событию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...