2010-12-15 5 views
1

기본적으로 매우 간단한 작업을하고 싶습니다. 사용자가 트윗을 입력하고 140 자 후에 회색으로 표시 될 텍스트를 잘라 내고 싶습니다. 은 간단해야합니까?입력 할 때 contentEditable 요소 형식을 지정하십시오.

형식화에 contentEditable 속성을 사용하고 있습니다. keyup 이벤트에서 텍스트가 너무 긴지 확인한 후 여분의 문자를 <span>으로 옮깁니다. 그러나 선택은 길을 잃게됩니다.

나는 이미 많은 것을 시도했으나 (this 포함) 아무런 효과가 없었습니다. 도와 주실 수 있습니까? 나는 당신이 실제 사례를 줄 수 있다면 그것이 가장 도움이 될 것 같아요.

+0

링크 된 답변을 시도 할 때 정확히 작동하지 않는 것은 무엇입니까? 우리가 볼 수있는 예제가 있습니까? –

+0

다음은 예제입니다 : http://jsfiddle.net/g7KJ5/'잡히지 않는 타입 오류 : null의 previousSibling '속성을 읽을 수 없습니다. – eWolf

+0

@Tim : 이것을 고칠 수 있다면 정말 대단합니다 :-) – eWolf

답변

1

내가 관심을 가져서 이것을 사용했습니다. 그것은 귀찮게 많은 양의 코드이지만, 그것이 바로 그 것이다. 내 새 버전은 Rangy의 saveSelection()을 사용하지 않지만 IE 호환성을 위해 브라우저 간 Range 지원을 사용합니다. 이 게시물을 여기에 너무 많은 코드, 그래서 나는 jsfiddle 링크 단지 것 : 이미 조이를 이메일로 http://jsfiddle.net/timdown/g7KJ5/9/

+0

불행히도 내 문제를 해결해 주셔서 감사합니다. 솔루션이 제대로 작동하지 않는 것 같습니다. 그것의 일부는 500ms 지연에 의해 야기 될 수 있습니다 (정말로 필요합니까?), 때로는 초점을 잃을 수도 있습니다. Btw :이 기능을 Chrome 확장 프로그램에 사용하므로 교차 브라우저 지원이 필요하지 않습니다. – eWolf

+0

나는 고백해야한다, 나는 그것에 정말로 만족하지 않았고, 충분히 시험하지 않았다. 타이핑 할 때 느려지는 것을 방지하기 위해 어떤 종류의 지연이 일반적으로 좋은 생각이라고 생각합니다. 나는 그것을 시도하고 향상시킬 수도있다. –

+0

아래에 게시 한 답변을 살펴 보겠습니다. 다른 방법으로 해결했습니다. – eWolf

0

을 지금이 내가 생각 해낸 것입니다 :

$.fn.softlimit = function(maxChars, wrapElement, wrapAttributes) { 
    var lastHTML, that = this[0]; 

    setInterval(function() { 
     //Only trigger on change 
     if (lastHTML == that.innerHTML) return; 
     lastHTML = that.innerHTML; 

     // Save the selection 
     var savedSel = rangy.saveSelection(); 

     // Strip HTML and extract rangy markers 
     var markers = [ ], text = '', htmlPos = 0; 

     function escapeForHTML(text) { 
      return text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;'); 
     } 

     function processNode(node) { 
      if (node.nodeType == 3) 
       text += escapeForHTML(node.nodeValue); 
      else if (node.nodeName == 'SPAN' && node.id && node.id.indexOf('selectionBoundary_') === 0) 
       markers.push({ index: text.length, html: node.outerHTML }); 
      else 
       for (var i = 0; i < node.childNodes.length; ++i) 
        processNode(node.childNodes[i]); 
     } 

     processNode(that); 

     // Do formatting 
     var getOffset, markerOffset = 0; 

     if (text.length > maxChars) { 
      var startTag = '<' + wrapElement + ' ' + wrapAttributes + '>'; 
      var endTag = '</' + wrapElement + '>'; 

      text = text.substr(0, maxChars) + startTag + text.substr(maxChars) + endTag; 

      getOffset = function(index) { 
       if (index > maxChars) return startTag.length; 
       else return 0; 
      }; 
     } 
     else 
      getOffset = function() { return 0; }; 

     // Re-inject markers 
     for (var i = 0; i < markers.length; ++i) { 
      var marker = markers[i]; 
      var index = marker.index + getOffset(marker.index) + markerOffset; 

      text = text.substr(0, index) + marker.html + text.substr(index); 
      markerOffset += marker.html.length; 
     } 

     that.innerHTML = text; 

     // Restore the original selection 
     rangy.restoreSelection(savedSel); 
    }, 20); 

    return $(this); 
}; 

덕분에 마커와 힌트에 대한 다운 @ 팀에, 그 중요한 단서였다!

관련 문제