#javascript #internet-explorer #backbone.js
#javascript #internet-explorer #backbone.js
Вопрос:
В нашем проекте мы используем загрузочный плагин WYSIWYG (http://mindmup.github.io/bootstrap-wysiwyg /) и мы столкнулись с проблемой с Internet Explorer. Хотя официально не поддерживается, в IE10 все работает, кроме действий «отменить» и «повторить». Этот плагин полагается на document.execCommand()
выполнение всех действий, необходимых пользователю.
Вы можете проверить проблему в демонстрационном редакторе на сайте плагина. Выполнение некоторой отладки, если вы нажмете кнопку отмены, вы увидите, что document.execCommand('undo')
это вызывается, но ничего не происходит. Однако, если вы введете команду в консоли, она отменит последнее действие.
Я думал, была ли это проблема IE (поскольку это отлично работает в Chrome и FF), но execCommand (‘undo’) действительно работает -> http://jsfiddle.net/c8mq2/1 /
Поскольку мы используем Backbone.js и чтобы уточнить, была ли это проблема с плагином или нет, мы отключили кнопку отмены от плагина и создали пользовательское событие следующим образом:
Представление магистрали:
events: {
'click #undoAction': 'undoAction'
},
undoAction: function (e) {
e.preventDefault();
document.execCommand('undo');
}
HTML:
<div class="btn-group">
<!-- undo dettached from plugin -->
<a class="btn" id="undoAction"><i class="icon-undo"></i></a>
<!-- redo keeps attached to plugin's data-edit attribute -->
<a class="btn" data-edit="redo" "><i class="icon-repeat"></i></a>
</div>
Однако здесь тоже не повезло, похоже, это не проблема с плагином. Что может повлиять на стек отмены / повтора IE, который не позволяет execCommand работать должным образом при некоторых обстоятельствах?
Я не могу придумать другой и более простой способ вызова execCommand (‘undo’), как в последнем примере Backbone. Любой свет на это будет высоко оценен!
ОБНОВЛЕНИЕ: новые результаты
Я нашел способ заставить действие отмены работать, и, возможно, это может показать, что происходит, но все еще не понимаю, почему (вы можете попробовать это на демонстрационной странице bootstrap wysiwyg выше) ->
- Нажмите на текстовую область и введите некоторый текст.
- Нажмите на кнопку отмены
- Результат: ничего не происходит.
- Нажмите на текстовую область еще раз.
- Переместите курсор на кнопку отмены (пока не нажимайте на нее)
- Введите текст, не отводя курсор от кнопки.
- Нажмите на кнопку отмены
- Результат: ЭТО РАБОТАЕТ
- Повторите шаги 6 и 7, не перемещая курсор, и он все равно будет работать.
Кажется, что наведение курсора на кнопку отмены нарушает стек отмены / повтора, и именно из-за этого document.execCommand(‘undo’) перестает работать должным образом в этих случаях. Есть ли какой-нибудь способ запросить этот стек и посмотреть, что происходит на самом деле?
Заранее спасибо!
Ответ №1:
Благодаря последним выводам я наконец нашел причину проблемы. Дело в том, что как демонстрационная страница Bootstrap WYSIWYG, так и наш собственный проект используют редактор совместно с плагином всплывающей подсказки Bootstrap, и поэтому при каждом наведении курсора мыши элемент всплывающей подсказки прикрепляется к DOM. Каким-то образом Chrome и Firefox не воспринимают этот элемент как изменение, влияющее на document.execCommand(‘отменить’), но Internet Explorer это делает.
Могут быть и другие решения, но то, что мы сделали, это отключили всплывающие подсказки для браузеров Internet Explorer и полагались на собственные заголовки в этих случаях.