Что делать, если в IE moveToElementText выпадает исключение недопустимого аргумента - PullRequest
5 голосов
/ 23 сентября 2008

Мы написали плагин для текстового редактора Xinha для обработки сносок. Вы можете взглянуть на: http://www.nicholasbs.com/xinha/examples/Newbie.html

Чтобы решить некоторые проблемы с тем, как Webkit и IE обрабатывают ссылки в конце строк (нет способа использовать курсор, чтобы выйти из ссылки в той же строке), мы вставляем пустой элемент и перемещаем выделение. к тому, чем рухнуть вправо. Это прекрасно работает в Webkit и Gecko, но по какой-то причине moveToElementText выдает исключение Invalid Argument. Неважно, какой элемент мы передаем ему, функция, кажется, полностью нарушена. Однако в других путях кода эта функция работает.

Чтобы воспроизвести ошибку, используя ссылку выше, нажмите в основной области ввода текста, введите что-нибудь, затем нажмите на желтый значок страницы с зеленым знаком плюс, введите что-нибудь в диалоговом окне лайтбокса и нажмите Вставить. Ниже приведен пример кода, вызывающего проблему:

  if (Xinha.is_ie)
  {
    var mysel = editor.getSelection();
    var myrange = doc.body.createTextRange();
    myrange.moveToElementText(newel);
  } else
  {
    editor.selectNodeContents(newel, false);
  }

Данный код находится в SVN по адресу: https://svn.openplans.org/svn/xinha_dev/InsertNote

Этот плагин построен на ветке Xinha, доступной по svn по адресу: http://svn.xinha.webfactional.com/branches/new-dialogs

Ответы [ 2 ]

5 голосов
/ 23 сентября 2008

Это не видно в фрагменте выше, но newel был добавлен в DOM с помощью другого элемента, который сам был добавлен в DOM. При вставке элемента dom вам нужно повторно получить свой дескриптор, если вы хотите сослаться на его братьев и сестер, так как дескриптор недействителен (я не уверен, но я думаю, что это относится к элементу DOM внутри фрагмента документа, а не внутри документа.) После повторного извлечения дескриптора из операции вставки moveToElementText перестал генерировать исключение.

4 голосов
/ 24 сентября 2008

У меня был неудачный опыт отладки этого исключения IE много раз при реализации редактора WYSIWYG, и он всегда возникает из-за доступа к свойству узла DOM (например, .parentNode) или передачи узла DOM в функцию (например, moveToElementText), когда узел DOM в данный момент отсутствует в отображаемом документе.

Как вы сказали, иногда узел DOM представляет собой фрагмент фрагмента документа, который был удален из "фактического" DOM, отображаемого браузером, а иногда этот узел просто еще не вставлен. В любом случае, существует ряд свойств и методов на узлах DOM, к которым нельзя безопасно обращаться в IE6, пока узел не будет правильно вставлен и отображен в «фактическом» DOM.

Настоящим кикером является то, что часто это проявление исключения «Неправильный аргумент» в IE6 невозможно защитить с помощью try / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...