Имитация maxlength с японскими символами для текстовой области в ie8-

Я пытаюсь смоделировать поведение HTML5 для maxlength для текстовой области в более ранних версиях Internet Explorer (ie8, ie7):

 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
 <textarea maxlength="200"></textarea>

 <script type="text/javascript">
 $(document).ready(function() {
    $(document).delegate('textarea[maxlength]', 'keyup paste change', function(e) { 

        var limit = parseInt($(this).attr('maxlength'));  
        var text = $(this).val();  
        var chars = text.length;  

        if(chars > limit){  
            var new_text = text.substr(0, limit);  

            $(this).html(new_text);  
        }  
    });  
});
</script>

Проблема заключается в том, что если я ввожу 201 японский символ, текстовое поле настраивает текст так, чтобы отображались только первые 200 символов, как и ожидалось, но затем, когда текстовое поле теряет фокус, когда я щелкаю по нему, текстовое поле будет отображать только 201-й японский иероглиф. Эта проблема не возникает, если вы вводите 201-й символ как английский символ. Я ввожу японские иероглифы с помощью Windows IME для японского языка, если это важно.

ETA: Я считаю, что сейчас проблема заключается в том, что Javascript плохо работает с японским IME, но я до сих пор не знаю, как это исправить.


person Kai    schedule 07.07.2014    source источник
comment
Используйте событие keypress вместо keyup. Кроме того, вы можете использовать событие input в современных браузерах и событие propertychange в IE для обнаружения изменений в свойстве value текстовой области. Пример: stackoverflow.com/a/14029861/96100   -  person Tim Down    schedule 08.07.2014
comment
используйте val() вместо html()   -  person dandavis    schedule 08.07.2014


Ответы (1)


Такое поведение почти наверняка связано с японским IME, изменяющим ввод после запуска различных событий Javascript. Лучшее решение, которое я нашел, - это изменить приведенный выше код так, чтобы он вместо этого вызывался событием «размытие», поскольку «размытие», кажется, всегда происходит после завершения редактирования японского IME.

person Kai    schedule 08.07.2014