Угловое значение this.el.nativeElement.selectionStart всегда null [duplicate]

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

Причина 1: Наиболее распространенной причиной этой проблемы является то, что мы пытаемся установить другую битовую версию, то есть 64-битную или 32 разрядной версии программного обеспечения. Это может быть либо Eclipse, либо Java.

Решение: проверьте, какая версия операционной системы вы используете. Убедитесь, что вы загрузили ту же версию Eclipse, а также ту же версию программного обеспечения Java.

Причина 2: Ошибка конфигурации в файле Eclipse.ini

Решение. Добавьте в конец файла Eclipse.ini эту строку «-vm, а затем путь к вашему java sdk». например: -vm C: \ Program Files \ Java \ jdk1.7.0_71 \ bin \ javaw.exe

Причина 3: Специальные символы (#,!, @) в каталоге установки Eclipse.

Решение: убедитесь, что у вас нет специальных символов.

Причина 4: вы дважды добавили путь JAVA в системную переменную PATH, и оба пути различны.

Решение: удалите один неправильный / другой путь JAVA из системной переменной PATH.

Причина 5: Возможно, вы используете последнюю версию Eclipse, но вы можете использовать неправильную версию или неподдерживаемую версию Java Virtual Machine (JVM).

Решение. Чтобы проверить, какая версия java вы используете открытую командную строку, нажав клавишу «win + R» и введите cmd и нажмите «Ввод». Теперь в этой консоли введите команду Java -version, чтобы узнать версию java. Теперь изучите, поддерживает ли eclipse эту версию или нет. Или вы можете открыть папку «readme» в папке Eclipse и открыть файл readme_eclipse.html, чтобы посмотреть, какую версию он поддерживает.

62
задан Steven 17 January 2014 в 05:49
поделиться

10 ответов

Я знаю, что этот ответ приходит слишком поздно, но вот плагин, который реализует selectStart для всех типов элементов для большинства браузеров (старый и новый):

https: //github.com/adelriosantiago/caret

Я обновил его для решения проблемы type="number" с помощью ответа @ncohen.

0
ответ дан adelriosantiago 15 August 2018 в 22:20
поделиться

Есть один способ, которым вы можете выполнить это в Chrome (и, возможно, в некоторых других браузерах, но Chrome - большой преступник). Используйте window.getSelection() для извлечения объекта выделения из текущего ввода, а затем тест расширяет выбор назад (или вперед) и видит, изменяется ли значение toString() выбора. Если это не так, курсор находится в конце ввода, и вы можете перейти к следующему входу. Если это так, вы должны затем отменить операцию, чтобы отменить выбор.

s = window.getSelection();
len = s.toString().length;
s.modify('extend', 'backward', 'character');
if (len < s.toString().length) {
    // It's not at the beginning of the input, restore previous selection
    s.modify('extend', 'forward', 'character');
} else {
    // It's at the end, you can move to the previous input
}

Я получил эту идею из этого ответа SO: https://stackoverflow.com/a/24247942

5
ответ дан Community 15 August 2018 в 22:20
поделиться

Это происходило для нас при использовании JQuery Numeric Plugin версии 1.3.x, поэтому, обернув selectionStart и selectionEnd с помощью try...catch{}, мы смогли подавить ошибку.

Источник: https://github.com/joaquingatica/jQuery-Plugins/commit/a53f82044759d29ff30bac698b09e3202b456545

5
ответ дан jbwebtech 15 August 2018 в 22:20
поделиться

В настоящее время единственными элементами, которые позволяют безопасно выбирать текст, являются:

<input type="text|search|password|tel|url">, как описано в: whatwg: selectionStart attribute .

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

Чтобы преодолеть эту «проблему» безопасно, на данный момент лучше всего работать с <input type="text"> и примените маску / ограничение, которые принимают только числа. Существует ряд плагинов, которые удовлетворяют требованиям:

Здесь вы можете увидеть живое демо одного из предыдущих плагинов:

Если вы хотите безопасно использовать selectionStart, вы можете проверить те элементы, которые его поддерживают (см. атрибуты типа входа )

Реализация

// Fix: failed to read the 'selectionStart' property from 'HTMLInputElement'
// The @fn parameter provides a callback to execute additional code
var _fixSelection = (function() {
    var _SELECTABLE_TYPES = /text|password|search|tel|url/;
    return function fixSelection (dom, fn) {
        var validType = _SELECTABLE_TYPES.test(dom.type),
            selection = {
                start: validType ? dom.selectionStart : 0,
                end: validType ? dom.selectionEnd : 0
            };
        if (validType && fn instanceof Function) fn(dom);
        return selection;
    };
}());

// Gets the current position of the cursor in the @dom element
function getCaretPosition (dom) {
    var selection, sel;
    if ('selectionStart' in dom) {
        return _fixSelection(dom).start;
    } else { // IE below version 9
        selection = document.selection;
        if (selection) {
            sel = selection.createRange();
            sel.moveStart('character', -dom.value.length);
            return sel.text.length;
        }
    }
    return -1;
}

Использование

// If the DOM element does not support `selectionStart`,
// the returned object sets its properties to -1.
var box = document.getElementById("price"),
    pos = getCaretPosition(box);
console.log("position: ", pos);

Вышеприведенный пример можно найти здесь: jsu.fnGetCaretPosition ()

13
ответ дан jherax 15 August 2018 в 22:20
поделиться
  • 1
    Привет, спасибо за сообщение. Не могли бы вы просто объяснить, что вы подразумеваете под «принуждением принимать только числа»? – PetarMI 28 July 2015 в 15:06
  • 2
    Привет @PetarMI, через ограничение Я имею в виду, что & lt; input & gt; элемент может принимать только числовые символы, и это делается через JavaScript, потому что не все браузеры корректно работают с новым HTML5 & lt; input & gt; теги. – jherax 30 July 2015 в 02:35

мы не можем просто отменить проверку элемента, чтобы просто включить поддерживаемые элементы, например:

if (deviceIsIOS &&
    targetElement.setSelectionRange &&
    (
        targetElement.type === 'text' ||
        targetElement.type === 'search' ||
        targetElement.type === 'password' ||
        targetElement.type === 'url' ||
        targetElement.type === 'tel'
    )
) {

вместо этого:

if (deviceIsIOS && 
    targetElement.setSelectionRange && 
    targetElement.type.indexOf('date') !== 0 && 
    targetElement.type !== 'time' && 
    targetElement.type !== 'month'
) {
3
ответ дан Jochie Nabuurs 15 August 2018 в 22:20
поделиться

В качестве рабочего процесса входной тип type="tel" обеспечивает очень похожую функциональность type="number" в Chrome и не имеет этого ограничения (как указал Патрис).

5
ответ дан Kevin Borders 15 August 2018 в 22:20
поделиться
  • 1
    Не работает для чисел с десятичными знаками. – Jakobovski 3 February 2015 в 21:00

Я получил эту ошибку на веб-сайте angularjs.

Я создал атрибут пользовательских данных на входе и также использовал ng-blur (с $ event).

Когда мой callback был вызван. Я пытался получить доступ к значению «data-id», например:

var id = $event.target.attributes["data-id"]

И это должно быть так:

var id = $event.target.attributes["data-id"].value

похоже, слишком много об этой ошибке, поэтому я оставляю это здесь.

1
ответ дан Mike Cheel 15 August 2018 в 22:20
поделиться

Я нашел простую обходную процедуру (проверенную на Chrome) для setSelectionRange(). Вы можете просто изменить type на text, прежде чем использовать setSelectionRange(), а затем изменить его на number.

Вот простой пример с jquery, который позиционирует каретку в позиции 4 в количестве ввода каждый раз, когда вы нажимаете на вход (добавьте более 5 цифр на вход, чтобы увидеть поведение)

plunker

12
ответ дан ncohen 15 August 2018 в 22:20
поделиться
  • 1
    Это работает фантастически. – Wayneio 3 March 2017 в 10:13
  • 2
    Это абсолютно правильное решение – Lemmy4555 13 January 2018 в 01:25
  • 3
    Этот подход также работает для входов email (вот как я оказался на этой странице, задаваясь вопросом, почему setSelectionRange() работал в IE11 (!), А не в Chrome). – jdunning 28 April 2018 в 20:59

Выбор разрешен только с текстом / поиском, URL-адресом, телефоном и паролем . Вероятная причина, по которой выбор был отключен для ввода номера типа, заключается в том, что на некоторых устройствах или при некоторых обстоятельствах (например, когда ввод был представлен как короткий list), может не быть каретки. Единственное решение, которое я нашел, это изменить тип ввода на текст (с соответствующим шаблоном для ограничения ввода). Я все еще ищу способ сделать это без изменения типа ввода и опубликую обновление, когда найду что-нибудь.

35
ответ дан Patrice Chalin 15 August 2018 в 22:20
поделиться
  • 1
    Я понимаю, что некоторые устройства могут не отображать каретку, но, похоже, это усложняет ситуацию. Если мы закончим использование типа = "текст" для всего, что побеждает цель даже иметь тип. Он также теряет способность для телефонов показывать разные клавиатуры для ввода цифр и т. Д. Я не согласен с их выбором, чтобы удалить выбор из входов, но я не уверен, что такое решение ... – Steven 24 February 2014 в 01:24
  • 2
    Это действительно отстой. Я связался с WHAT-WG по этому вопросу, поскольку я считаю, что это большая ошибка. 99,9% пользовательских агентов отображают поле <input type="number"/> как текстовое поле, которое устанавливает экранную клавиатуру по умолчанию (если доступно) на цифровую клавиатуру, но все же визуализирует поле как «текстовый ввод», поле. Любая существующая / будущая попытка добавить калькулятор или аналогичную функцию манипулирования значения для поля теперь бесполезна, если мы не отменим это поле и не испортим работу пользователя. – scunliffe 25 February 2014 в 23:34
  • 3
    Я согласен с вами обоими. Как я указываю в этой должности, я считаю, что атрибут IDL значения всегда должен содержать текстовую визуализацию того, что содержит вход. Кроме того, если пользовательский агент разрешает выбор, тогда должен быть доступен selectStart / End. – Patrice Chalin 26 February 2014 в 04:36
  • 4
    Whaaaaat o_0 Хром просто сломал интернет .. и мои тесты. На более серьезной ноте я не понимаю логики. Почему пользователь не должен выбирать свой адрес электронной почты или номер? [Д0] stackoverflow.com/questions/22171694/… – Peter 4 March 2014 в 14:14

Хотя проблема с устаревшими событиями для этого типа поля формы может быть по-прежнему актуальной, насколько я вижу, этот вид поля можно прослушать с событием «change», как обычно.

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

1
ответ дан TheCuBeMan 15 August 2018 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: