ОсновноеRadiotalkПользовательское
Программирование
6   •   Посмотреть все темы

Проблемы с contenteditable

 

4619
Web3r @Web3r
Имеется редактируемый div. В нем может быть много текста, который не помещается по длине.
Проблема в выделении этого текста при помощи курсора. В обычном input если мы выделим любое слово и потащим курсор влево/вправо, текст будет прокручиваться и выделяться.
С contenteditable такая шутка не работает и текст остается статичным:


**********

Есть какие-нибудь решения?

1555
Алексей @TheDark
Web3r, Opera 34, таких проблем нет, все прокручивается...

Отредактировано TheDark - 01.01.2016
4619
Web3r @Web3r
Похоже, только на лисе так.

3910
Дмитрий @Q-Tec
В хроме тоже норм

4619
Web3r @Web3r
Выяснилось, что проблема не в contenteditable, а в CSS.
Лиса не дает скроллить текст курсором, если есть overflow:hidden.

4619
Web3r @Web3r
Не создаю новую тему.

Ребята, как можно быстрее перебрать относительно большой массив или объект? Как вообще лучше с т.з. производительности реализовать следующую задачу:
Имеется множество значений, например, ["abcde", "abcdb", "abedf", etc... ] и одно единственное значение "qwerty123", которое необходимо найти в данном множестве.
При этом совпадение может быть частичным по первым символам, т.е. если в массиве идет [ ... ,"qwerty1234", ... ], то на нем необходимо остановить дальнейшее сравнение и выполнить определенную функцию.
К сожалению, в такого рода переборах не силен. Как бы вы реализовали это?

2970
удалён @Foggy
[spoiler=EcmaScript 5]Вот как-то так на чистом JS:
var users = ["Foggy", "Pegass", "query123", "Web3r", "BETEPAH"];
function findArray(arr, string) {
var text = '';
arr.forEach(function(el, i, ar) {
var diff = string.length - el.length;
if(string.length >= el.length) {
var cropped = string.slice(0, -diff);
if(cropped != el) return;
text = el;
}
});
return text;
}
console.log(
findArray(users, "query1234")
);

Можно сократить функцию вот до такого, но я бы рекомендовал использовать верхний вариант, потому что он читабельнее
function findArray(arr, string) {
arr.forEach(function(el) {
var diff = string.length - el.length;
if(diff >= 0 && el == string.slice(0, -diff)) string = el;
});
return string;
}

[/spoiler]
Вариант, написанный на ещё пишущейся спецификации EcmaScript 7 уже работает в последних браузерах:
var users = ["Foggy", "Pegass", "query123", "Web3r", "BETEPAH"];
function findArray(arr, string) {
arr.map((el) => { if(string.includes(el)) string = el; });
return string;
}
console.log(
findArray(users, "query1234")
);

Отредактировано Foggy - 17.01.2016
20090
Dimitry @Dimitry
не думаю что стандартный метод перебором будет значительно медленее, а может быть даже быстрее ...

2970
удалён @Foggy
быстрее, да. однако, есть ещё вопрос читабельности и величины кода. если любую функцию упрощать до самой быстрой, код оказывается неоправданно громоздким.

пусть каждый сам выбирает. тут аж три варианта получилось.

20090
Dimitry @Dimitry
Если почитать ТЗ то там
> Как вообще лучше с т.з. производительности реализовать следующую задачу
а не как написать 2 строки нестандартным методом для некоторых браузеров.

К тому же реализовано в корне не верно ибо задача звучит так:
> необходимо остановить дальнейшее сравнение и выполнить определенную функцию.

Если читать ещё лучше то можно было обратить внимание на:
> совпадение может быть частичным по первым символам

И того, твой пост скорее спам для галочки.
Не так уж и много коду:
var word="abcd";
var arr=["xabcd","abcde", "abcdb", "abedf"];
var len=word.length;
for(var i in arr) if(arr[i].indexOf(word)==0) {
alert(arr[i]);
break;
}

А за тупую минусовку которая уже не первый раз, в след. раз вылетишь с форума.

4619
Web3r @Web3r
Foggy, Dimitry, **********