2012-12-27 4 views
1

document.execCommand("unlink", false, false);을 사용하여 자체 HTML 편집기에서 하이퍼 링크와 앵커를 제거합니다. 그것은 하나의 경우를 제외하고는 잘 동작합니다 : 그것은 Firefox에서 앵커를 제거하지 않습니다. 이것은 Firefox에서 지원되지 않습니까? 아니면 이것을 해결할 다른 방법이 있습니까?document.execCommand ('unlink')가 Firefox의 앵커에 대해 작동하지 않습니다.

<div contenteditable="true">This is an <a name="anker">anchor</a>. And this is a <a href="#">normal hyperlink</a>. Please try to select them and then press the "Unlink" button.</div> 

<input type="button" id="btn" value="Unlink"> 

$(document).ready(function() {  
    $('#btn').click(function() { 
     document.execCommand("unlink", false, false); 
    }); 
}); 

Check it out on Fiddle

+3

기술적으로 'href'가 없다면 링크인가요? –

+1

왜 ''요소에 여전히 'onclick' 핸들러가 있습니까? 그것은 다른 무언가를합니까 아니면 그냥 중복입니까? 어쨌든 좋은 스타일로 간주되지 않습니다. jQuery를 사용하여 이벤트 핸들러를 바인딩하는 것이 좋습니다. – wnstnsmth

+0

죄송합니다, 이것은 중복되었습니다 ... 삭제하는 것을 잊었지만 지금은 없어졌습니다. – vso

답변

3

이 대안이 무엇인지에 대한 질문에 대답하기 위해 당신이 unlink를 호출하기 전에이 문제를 강제하고 a 요소의 href 속성을 설정할 수 있습니다 :

$(document).ready(function() {  
    var $editable = $('[contenteditable]'); 

    $('#btn').click(function() { 
     $editable.find('a:not([href])').attr('href', '#'); 
     document.execCommand("unlink", false, false); 
    }); 
}); 
여기

내 예제

http://jsfiddle.net/Bz7pR/7/

물론 문제를 "해결하는"방법은 여러 가지가있을 수 있습니다. 나는 $.unwrap()이 아마 잘 작동한다고 생각합니다. 나는 document.execCommand과 리치 텍스트 에디터에 정통하지는 않지만, 조심스럽고 정확해야하며 테스트 테스트 테스트가 필요하다고 상상해보십시오.

참고로 이는 데모입니다. 당신은 정말로 그것에 대해 생각하고 그 문제를 어떻게 처리 할 것인지 정확히 생각해야합니다. 예를 들어 파이어 폭스가 브라우저 일 경우에만이를 감지하고 실행할 수 있습니다. 이로 인해 예기치 않은 손상이나 결과가 제한 될 수 있습니다. 여기에 편집

그리고

는 선택한 텍스트 범위에 영향을 미치는보다 완벽한 버전입니다 : 그것은 범위를 텍스트에 관해서

$(document).ready(function() {  
    $('#btn').click(function unlink() { 
     var holder, 
      frag, 
      range, 
      child; 

     if (window.getSelection && window.getSelection().getRangeAt) { 
      holder = document.createElement('div'); 
      frag = document.createDocumentFragment(); 
      range = window.getSelection().getRangeAt(0); 

      $(holder) 
       .append(range.cloneContents()) 
       .find('a:not([href])') 
       .attr('href', '#'); 

      while ((child = holder.firstChild)) { 
       frag.appendChild(child); 
      } 

      range.deleteContents(); 
      range.insertNode(frag); 
     } 

     document.execCommand("unlink", false, false); 
    });  
}); 

http://jsfiddle.net/Bz7pR/12/

내가 더 천재는 아니지만 및 선택 사항이므로이 대답에있는 코드를 수정했습니다.

https://stackoverflow.com/a/6252893/451969

위의 내용을 생각해 내십시오. 다른 사람이 잘못되었거나 일관성이없는 것을 본다면 아래에 의견을 남겨주세요.

+0

이것은 좋은 생각입니다! 이제는 생각할 단 한 가지가 있습니다. 사용자 선택 영역 내에있는 앵커 만 제거하고 싶습니다. 제안 된 솔루션은 이것을 제공하지만 조금 부작용으로이 div 내부의 모든 앵커는 href attr을 얻습니다. 선택하지 않은 텍스트의 코드를 변경하지 않을 수 있습니까? 불행히도 jQuery를 통해 선택한 텍스트 (포함 된 요소 만 편집)를 처리하는 것은 그렇게 간단하지 않습니다. http://jsfiddle.net/Bz7pR/8/ – vso

+0

@vso - 내 편집을 참조하십시오. 여러 선택 항목으로 작동하는지 여부는 확실하지 않습니다. 위의 내용은 IE, Firefox, Chrome에서는 작동하지만 Opera에서는 작동하지 않습니다. –

+0

대단히 감사합니다! 마지막 하나는 정상적으로 작동하며 필자가 필요로하는 것입니다. 파이어 폭스에서만 실행되는 브라우저 감지와 결합 된 것입니다. – vso