을 지금이 내가 생각 해낸 것입니다 :
$.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('&', '&').replace('<', '<').replace('>', '>').replace('"', '"');
}
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);
};
덕분에 마커와 힌트에 대한 다운 @ 팀에, 그 중요한 단서였다!
링크 된 답변을 시도 할 때 정확히 작동하지 않는 것은 무엇입니까? 우리가 볼 수있는 예제가 있습니까? –
다음은 예제입니다 : http://jsfiddle.net/g7KJ5/'잡히지 않는 타입 오류 : null의 previousSibling '속성을 읽을 수 없습니다. – eWolf
@Tim : 이것을 고칠 수 있다면 정말 대단합니다 :-) – eWolf