Избегайте функции createElement, если она находится внутри элемента <LI>(contentEditable) - PullRequest
1 голос
/ 17 мая 2011

Я использую эту функцию для замены <DIV>New Divs</DIV> на <BR> в строках разрывов в div содержимого contentEditable с использованием Safari и Chrome:

$("#form_description").live("keypress", function(e){
if (e.which == 13) {
if (window.getSelection) {
  var selection = window.getSelection(),
      range = selection.getRangeAt(0),
      br = document.createElement("br");
  range.deleteContents();
  range.insertNode(br);
  range.setStartAfter(br);
  range.setEndAfter(br);
  range.collapse(false);
  selection.removeAllRanges();
  selection.addRange(range);
  return false;
}
}
});

Проблема в том, что когда я набираю текст внутри <UL><LI>Something</LI></UL> и нажимаю клавишу возврата, я не хочу получать <BR>, поэтому я могу продолжить с списка ...

Как я могу создать условие, чтобы эта функция не работала, если я нахожусь внутри элемента LI?

РЕДАКТИРОВАТЬ С МОИМ ОТВЕТОМ:

Хорошо, мне удалось это сделать, но если у вас есть какие-либо комментарии к коду, пожалуйста:

$("#form_description").live("keypress", function(e){
if (e.which == 13) {

  node = document.getSelection().anchorNode;
  nodeName = node.parentNode.nodeName.toLowerCase();

  if ((nodeName != "li") && (nodeName != "blockquote")) {
... etc }

1 Ответ

1 голос
/ 17 мая 2011

Во-первых, используйте keyup в качестве имени события, нажатие клавиши работает только в Firefox.

Во-вторых, то есть, что не всегда доступно.В первую очередь используйте e.keyCode и вернитесь к e.which:

var code = e.keyCode || e.which;
if (code == 13) {
  // your code here..
}

В-третьих, если вам нужно отменить события по умолчанию, возникающие при нажатии клавиши, возможно, вы захотите добавить функцию warnDefault ()ваш обработчик событий.Убедитесь, что это первая строка.

function(e){
   e.preventDefault();
 ..
}
...