Должны ли изменения значения элемента управления SELECT, сделанные в коде, вызвать событие onChange? - PullRequest
3 голосов
/ 09 апреля 2011

Я использую следующий код для отслеживания изменений в заданном элементе SELECT.

  someSelectElement.change(function () { alert('change made'); });

И он работает замечательно, когда я изменяю значение выбранного элемента через пользовательский интерфейс.

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

$('#someSelectElement').val('NewValue')

Я знаю, что это кажется необычным дляМне нужно обнаружить изменения, внесенные в элемент управления другим кодом, и если бы это был мой код, я бы просто вызвал событие и вызвал его через день.Проблема в том, что я пишу плагин jQuery, который должен что-то делать, когда значение отслеживаемого элемента управления изменяется, будь то вмешательство пользователя или некоторый клиентский скрипт, который запускает пользователь моего плагина.

Я предполагаю, что поведение, не вызывающее события в этой ситуации, разработано специально.Если нет, пожалуйста, говорите и дайте мне знать, что я делаю не так.Если да, есть ли обходной путь, где я могу наблюдать за изменениями, внесенными в значение элемента SELECT, независимо от того, были ли они инициированы пользователем или кодом?

Ответы [ 2 ]

4 голосов
/ 09 апреля 2011

Изменения значений элементов, управляемые кодом, не запускают собственные события. Конечно, вы всегда можете запустить их самостоятельно, используя метод jQuery ".trigger ()".

Браузеры Mozilla уже давно имеют функцию «наблюдения», но она не поддерживается другими платформами.

3 голосов
/ 09 апреля 2011

Хорошо, так что я мог бы иметь лучшее решение для этого, чем решение с интервальным таймером.

Также обратите внимание, что это хак НАМНОГО больше и следующиепросто доказательство концепции и ни в коем случае не готово к производству:

$(document).ready(function(){
    function change(){
        $('#test option[value=3]').attr('selected', 'selected');
    }

    // run it before changing it
    alert('first go');
    change();

    var tmp = String(change).replace(/function change\(\){/, '');
    tmp = tmp.replace('}', '');
    tmp += 'alert(\'it changed\');';

    change = function() { eval(tmp); };

    // try it again - should get the second alert this time
    alert('second go (post mod)');
    change();
});

См. образец здесь.

По сути, я делаю следующее:

  1. Преобразование функции в строку
  2. Замена ограничивающих конструкций функций
  3. Добавление любой функциональности, которую я хочу внедрить
  4. Переназначение измененной функцииоригинальная функция

Кажется, работает, но не может в реальном мире:)

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