Unbenannt1: Ermitteln, was verwendeter Browser bei execCommand(...) einfügt

Ich möchte ermitteln, was der verwendete Browser zum Beispiel bei execCommand("italic", false, null); einfügt. Ich bereits versucht, es einfach "auszuprobieren", indem ich eine iframe mit dem Inhalt <html><head></head><body>hallo</body></html> erstelle, aber ich schaffe es nicht, den Text im Firefox zu markieren (im IE funktioniert es). Außerdem weiß ich nicht ob es nicht eine schönere Lösung für dieses Problem gibt.

Der Code zum Markieren lautet

if(document.selection) {
                var range = testdoc.body.createTextRange();
                range.moveToElementText(testdoc.body);
                range.select();
}
else if(window.getSelection) {
                var range = testdoc.createRange();
                range.selectNode(testdoc.body);
                window.getSelection().addRange(range);
}

  1. var range = testdoc.createRange();
                    range.selectNode(testdoc.body);
                    window.getSelection().addRange(range);

    Verwendest du auch das window-Objekt des iframes? Anscheinend nicht. window verweist üblicherweise auf das aktuelle window-Objekt, nicht auf das window-Objekt des Dokuments im iframe.

    iframeElement.contentWindow liefert dir das window-Objekt
    oder
    iframeElement.contentDocument.defaultView
    oder einfach
    http://de.selfhtml.org/javascript/objekte/frames.htm@title=frames.iframeName

    Mathias

    1. var range = testdoc.createRange();
                      range.selectNode(testdoc.body);
                      window.getSelection().addRange(range);

      Verwendest du auch das window-Objekt des iframes? Anscheinend nicht. window verweist üblicherweise auf das aktuelle window-Objekt, nicht auf das window-Objekt des Dokuments im iframe.

      iframeElement.contentWindow liefert dir das window-Objekt
      oder
      iframeElement.contentDocument.defaultView
      oder einfach
      http://de.selfhtml.org/javascript/objekte/frames.htm@title=frames.iframeName

      Mathias

      if(document.selection) {
                      var range = testdoc.body.createTextRange();
                      range.moveToElementText(testdoc.body);
                      range.select();
      }
      else if(window.getSelection) {
                      var range = testdoc.createRange();
                      range.selectNode(testdoc.body);
                      testframe.contentWindow.getSelection().addRange(range);
                      alert("hallo2");
      }

      Danke, funktioniert aber immer noch nicht.

      1. Danke, funktioniert aber immer noch nicht.

        Dann machst du noch etwas anderes falsch.

        Beispiel:

        foo.html

        <!DOCTYPE html>  
        <p><iframe name="iframe" src="bar.html"></iframe></p>  
        <script>  
        [code lang=javascript](function () {  
          var iWindow = window.frames.iframe;  
          iWindow.onload = loaded;  
          
          function loaded () {  
            var iDocument = iWindow.document;  
            if (iDocument.selection) {  
              var range = iDocument.body.createTextRange();  
              range.moveToElementText(iDocument.body);  
              range.select();  
            } else if (iWindow.getSelection) {  
              var range = iDocument.createRange();  
              range.selectNode(iDocument.body);  
              var selection = iWindow.getSelection();  
              selection.addRange(range);  
            }  
          }  
        })();
        

        </script>[/code]

        bar.html

        <!DOCTYPE html>  
        <html>  
        <body>  
          <p>bar</p>  
        </body>  
        </html>
        

        Funktioniert wie erwartet. Allerdings nicht lokal über file://, da werfen einige Browser eine Fehlermeldung wegen Verletzung der Same-Origin Policy.

        Übrigens geht auch einfach:

        var selection = iWindow.getSelection();  
        selection.selectAllChildren(iDocument.body);
        

        Eine Range musst du nicht unbedingt anlegen und hinzufügen. selectAllChildren der Selection reicht.

        Mathias

        1. Übrigens geht auch einfach:

          var selection = iWindow.getSelection();

          selection.selectAllChildren(iDocument.body);

          
          >   
          > Eine Range musst du nicht unbedingt anlegen und hinzufügen. selectAllChildren der Selection reicht.  
          >   
          > Mathias  
            
          Danke, mit selectAllChildren funktioniert es jetzt.