Выравнивание текста по левому краю при включенном размытии (IE 8 и 9)

Я ищу способ выравнивания по левому краю содержимого текстового поля ввода, когда пользователь запускает событие onblur. Я видел упоминание о решении проблемы с onblur="this.value = this.value", но это не работает в IE.

Чтобы уточнить: эта проблема возникает в Internet Explorer, когда пользователь вводит текст за пределы ширины текстового поля, а затем оставляет фокус. В Chrome и Firefox текст автоматически выравнивается по левому краю, но в IE этого не происходит.

По запросу прикрепил код (просмотреть в IE):

<input type="text" />

http://jsfiddle.net/t3hjonneh/FZJjW/

Текстовое поле:

Текстовое поле

После ввода:

После ввода

После размытия:

После размытия

Как это должно выглядеть:

Как это должно выглядеть


person Jonneh    schedule 07.02.2013    source источник
comment
Вы имеете в виду, что хотите, чтобы текст прокручивался обратно в исходное положение?   -  person Juan Mendes    schedule 07.02.2013
comment
@JuanMendes да. Это функциональность, которую я пытаюсь захватить.   -  person Jonneh    schedule 07.02.2013


Ответы (3)


Это скорее хак, чем правильное решение, но как-то оно работает:

function blurred(elem) {
    var range;
    // IE only, probably not the best check since it will run in other browsers
    // if they ever implement this feature
    if (elem.createTextRange) {
        range = elem.createTextRange();
        range.collapse(true);
        range.select();
    }
}

<input type="text" onchange="blurred(this);" />

Обратите внимание на использование onchange вместо onblur. Это связано с тем, что select() вызывает некоторые проблемы при использовании onblur.

person Teemu    schedule 07.02.2013
comment
Собственно, зачем вообще менять эту функцию? Люди, которые просматривают веб-страницы с помощью IE, в любом случае привыкли к этому. - person Teemu; 07.02.2013
comment
Но это работает jsfiddle.net/FtzjL/3 Вам просто нужно исправить это, чтобы оно не не работает в браузерах, не поддерживающих createTextRange - person Juan Mendes; 07.02.2013
comment
@JuanMendes Исправлено, но я не уверен, работает ли это в реальных IE8 и 9, я только эмулировал их с IE10. - person Teemu; 07.02.2013
comment
@JuanMendes Хорошо. Вы пытались также отредактировать мой пост одновременно со мной, я полагаю, что я отменяю ваши правки. Если есть еще что-то, не стесняйтесь редактировать его снова :). - person Teemu; 07.02.2013
comment
Это работает, но вызывает проблемы с попыткой сфокусироваться на другом вводе: jsfiddle.net/t3hjonneh/esP8F/ 4 Вы не сможете выйти из первого ввода. - person Jonneh; 07.02.2013
comment
@Jonneh В моем ответе упоминается использование onchange вместо onblur, а также говорится, что onblur причинит вред. В вашей скрипке есть onblur. - person Teemu; 07.02.2013
comment
@Teemu Я взял свою скрипку из того, что написал Хуан; Я изменю свой и подтвержу. - person Jonneh; 07.02.2013
comment
Это достойное решение, просто оно не будет работать в случае, когда вы прокручивали только вправо, возможно, вы фактически не изменили значение. Тем не менее, я попробовал несколько вещей (настройка размытого фокуса элемента, затем размытие и восстановление фокуса на следующем элементе), чтобы заставить его работать с onblur, и не смог заставить его работать. - person Juan Mendes; 08.02.2013
comment
@JuanMendes Вот почему я считаю это скорее взломом :). Если страница не прокручивается, вы можете использовать onblur и range.scrollIntoView(true), но в противном случае это вызывает некоторую дополнительную прокрутку, когда страница прокручивается за пределы экрана до того, как сработает фактическое blur. Основная проблема с onblur заключается в том, что для инициализации текста вам нужно снова сфокусироваться на input, и это приводит к тому, что фокус застревает на input. - person Teemu; 08.02.2013

Вот смоделированная мной версия jQuery, которая работает во всех основных браузерах:

$(document).ready(function(){
        $('input[type=text]').change(function(){
            try{//select nothing but side-effect is that text left justifies
                if(/webkit/.test(navigator.userAgent.toLowerCase())){
                    return;//webkit browsers do it automatically
                } else if(this.createTextRange) { //ie
                    var r = this.createTextRange();
                    r.collapse(true);
                    r.select();
                } else if(typeof this.selectionStart !== "undefined") { //firefox
                    this.selectionStart = 0;
                    this.selectionEnd = 0;
                }
            } catch(err) {
            //?? nobody cares ??
            }
        });
});
person Nick Kuznia    schedule 18.02.2014

Я бы просто установил класс в этом поле, а затем запустил функцию с onBlur в вашем html: например. onBlur="left()" Затем в вашем javascript вы можете просто изменить класс с помощью .setAttribute В качестве дополнительного бонуса вы также можете установить другие свойства для этого класса.

Хотя я поддерживаю идею публикации соответствующего кода

person shadowmanwkp    schedule 07.02.2013
comment
Я не совсем уверен, как это поможет. Какой css вы бы использовали в классе, чтобы заставить текст остаться? выравнивание текста: по левому краю; просто вызывает очень странные вещи. И изменение самого класса не приводит к изменению выравнивания текста. На самом деле нет никакого кода, необходимого для воспроизведения этой проблемы, поскольку очень простой элемент ввода type=text и Internet Explorer выдаст результаты. - person Jonneh; 07.02.2013
comment
@Jonneh Да, если вы хотите, чтобы вам помогало больше людей, вам нужно показать код. А еще лучше создайте jsfiddle.net, чтобы люди могли поиграть. Я даже не знаю, что вы подразумеваете под выравниванием по левому краю после размытия. К вашему сведению, я отказываюсь помогать по вопросам без кода, дух SO - вот мой код, я ожидаю, что он сделает A, но он делает B, как я могу это исправить? - person Juan Mendes; 07.02.2013
comment
@JuanMendes Довольно сложно предоставить код для проблемы, которая возникает без каких-либо действий. Тем не менее, я прикрепил скриншоты, чтобы прояснить ситуацию. - person Jonneh; 07.02.2013
comment
@Jonneh Teemu уже понял это, и я добавил ссылку на рабочую версию. Вы должны принять их ответ. jsfiddle.net/FtzjL/3 Однако изображения многое проясняют. - person Juan Mendes; 07.02.2013
comment
@JuanMendes В ссылке, которую вы разместили здесь, отсутствует исправление. Спасибо за вашу помощь. - person Jonneh; 08.02.2013