2016-06-16 2 views
1

나는 아주 기본적인 기능을 가진 정말 작은 WYSIWYG 텍스트 편집기를 만들어,이 코드 (See live demo in jsfiddle)입니다 :JavaScript : 사용자 선택을 얻고 선택 전후에 태그를 삽입하는 방법은 무엇입니까?

HTML :

<section class="wysiwyg-editor" data-wysiwyg="true"> 
    <h2 id="hdwysiwygfw3v">WYSIWYG : By @natanel97</h2> 
    <textarea id="wysiwyg_ta_ead"></textarea> 
    <div class="wysiwyg-editor-toolbar wysiwyg-editor-toolbar-menu"> 
     <!-- enable only for test purposes 
     <button class="wysiwyg-editor-toolbar-menu menu-button" onclick="wysiwyg_save()"><i class="fa fa-floppy-o"></i></button> 
     --> 
     <button class="wysiwyg-editor-toolbar-menu menu-button" onclick="wysiwyg_addtag('strong')"><i class="fa fa-bold"></i></button> 
     <button class="wysiwyg-editor-toolbar-menu menu-button" onclick="wysiwyg_addtag('em')"><i class="fa fa-italic"></i></button> 
     <button class="wysiwyg-editor-toolbar-menu menu-button" onclick="wysiwyg_addtag('ins')"><i class="fa fa-underline"></i></button> 
     <button class="wysiwyg-editor-toolbar-menu menu-button" onclick="wysiwyg_toggle('wtgl_link')"><i class="fa fa-link"></i></button> 
     <div class="wysiwyg-editor-toolbar-menu hover-button-drop-down"> 
      <button class="wysiwyg-editor-toolbar-menu menu-button">Font Size <i class="fa fa-caret-down"></i></button> 
      <ul class="wysiwyg-editor-toolbar-menu drop-down-menu"> 
       <li><a href="javascript:;" onclick="wysiwyg_addtag('span', null, null, '9')">9pt</a></li> 
       <li><a href="javascript:;" onclick="wysiwyg_addtag('span', null, null, '11')">11pt</a></li> 
       <li><a href="javascript:;" onclick="wysiwyg_addtag('span', null, null, '13')">13pt</a></li> 
       <li><a href="javascript:;" onclick="wysiwyg_addtag('span', null, null, '16')">16pt</a></li> 
       <li><a href="javascript:;" onclick="wysiwyg_addtag('span', null, null, '19')">19pt</a></li> 
       <li><a href="javascript:;" onclick="wysiwyg_addtag('span', null, null, '21')">21pt</a></li> 
       <li><a href="javascript:;" onclick="wysiwyg_addtag('span', null, null, '26')">26pt</a></li> 
      </ul> 
     </div> 
     <div class="wysiwyg-editor-toolbar-menu hover-button-drop-down"> 
      <button class="wysiwyg-editor-toolbar-menu menu-button">Color <i class="fa fa-caret-down"></i></button> 
      <ul class="wysiwyg-editor-toolbar-menu drop-down-menu color-selection"> 
       <li><a href="javascript:;" style="background:#000;" onclick="wysiwyg_addtag('span', null, null, null, '000')">Black</a></li> 
       <li><a href="javascript:;" style="background:#fff;" onclick="wysiwyg_addtag('span', null, null, null, 'fff')">White</a></li> 
       <li><a href="javascript:;" style="background:#c60b0b;" onclick="wysiwyg_addtag('span', null, null, null, 'c60b0b')">Dark red</a></li> 
       <li><a href="javascript:;" style="background:#f39106;" onclick="wysiwyg_addtag('span', null, null, null, 'f39106')">Orange</a></li> 
       <li><a href="javascript:;" style="background:#2597d9;" onclick="wysiwyg_addtag('span', null, null, null, '2597d9')">Ocean blue</a></li> 
       <li><a href="javascript:;" style="background:#72b442;" onclick="wysiwyg_addtag('span', null, null, null, '72b442')">Grass green</a></li> 
       <li><a href="javascript:;" style="background:#cc3366;" onclick="wysiwyg_addtag('span', null, null, null, 'cc3366')">Fuchsia pink</a></li> 
       <li><a href="javascript:;" onclick="wysiwyg_toggle('wtgl_color');"><i class="fa fa-ellipsis-h"></i></a></li> 
      </ul> 
     </div> 
     <div class="wysiwyg-editor-toolbar-menu hover-button-drop-down"> 
      <button class="wysiwyg-editor-toolbar-menu menu-button">Font <i class="fa fa-caret-down"></i></button> 
      <ul class="wysiwyg-editor-toolbar-menu drop-down-menu"> 
       <li><a href="javascript:;">Default</a></li> 
      </ul> 
     </div> 
     <button class="wysiwyg-editor-toolbar-menu menu-button" onclick="wysiwyg_toggle('wtgl_info')"><i class="fa fa-info"></i></button> 
    </div> 
    <div class="wysiwyg-editor-contents" id="wysiwyg_ce_ead" contenteditable="true"></div> 
    &nbsp; 
    <div class="wysiwyg-scenes"> 
     <div class="scene" id="wtgl_link"> 
      <div class="wysiwyg-scenes-tables"> 
       <div class="tr"> 
        <div class="td" style="width:120px;">Link url:</div> 
        <div class="td"><input type="text" id="wysiwyg-link-href" placeholder="Must start with &quot;http://&quot;" /></div> 
       </div> 
       <div class="tr"> 
        <div class="td">Text:</div> 
        <div class="td"><input type="text" id="wysiwyg-link-text" placeholder="Describe the link" /></div> 
       </div> 
       <div class="tr"> 
        <div class="td"></div> 
        <div class="td"> 
         <button onclick="wysiwyg_addtag('a', 'wysiwyg-link-href', 'wysiwyg-link-text');wysiwyg_toggle('wtgl_link')">Add link</button> 
         <button type="reset" onclick="wysiwyg_toggle('wtgl_link')">Cancel</button> 
        </div> 
       </div> 
      </div> 
     </div> 
     <div class="scene" id="wtgl_color"> 
      <div class="wysiwyg-scenes-tables"> 
       <div class="tr"> 
        <div class="td">Custom HTML Color:</div> 
       </div> 
       <div class="tr"> 
        <div class="td"><input type="text" id="wysiwyg-text-color" maxlength="6" 
        onkeypress="if(this.value == '#' || this.value==' '){ this.value = ''; }" onblur="if(this.value == '#' || this.value==' '){ this.value = ''; }" 
        placeholder="Without the '#'" /></div> 
       </div> 
       <div class="tr"> 
        <div class="td"> 
         <button onclick="wysiwyg_addtag('span', null, null, null, 'wysiwyg-text-color');wysiwyg_toggle('wtgl_color')">Add</button> 
         <button type="reset" onclick="wysiwyg_toggle('wtgl_color')">Cancel</button> 
        </div> 
       </div> 
      </div> 
     </div> 
     <div class="scene" id="wtgl_info"> 
      <div class="wysiwyg-scenes-tables"> 
       <div class="tr"> 
        <div class="td"> 
         <p><strong>Untitled WYSIWYG</strong></p> 
         <p>Text editor</p> 
         <p>v0.1</p> 
         <p> 
         Written &amp; Developed by <a href="http://stackoverflow.com/users/6247920/natanel97">@natanel97</a></p> 
         <p> 
          <br /> 
          <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"> 
           <img alt="Creative Commons license" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" /> 
          </a> 
          <br /> 
          <span style="font-size:11.6px;">This work is licensed under a 
           <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"> 
           Attribution-NonCommercial-ShareAlike 4.0 International </a>. 
          </span> 
          <br /> 
         </p> 
         <button type="reset" onclick="wysiwyg_toggle('wtgl_info')">Close</button> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</section> 

