好的,所以我有一个问题,我在上周左右一直在努力,并尝试了我知道或可以找到的一切。我正在使用YUI 2.x编辑器,用户将进行一些繁重的格式化。我在页面上有一个外部按钮,当用户点击它时,需要将所选文本包装在<span>
中,但是必须执行此操作,而不会丢失任何格式。出于某种原因,执行以下操作会删除选择中的所有格式:
var sel = myEditor._getSelection();
var newEl = '<span>' + sel + '</span>';
myEditor.execCommand('inserthtml', newEl);
因此,为了解决这个问题,我认为最好的方法是使用_getSelectedElement()
和_createCurrentElement('span')
来添加样式元素。这是我到目前为止所得到的:
function createSpan() {
var el = myEditor._getSelectedElement();
var sel = myEditor._getSelection();
// IE support
if (document.selection) {
sel = myEditor._getDoc().selection.createRange();
newText = sel.text;
}
else {
newText = sel;
}
// Create the new element with the old styles
myEditor._createCurrentElement('span', {color: el.style.color, fontSize: el.style.fontSize, fontFamily: el.style.fontFamily});
myEditor._selectNode(myEditor.currentElement[0]);
myEditor.currentElement[0].innerHTML = newText;
return myEditor.currentElement[0];
}
如果_getSelectedElement()
正确返回具有正确样式的元素,则效果很好,但我发现如果用户选择整个段落,它将返回BODY
。由于BODY
没有任何风格,它们再次迷失。
基本上,我需要它的行为类似于工具栏上的Bold按钮,但使用的是<span>
而不是<b>
。为什么这么难?
有任何想法或建议吗?谢谢!
答案 0 :(得分:1)
原则上你需要做的就是:
myEditor._createCurrentElement('span');
newEl = myEditor.currentElement[0];
_createCurrentElement
在内部创建一个新元素,当前选择为innerHTML,并为您保留格式。这么简单......感谢Dav Glass的帮助。
在这里查看他的帖子:http://yuilibrary.com/forum/viewtopic.php?f=89&t=5436&p=18659#p18659
答案 1 :(得分:0)
试试这个:
function toHTML(docFragment) {
var d = this._getDoc().createElement('div');
d.appendChild(docFragment);
return d.innerHTML;
}
var ie = false;
if (this._getWindow().getSelection) {
var selectedText = this._getWindow().getSelection();
} else if ( this._getDoc().getSelection ) {
var selectedText = this._getDoc().getSelection();
} else if ( this._getDoc().selection ) {
ie = true;
var selectedText = this._getDoc().selection.createRange();
}
if (!ie) {
var theParent = selectedText.getRangeAt(0).cloneContents();
var selection = toHTML(theParent);
} else {
var selection = selectedText.htmlText;
}
var span = this._getDoc().createElement('span');
span.innerHTML = selection;
if (!ie) {
var rang = selectedText.getRangeAt(0);
if ($.browser.mozilla) {
var rangeObj = this._getDoc().createRange();
var documentFragment = rangeObj.createContextualFragment(span.outerHTML);
} else {
var d = this._getDoc().createElement('div');
d.innerHTML = span.outerHTML;
var docFrag = this._getDoc().createDocumentFragment();
while (d.firstChild) {
docFrag.appendChild(d.firstChild);
};
var documentFragment = docFrag;
}
rang.collapse(false);
rang.deleteContents();
rang.insertNode(documentFragment);
} else {
this._getDoc().selection.createRange().pasteHTML(span.outerHTML);
}