Как обрабатывать программные изменения состояния элемента ввода в JavaScript - PullRequest
1 голос
/ 30 декабря 2008

Я столкнулся со странной проблемой. В то время как изменение пользователем элемента ввода флажка на форме приводит к адекватному событию, изменение программы не происходит. Как я должен решить эту проблему? Код следующий:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js"></script>
  <script type="text/javascript">
    jQuery(document).ready(
      function() {        
        jQuery("#cb").change(
          function() {
            alert("Changed!"); 
            return true;
          }
        );
        jQuery("#b").click(
          function() {
            var newState = !jQuery("#cb").attr('checked');
            jQuery("#cb").attr('checked', newState);
          });
      });
  </script>
</head>
<body>
  <form action="#">
    <p>
      <input type="button" id="b" />
      <input type="checkbox" id="cb" />
    </p>
  </form>
</body>
</html>

Обновление Я не контролирую изменения элементов, мне просто нужно их обработать. Это общий код, который я пишу.

Ответы [ 4 ]

4 голосов
/ 30 декабря 2008

используйте функцию запуска, чтобы вызвать событие щелчка на флажке. Вам не нужно захватывать существующее состояние, поскольку флажок будет просто переключаться при нажатии.

jQuery("#cb").trigger('click');
1 голос
/ 20 января 2010

Невозможно отследить состояние объекта на языке JavaScript, как это можно сделать в Objective-C (KVO). Также невозможно использовать функции DOM - DOM не генерирует события при каждом изменении свойства - вместо этого он генерирует события только при определенных действиях пользователя: щелчках мышью, нажатиях клавиш или жизненном цикле страницы и их производных.

Можно было бы достичь этого единственного события стрельбы каждый раз, когда она изменяет какое-либо свойство. Конечно, это может быть заключено в функцию, как упоминал AnthonyWJones.

1 голос
/ 19 января 2010

Метод базовой библиотеки jQuery .val () не вызывает событие изменения. Если вы обслуживаете свою собственную копию jQuery, вы можете изменить метод библиотеки, но это, вероятно, не будет разумным. Вместо этого вы можете добавить свой собственный установщик значений, который использует .val (), а также запуск события change с чем-то вроде следующего:

jQuery.fn.xVal = (function() {
    return function(value) {
        // Use core functionality
        result = this.val.apply(this, arguments);
        // trigger change event
        if (result instanceof jQuery) {
              result.change();
        }
        return result;
    };
})();
1 голос
/ 30 декабря 2008

В этом случае вам не следует кодировать логику в самой функции обработчика событий. Вы должны поместить любую такую ​​логику в отдельную функцию. Точно так же вы не должны помещать код, который управляет значением флажков программно непосредственно в другие последовательности кода, но абстрагировать его в другую функцию:

jQuery(document).ready(
  function() {

    jQuery("#cb").change(
      function() {
        changeLogicForcb.call(this);
         return true; 
     }
    );

    jQuery("#b").click(
      function() {
         togglecb();            
      });

    function changeLogicForcb()
    {
         //something actually sensible here
         alert("changed!");
    }

    function togglecb()
    {
        var cb = jQuery("#cb");
        var newState = !cb.attr('checked');
        cb.attr('checked', newState);
        changeLogicForcb.call(cb.get(0));         
    }  

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