2010-08-03 19 views
6

Ich baue einen WYSIWYG-Editor mit einem editierbaren iFrame mit document.execCommand(). Jetzt muss ich den "insertHTML" Befehl verwenden, die perfekt in Chrome und Firefox funktioniert, aber natürlich ist es nicht in Internet Explorer arbeiten:execCommand ("insertHTML", ...) im Internet Explorer

function run() { 
 
    document.getElementById("target").focus(); 
 
    document.execCommand("insertHTML", false, "<b>ins</b>"); 
 
}
<div contenteditable id="target">contenteditable</div> 
 
<button onclick="run()">contenteditable.focus() + document.execCommand("insertHTML", false, "&lt;b>ins&lt;/b>")</button>

Was ist die Standardlösung für dieses Problem? Es ist in Ordnung, wenn es nur in IE8 funktioniert, aber IE7-Unterstützung wäre auch nett.

+0

[Diese] (https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7536602/) [Fehlermeldungen] (https://github.com/yabwe/ medium-editor/issues/771 # issuecomment-182233090) implizieren, dass Edge execCommand ("insertHTML", ..) unterstützt (allerdings mit eigenen Macken). – Nickolay

Antwort

14

In IE < = 10 können Sie die pasteHTML Methode der die Auswahl darstellt TextRange verwenden:

var doc = document.getElementById("your_iframe").contentWindow.document; 

if (doc.selection && doc.selection.createRange) { 
    var range = doc.selection.createRange(); 
    if (range.pasteHTML) { 
     range.pasteHTML("<b>Some bold text</b>"); 
    } 
} 

UPDATE

In IE 11, document.selection ist weg und insertHTML wird noch nicht unterstützt, Sie benötigen also beispielsweise Folgendes:

https://stackoverflow.com/a/6691294/96100

+0

IE scheint den Text ganz oben auf der Seite hinzuzufügen. Irgendeine Idee, warum es nicht in dem von var doc angegebenen iframe platziert wird? – tundoopani

+0

@tundoopani: Nicht ohne mehr Kontext. Hast du eine Beispielseite? –

+0

Ich habe hier eine einfache Version programmiert: http://jsfiddle.net/MWz7A/3/. In IE9 wird der Inhalt nicht im Iframe-Editor platziert. – tundoopani

3

Falls Sie noch nichts gefunden,

ich einen Knopf hatte, die HTML-Code in einem iframe hinzufügen würde, und wurde ein Fehler in IE8 zu verursachen, wenn ich den Knopf und kein Text ausgewählt wurde angeklickt (d als ich das blinkende Caret hatte). Es stellte sich heraus, dass der Button selbst selektiert wurde (obwohl wir unselectable = "on" gesetzt hatten) und Javascript den Fehler verursachte. Als ich den Button in ein div umwandelte (mit unselectable on), funktionierte es in IE8 und FF gut.

Hoffe, das hilft.

1
var doc = document.getElementById("your_iframe").contentWindow.document; 

// IE <= 10 
if (document.selection){ 
    var range = doc.selection.createRange(); 
     range.pasteHTML("<b>Some bold text</b>"); 

// IE 11 && Firefox, Opera ..... 
}else if(document.getSelection){ 
    var range = doc.getSelection().getRangeAt(0); 
    var nnode = doc.createElement("b"); 
     range.surroundContents(nnode); 
     nnode.innerHTML = "Some bold text"; 
}; 
+0

Die Methode 'pasteHTML' existiert nicht in' Bereich' Objekt, in meinem IE9 – Dinei

+0

Für diejenigen mit dem gleichen Problem ist die [@ David Antwort] (http://stackoverflow.com/a/27642361/3136474) die einzige eine, die für mich arbeitete. – Dinei

2

Ich weiß, das sehr alt ist, aber da IE immer noch ein Problem ist, ist hier eine bessere Art und Weise, die nicht einmal execCommand zu verwenden ist.

Es fehlen einige Überprüfungen, z. B. um sicherzustellen, dass Sie sich im richtigen Container befinden, um ein Bild hinzuzufügen.

var sel = window.getSelection(); 
var range = sel.getRangeAt(0); 
var frag = document.createDocumentFragment(); 
var img = document.createElement("img"); 
// add image properties here 

frag.appendChild(img); 
range.insertNode(frag); 
+1

Auch wenn dieses Thema alt ist, ist diese Antwort die einzige, die für mich funktioniert hat. Danke, indem du dein Wissen teilst. – Dinei

+0

IE8 nicht unterstützt – dexiang

+0

@dexiang Die einfache Möglichkeit ist es, IE8 und darunter nicht zu interessieren. :) – David

Verwandte Themen