7 Stimmen

Einschließlich des Renderings eines HTML-Dokuments in ein anderes HTML-Dokument

Ich habe eine Zeichenfolge, die ein eigenständiges (und gültiges XHTML 1.0 Strict) HTML-Dokument darstellt, etwa so

var html = "<?xml ... <!DOCTYPE ... <html><head><style>...</style></head>
                  <body><table>...</table></body></html>";

Der Body dieses HTML-Dokuments enthält eine Tabelle, deren CSS-Stil im Kopf des HTML-Dokuments beschrieben ist.

Ich habe auch einen DOM-Baum eines anderen HTML-Dokuments. Wie kann ich in diesen DOM-Baum den DOM-Baum der Tabelle mit dem richtigen Stil (wie in der HTML-Zeichenfolge beschrieben) einfügen?

Ich bin besonders an einer jQuery-basierten Lösung interessiert.

EDIT : Um konkreter zu werden, ein Beispiel für eine HTML-Zeichenkette, von der ich spreche ist eingebettet in dieses XML-Dokument .

17voto

DanSingerman Punkte 35071

Ich kann waaaay fehlen den Punkt, aber warum nicht laden Sie die Zeichenfolge in ein IFRAME zu rendern - dies löst alle Probleme mit zwei getrennten DOM-Bäume, und zwei separate Sätze von CSS-Regeln, zu mir.

Dieser Code wird es tun:

$(function() {
        var $frame = $('<iframe style="width:200px; height:100px; border: 0px;">');
        $('body').html( $frame );
        setTimeout( function() {
                var doc = $frame[0].contentWindow.document;
                var $body = $('body',doc);
                $body.html(your_html);
        }, 1 );
});

(die ich von hier übernommen habe: HTML in einen iframe einfügen (mit Javascript) )

Wenn Sie sich Sorgen um die Größe des IFRAME machen, können Sie sie mit festlegen:

$frame[0].style.height = $frame[0].contentWindow.document.body.offsetHeight + 'px';
$frame[0].style.width = $frame[0].contentWindow.document.body.offsetWidth + 'px';

4voto

KyleFarris Punkte 16918

Es macht keinen Sinn, zwei vollständige DOM-Bäume auf derselben Seite zu haben, also sollten Sie das herausnehmen, was Sie brauchen, und nur das verwenden.

Konvertieren Sie die Zeichenkette in ein jQuery-Objekt und analysieren Sie, was Sie benötigen, wie folgt:

var html = "<html><head><style>...</style></head>
            <body><table>...</table></body></html>";

// Not sure if you are a trying to merge to DOMs together or just
// trying to place what you want on the page so, I'm going to go
// with the former as it may be more tricky.
var other_html = "<html><head><style>...</style></head>
                   <body><!-- some stuff --></body></html>";

var jq_html = $(html);
var jq_other_html = $(other_html);

var style = jq_html.find('head').find('style');
var table_and_stuff = jq_html.find('body').html();

jq_other_html.find('head').append(style).end().append(table_and_stuff);

Das sollte wohl genügen. Das CSS sollte automatisch vom Browser erkannt werden, sobald es in die Seite eingefügt ist.

HINWEIS:
Damit das neue CSS-Stylesheet nur neue Stile hinzufügt und Ihre aktuellen Stile nicht überschreibt, müssen Sie vorangestellt das Blatt mit dem Head-Tag und nicht anhängen. es. Die letzte Zeile müsste also stattdessen so lauten:

jq_other_html.find('head').prepend(style).end().append(table_and_stuff);

1voto

KyleFarris Punkte 16918

Anstatt meine andere Antwort zu verbessern, mache ich lieber eine neue, da ich sie im Grunde umschreiben muss, damit sie so funktioniert, wie Sie es wollen, und die alte Antwort den Leuten vielleicht aus anderen Gründen hilft...

Nachdem Sie also die HTML-Zeichenkette aus der XML-Datei, auf die Sie verweisen, extrahiert haben, können Sie sie wie folgt weiterverwenden:

// First we'll extract out the parts of the HTML-string that we need.
var jq_html = $(html_from_xml);
var style = jq_html.find('head').find('style').html();
var style_string = style.toString();
var table_and_stuff = jq_html.find('body').html();

// If you want to place it into the existing page's DOM,
// we need to place it inside a new DIV with a known ID...
$('body').append('<div id="new_stuff"></div>');
$('#new_stuff').html(table_and_stuff);

// Now, we need to re-write the styles so that they only
// affect the content of the 'new_stuff' DIV:
styles_array = style_string.split('}');
var new_styles = '';
$.each(styles_array,function(i) { 
    if(i<(styles_array.length-1)) { 
        new_styles += "#new_stuff "+styles_array[i]+"}"; 
    }
})
$('head').append('<style type="text/css">'+new_styles+'</style>');

Und das sollte wirklich genügen. Der Trick ist, dass CSS den spezifischsten Stil für den jeweiligen Fall wählt. Wenn Sie also eine <td> innerhalb des "newstuff"-Divs, wird der Stil aus dem neuen Stylesheet übernommen. Wenn Sie eine <td> außerhalb dieses "newstuff"-Divs wird der alte Stil verwendet.

Ich hoffe, damit ist Ihr Problem gelöst.

1voto

hasen Punkte 154413

Fügen Sie sie in einen Inline-Rahmen ein.

Mit einer Frage, die ich bereits gestellt habe Ich habe eine Lösung wie diese:

Erstellen Sie zunächst einen iframe mit einer id

<iframe id="preview" src="/empty.html"></iframe>

Dann stylen Sie es:

iframe#preview
{
    margin: 30px 10px;
    width: 90%;
    height: 800px;
}

Und hier ist eine Funktion zum Einfügen eines HTML-Textes in diesen Rahmen (verwendet Jquery)

function preview( html )
{
    var doc = $("#preview")[0].contentWindow.document
    var body = $('body',doc)
    body.html( html );    
}

Damit habe ich den Inhalt der HTML-Datei erfolgreich gerendert, einschließlich der eingebetteten Css-Dateien.

1voto

Amit Punkte 795

Hier ist mein Code, der das tut, was Sie beschrieben haben. Zwei Dinge zu beachten

  1. Aus irgendeinem Grund find() funktionierte nicht auf die "on-the-fly" dom, die ich von Jquery-Objekt bekam, kann jemand herausfinden, was bin ich falsch dort tun
  2. Zur Veranschaulichung habe ich diesen neuen Bereich an das Element "body" angehängt. Sie können es genauso gut an Ihre zweite Domäne anhängen

   var insertStr = "your string here";

   var newDom = $(insertStr); // getting [meta style table.drs]

   // I had to use the array as newDom.find would not work for me which I was expecting would work
   var styleText = $(newDom[1]).text();
   var tableElm = $(newDom[2]);
   $(newDom[2]).appendTo('body');

   var selectors = styleText.split(/{[\s\w\.\(\)':;"#%=/-]*}/);

   var styles = styleText.match(/{[\s\w\.\(\)':;"#%=/-]*}/g);

   for ( var i =0; i < styles.length; i++ ) {
       var style = styles[i];

       style = style.replace("{","");

   style = style.replace("}","");

   if ( selectors[i].indexOf("table.drs") > -1 ) { // identify top-level elm
       // apply to self
       tableElm.attr('style',style);

   } else {

       // apply to its children
       tableElm.find(selectors[i]).attr('style',style);

   }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X