Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.04.2022, 13:45
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Как в визуальном редакторе при нажатии enter, выйти из текущего контейнера?
У меня в редакторе можно добавлять цветные контейнеры
https://javascript.ru/forum/misc/83931-stili-ne-primenyayutsya-v-cvetnykh-blokakh-kursor-redaktirovaniya-otsutsvuet.html.

Но есть существенный недостаток из них нельзя выйти, единственный способ это создать новый контейнер, тогда из нового тоже нельзя будет выйти и так получается, что весь текст будет состоять из одних цветных блоков.

Если нажать enter, то внутри цветного блока создастся пораграф <p>, что по сути не нужно я не собираюсь писать большие тексты в своих цветных блоках, там будут всего лишь пометки и разбивать их на порагрофы не требуются. Enter мне нужен, чтобы выйти из контейнера (цветного блока).

Как при нажатии enter создать пораграф не внутри контейнера, а за его пределами и уже там писать основной текст?

Мой код (у iframe я установила размеры, чтобы редактируемая область была больше).

<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<input type='button' class='btn-block' data-command='Bold' value='B'/><input type='button' class='btn-block' data-command='Italic' value='I'/>
<button type="button" class="btn-block" data-command="warning" title="Внимание">Внимание</button>
<button type="button" class="btn-block" data-command="important" title="Важно">Важно</button>
<button type="button" class="btn-block" data-command="info" title="Информация">Информация</button>
<button type="button" class="btn-block" data-command="advice" title="Совет">Совет</button>
<button type="button" class="btn-block" data-command="neutrality" title="Нейтральность">Нейтральность</button>
  <br />
  <iframe scrolling='no' frameborder='no' src='#' id='frameId' name='frameId' width="800" height="400"></iframe>

<form name="myform" action="#" method="post" onsubmit="return save()">
  <p>
    <input type="hidden" id="content" name="content" value="" />
  </p>
  <script type="text/javascript">
    let edit1;
    let doc;
    function init()
    {
      var isGecko = navigator.userAgent.toLowerCase().indexOf("gecko") != -1;
      console.log(isGecko);
      var iframe = document.getElementById("frameId");
      edit1 = iframe.contentWindow;
      doc = iframe.contentDocument;
      
      iHTML = "<html><head>";
      iHTML += "<link rel=\"stylesheet\" type=\"text/css\" href=\"style2.css\">";
      iHTML += "</head><body></body></html>";
      doc.open(); 
      doc.write(iHTML);
      doc.close(); 
      doc.designMode = "on"; 
      doc.body.contentEditable = true;
      
      
       $('.btn-block').on("click", function(e) {
          e.preventDefault();
          e.stopPropagation();
          
          let target = e.target;
          tag = target.firstChild;
          let myclass = "";
          
          if (target.getAttribute("data-command") === "Bold") {
              edit1.focus();
              edit1.document.execCommand("bold", null, "");
          }
          if (target.getAttribute("data-command") === "Italic") {
               edit1.focus();
               edit1.document.execCommand("italic", null, "");
          }
          if (target.getAttribute("data-command") === "warning") {
                    myclass = "warning shortcodestyle";
                    addBlock(myclass);
                    
         } else
        if (target.getAttribute("data-command") === "important") {
            myclass = "important shortcodestyle";
            addBlock(myclass);
        } else
        if (target.getAttribute("data-command") === "info") {
            myclass = "info shortcodestyle";
            addBlock(myclass);
        }
        if (target.getAttribute("data-command") === "advice") {
            myclass = "advice shortcodestyle";
            addBlock(myclass);
        }
        if (target.getAttribute("data-command") === "neutrality") {
            myclass = "neutrality shortcodestyle";
            addBlock(myclass);
         }
          
       });
       
       function addBlock(myclass)
       {
         var rangeElement = document.createElement("div");
         rangeElement.setAttribute("class", myclass);
         rangeElement.innerHTML = "<p><br></p>";
         
         doc.body.append(rangeElement);
         
         
         
         var range = edit1.document.createRange();
         
         range.setStart(rangeElement.childNodes[0], 0);
         range.collapse(true);
         edit1.focus();
         var sel = edit1.document.getSelection();
        
         sel.removeAllRanges();
         sel.addRange(range);
         rangeElement.focus();
      }
    }
    init();
    
   //});
  </script>
  <p>
  <input type="submit" value="Отправить" />
  </p>
  
</form>
</body>
Ответить с цитированием
  #2 (permalink)  
Старый 26.04.2022, 12:54
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Сделала проверку, на нажимаемую клавишу enter в неё добавила также проверку, что курсор находится внутри контейнера div. При нажатии создается абзац, за пределами контейнера, но курсор почему-то не перескакивает. В чем проблема?
function test (e)
      {
          var key=e.keyCode || e.which;
          if (key==13){
              var range = edit1.document.createRange();
              range.setStart(doc.childNodes[0], 0);
              range.collapse(true);
              edit1.focus();
              var sel = edit1.document.getSelection();
              
              if(sel.focusNode.parentElement.nodeName==="DIV")
              {
                 var rangeElement = document.createElement("p");
                 doc.body.append(rangeElement);
                 var range = edit1.document.createRange();
         
                 range.setStart(rangeElement, 0);
                 range.collapse(true);
                 edit1.focus();
                 var sel = edit1.document.getSelection();
                 
                 sel.removeAllRanges();
                 sel.addRange(range);
                 rangeElement.focus();
              }
         }
      }
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как написать скрипт, чтобы при нажатии на кнопку он скроллил на следующую или предыду Tempest Элементы интерфейса 4 04.07.2021 20:46
Как при нажатии кнопки удалить ещё и внешний блок? Katy93 Общие вопросы Javascript 5 23.02.2020 10:17
Как сделать чтобы при втором нажатии на кнопку картинка закрывалась? KazZato Общие вопросы Javascript 1 10.05.2018 13:16
onClick на button при нажатии Enter atech Events/DOM/Window 2 09.08.2012 16:48
Подскажите как убрать часть текста при нажатии на кномпу или гиперссылку. potkin Общие вопросы Javascript 6 10.10.2008 07:55