или так... наверное, еще лучше)
jQuery('#1:not(.disabled)').bind('textchange', function (event, previousText) {
if (jQuery(this).hasClass("disabled") == false) {
if (jQuery(this).val().length > 0) {
jQuery('#2').addClass('disabled').attr("readonly","readonly");
}
else jQuery('#2').removeClass('disabled').removeAttr("readonly", "readonly" );
jQuery('#2').val(jQuery(this).val());
}
});
jQuery('#2').on('textchange',':not(.disabled)', function (event, previousText) {
alert ('Hello');
});
думаю, в случае с bind, функция-обработчик прикрепляется к текущему выбранному элементу сразу при запуске скрипта. в данном случае этот элемент является вторым полем. и даже в случае изменения второго поля через скрипт, обработчик остается висеть и ожидать изменения текста, хотя ввод в само поле уже запрещен. поэтому и функция, дождавшись своего часа, выполняется при нужном событии. и только потом обработчик перезаписывается к этому элементу
при использовании on() функция прикрепляется к элементу только после срабатывания нужного события.
вывод: использование on() предпочтительней в данном случае. но нужен jquery версии не ниже 1.7