자바 스크립트 :

function wysiwyg_convert() { 

    var wysiwyg_textarea = document.querySelector('.wysiwyg-editor textarea'); 
    var wysiwyg_div_edit = document.querySelector('.wysiwyg-editor .wysiwyg-editor-contents'); 

    wysiwyg_div_edit.onkeypress = function() { 

     if(wysiwyg_textarea.value != wysiwyg_div_edit.innerHTML) { 

      wysiwyg_textarea.value = wysiwyg_div_edit.innerHTML; 

     } 

     else { 

      if(wysiwyg_div_edit.innerHTML != wysiwyg_textarea.value) { 

       wysiwyg_div_edit.innerHTML = wysiwyg_textarea.value; 

      } 

     } 

    } 

} 

function wysiwyg_addtag(tag, href, title, fontsize, color) { 

    var tag; 
    var wysiwyg_div_edit = document.querySelector('.wysiwyg-editor .wysiwyg-editor-contents'); 

    if(tag == 'strong' || tag == 'em' || tag == 'ins') { 

     wysiwyg_div_edit.innerHTML = wysiwyg_div_edit.innerHTML + ' <' + tag + '>Text</' + tag + '>'; 

    } 

    else if(tag == 'img' || tag == 'br') { 

     if(tag == 'img') { 

      wysiwyg_div_edit.innerHTML = wysiwyg_div_edit.innerHTML + ' <' + tag + ' src="' + href + '" alt="' + title + '" />'; 

     } 

     if(tag == 'br') { 

      wysiwyg_div_edit.innerHTML = wysiwyg_div_edit.innerHTML + ' <' + tag + ' />'; 

     } 

    } 

    else { 

     if(tag == 'a') { 

      var href = document.getElementById(href).value; 
      var htxt = document.getElementById(title).value; 

      if(href != null) { 

       wysiwyg_div_edit.innerHTML = wysiwyg_div_edit.innerHTML + ' <' + tag + ' href="' + href + '">' + htxt + '</' + tag + '>'; 

      } 

     } 

     if(tag == 'span') { 

      if(fontsize != null) { 

       wysiwyg_div_edit.innerHTML = wysiwyg_div_edit.innerHTML + ' <' + tag + ' style="font-size:' + fontsize + 'pt;">Text</' + tag + '>'; 

      } 

      else if(color != null) { 

       if(document.getElementById('wtgl_color').style.display == 'block') { 

        var color = document.getElementById(color).value; 

       } 

       wysiwyg_div_edit.innerHTML = wysiwyg_div_edit.innerHTML + ' <' + tag + ' style="color:#' + color + ';">Text</' + tag + '>'; 


      } 

     } 

    } 

} 

