Ответ 1
Выбор символа с помощью мыши или SHIFT + ARROW, а затем удаление путем нажатия DELETE вернет скорость редактирования в обычное состояние в IE.
Например, у меня есть следующая простая HTML-страница, где <span>[SOME FIELD]</span>
повторяется много раз, чтобы составить около 200 КБ размера файла:
<!DOCTYPE html>
<html>
<head>
</head>
<body editableContent="true">
<span>[SOME FIELD]</span>
<span>[SOME FIELD]</span>
...
<span>[SOME FIELD]</span>
</body>
</html>
По мере роста контента опыт редактирования становится очень отсталым. В буквальном смысле этого слова невозможно напечатать или отредактировать.
Вот полный вариант воспроизведения. Чтобы понять, что я имею в виду, просто переместите курсор в конец редактируемого контента и попробуйте отредактировать. Он сильно отстает от IE и Chrome, что делает его практически невозможным. Он отлично работает под Firefox.
Проблема: Мне нужно заставить его работать достаточно быстро под IE.
До сих пор я был близок к эмуляции IE8 (с <meta http-equiv="X-UA-Compatible" content="IE=8">
), поэтому this работает (в IE).
Однако мне также нужно поддерживать IE=edge
. Любые советы о том, как это сделать, будут очень признательны. IMO, это ошибка (которую я представил здесь для IE и здесь для Chrome), но я ищу любой способ обхода.
Обновлено, для любого решения, которое работает при загрузке в автономном браузере IE или в специализированном приложении управлении WebBrowser, предоставляется щедрость., используя IE=edge
режим HTML-документа.
Обновлено, соответствующая ошибка IE, сообщенная, была просто закрыта как "Не исправлена ".
Выбор символа с помощью мыши или SHIFT + ARROW, а затем удаление путем нажатия DELETE вернет скорость редактирования в обычное состояние в IE.
Почему бы не сломать данные и не хранить их в массиве или объекте Json, а только читать часть за раз, обновляя, когда пользователь прокручивает или перемещается по содержимому. Таким образом, только небольшая часть будет обрабатываться в любой момент времени. Если вы используете Jquery, вы можете получить идентификатор из ссылки на класс. Если вы не хотите использовать Jquery, вы можете написать функцию идентификатора класса в необработанном Javascript. Ниже приведен пример, но вы можете получить эту идею.
<!DOCTYPE html>
<html>
<head>
</head>
<body editableContent="true">
<span id="item1" class="handle_items">[SOME FIELD]</span>
<span id="item2" class="handle_items">[SOME FIELD]</span>
...
<span id="item-n" class="handle_items">[SOME FIELD]</span>
</body>
</html>
<script>
$(function(){
var arrayData = [];
$(".handle_items").mouseover(function() {
var identVar = $( this ).prop('id');
fillHtml(identVar);
});
function fillHtml(identVar) {
$("#" + identVar).html(arrayData[i]);
}
});
</script>
Одним из решений было бы не использовать contenteditable = true
для всей области (раздел тела в вашем случае). Вы можете определить видимую область тела, создать 'Range' для соответствующей области и временно обернуть ее элементом contenteditable = true
.
Однако, в зависимости от более подробных требований, этот подход может оказаться неприемлемым. Например, одна проблема, которая приходит мне на ум, заключается в том, чтобы сохранить позицию каретки после прокрутки всего нескольких строк.
После многих слепых стрельб, я думаю, что нашел что-то, что могло бы действительно работать:
Предположительно, оба действия могут выполняться программно.
Во всех браузерах, чем больше элементов, тем медленнее они получаются. Другое, что вызывает проблемы, - это утечки памяти. Большинство крупных фреймворков, таких как angular или нокаут, вызывают утечку памяти. Вы можете профилировать их, запустив моментальный снимок памяти в профайле памяти.
Что касается элементов, которые вы действительно хотите сохранить под тысячей, я бы мог. Вы можете добавлять и удалять элементы по мере необходимости, как это делают хорошие непрерывные скроллеры.
У меня нет IE для проверки производительности прямо сейчас, так или иначе, в Chrome (Ubuntu) это поможет. Я просто удаляю contenteditable
из корневого элемента и добавляю его к каждому span
.
Это делает редактирование контента довольно быстрым.
Вы можете проверить это в Chrome со следующими шагами:
в devtools (панель элементов) выберите root node редактора (то есть body
с атрибутом contenteditable
)
попал в консоль javascript devtools
выполните этот фрагмент кода:
Отрывок:
var nodes = $0.querySelectorAll('span');
$0.setAttribute('contenteditable', false)
for (var i = 0, max = nodes.length; i < max; i++) {
nodes[i].setAttribute('contenteditable', true);
}
Вы сказали, что не хотите использовать разбивку на страницы, потому что...
Я не вижу, как AJAX/pagination может помочь с редактируемым контентом. На самом деле это полнофункциональный редактор, похожий на Word. Например, у него есть контекстный инструмент проверки орфографии, который зависит от слов вокруг курсора. Или как пользователь может выбрать блок текста, который охватывает несколько страниц.
Однако вы можете использовать разбивку на страницы (или что-то подобное), сохраняя при этом эти возможности. В основном вам нужно загружать только актуальные строки.
Я знаю Objective-C, и эта проблема очень похожа на UITableViewControllers. Они борются с проблемой, отображая элементы таблицы, которые в настоящее время просматриваются, и освобождая остальные. В вашем случае вы захотите сохранить свою информацию в массиве JavaScript.
То, как я это сделаю, - создать функцию loadItem
и функцию unloadItem
. loadItem
получит содержимое элемента и добавит его в тело, а unloadItem
скопирует содержимое обратно в массив и удалит элемент (возможно, установив стиль visibility:hidden
, но я не проверял его посмотрите, работает ли он).
Чтобы найти соответствующие строки:
Поскольку строки не выбраны, выйдите из экрана или что-то еще, что делает их более не требуемыми, вызовите unloadItem()
и передайте ему номер строки/все, что идентифицирует строку.
EDIT: Это то, что я имею в виду:
for(var count=0;count<1000;count++){
document.getElementById("main").innerHTML+="<span id='item"+count+"'>[SOME FIELD "+count+"]</span>";
}
function loadItem(number){
document.getElementById("item"+number).style.visibility="visible";
}
function unloadItem(number){
document.getElementById("item"+number).style.visibility="hidden";
}
unloadItem(1);
unloadItem(2);
loadItem(1);
// I didn't have time to implement the rest. Basically, when a user is not viewing a line, it should be hidden. When they scroll to view it, it should show up again. I haven't tested this yet, but it should work.
// There is supposed to be a bit of slowness when it loads, it is creating all the content and that is normal.
<!DOCTYPE html>
<html>
<head>
</head>
<body contenteditable="true" id="main">
</body>
</html>