0

わかりましたので、私は先週かそこらで取り組んできた問題を抱えており、私が知っている、または見つけることができるすべてを試しました。私は YUI 2.x エディターを使用しており、ユーザーは重い書式設定を行っています。<span>ユーザーがクリックしたときに選択したテキストをラップする必要があるページに外部ボタンがありますが、書式設定を失うことなくこれを行う必要があります。何らかの理由で、次のようにすると、選択範囲内のすべての書式設定が消去されます。

var sel = myEditor._getSelection();
var newEl = '<span>' + sel + '</span>';
myEditor.execCommand('inserthtml', newEl);

_getSelectedElement()したがって、これを解決するには、 withを使用し_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 ボタンのように動作する必要がありますが、 a<span>と は使用しません<b>。なぜこれが難しいのですか?

アイデアや提案はありますか?ありがとう!

4

2 に答える 2

1

あなたがしなければならないのは、次のことだけです。

myEditor._createCurrentElement('span');
newEl = myEditor.currentElement[0];

_createCurrentElement現在の選択内容を innerHTML として内部的に新しい要素を作成し、書式設定を保持します。とてもシンプルです...Dav Glass の助けに感謝します。ここで彼の投稿をチェックしてください: http://yulibrary.com/forum/viewtopic.php?f=89&t=5436&p=18659#p18659

于 2010-11-02T14:18:23.650 に答える
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);
}
于 2012-09-11T10:14:22.583 に答える