function wysiwyg_save() { 

    // enable it only for testing purposes 

    var wysiwyg_textarea = document.querySelector('.wysiwyg-editor textarea'); 
    alert(wysiwyg_textarea.value); 

} 

function wysiwyg_toggle(id) { 

    var id = document.getElementById(id); 

    if(id.style.display == 'block') { 

     id.style.display = 'none'; 

    } 

    else { 

     id.style.display = 'block'; 

    } 

} 

document.addEventListener('DOMContentLoaded', function() { 

    wysiwyg_convert(); 

}); 

내가 원하는 선택한 텍스트를 수신 할 함수를 생성하려면 div 내부에서 선택하고 스타일 버튼 중 하나를 누르면 다음과 같이됩니다 : <someHTMLtag [...]>Selected Text</someHTMLtag>.

이미 가지고있는 기능을 사용하여 만들 수 있습니까? wysiwyg_addtag 안에 코드를 추가 할 수 있습니까? 내가 할 수 있다면, 어떻게?

+0

:

여기에 방법에 대한 몇 가지 문서입니다. –

+0

[강조/선택한 텍스트 가져 오기] 가능한 복제본 (http://stackoverflow.com/questions/5379120/get-the-highlighted-selected-text) –

답변

1

자바 스크립트 호출 된 윈도우 방법이 내장되어 window.getSelection()

당신은 그 다음이 선을 만드는 것만 큼 쉬운 것입니다 그래서

var text = window.getSelection().toString();

같은 문자열로 선택한 텍스트를 설정하려면이 옵션을 사용할 수 있습니다

그래서 코드 같은

var replace = "<b>" + text + "</b>"

그리고 주입 t 모자를 HTML에 삽입하십시오. 그러나 일종의 XSS를 방지하기 위해 입력을 정화하는 것이 현명한 방법입니다. 당신은 당신이 jQuery를 사용하는 경우 https://github.com/localhost/jquery-fieldselection에서 살펴 봐야 할 수 있습니다 https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection

+0

안녕하세요, 감사합니다. 그러나 어떤 이유로 내가 다음과 같은 것을 할 때 :'var selected_text = window.getSelection(). toString(); if (selected_text) {if (tag == 'strong') {wysiwyg_div_edit.innerHTML = wysiwyg_div_edit.innerHTML + '<' + tag + '>'+ selected_text + ''; } '선택한 텍스트로 스타일이 지정된 모든 데이터를 덮어 쓰거나 스타일이 지정된 텍스트 (또는 이전) 다음에 원래 스타일의 복사본을 만듭니다. 이 문제를 어떻게 해결할 수 있습니까? 고마워요. ([내 뜻은 여기를보십시오] >>) – natanelg97

+0

원본 텍스트를 문자열 변수에 할당 한 다음 .innerHTML에 대한 이중 참조를 제거한 다음 (예 : innerHTML을 다시 참조하는 대신 변수를 편집하고 삽입하는 방법 – Akjm

관련 문제