Was ist der beste Weg, zu laden, einen string (HTML-code) im TWebBrowser?
Habe ich eine string-var 'HTMLCode' enthält HTML-code. Ich möchte zum laden von code in den browser ein.
Dies ist Embarcadero-code:
procedure THTMLEdit.EditText(CONST HTMLCode: string);
{VAR
Doc: IHTMLDocument2;
TempFile: string; }
begin
TempFile := GetTempFile('.html');
StringToFile(TempFile, HTMLCode);
wbBrowser.Navigate(TempFile);
Doc := GetDocument;
if Doc <> NIL
then Doc.Body.SetAttribute('contentEditable', 'true', 0); //crash here when I load complex html files
DeleteFile(TempFile);
end;
Es hat einige Probleme so ersetzte ich es mit diesem hier:
procedure THTMLEdit.EditText(CONST HTMLCode: string);
VAR
TSL: TStringList;
MemStream: TMemoryStream;
begin
wbBrowser.Navigate('about:blank');
WHILE wbBrowser.ReadyState < READYSTATE_INTERACTIVE
DO Application.ProcessMessages;
GetDocument.DesignMode := 'On';
if Assigned(wbBrowser.Document) then
begin
TSL := TStringList.Create;
TRY
MemStream := TMemoryStream.Create;
TRY
TSL.Text := HTMLCode;
TSL.SaveToStream(MemStream);
MemStream.Seek(0, 0);
(wbBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(MemStream));
FINALLY
MemStream.Free;
end;
FINALLY
TSL.Free;
end;
end;
end;
Aber dafür hat man auch Probleme . Erste, wenn ich links einfügen (...) in den HTML-code, den der browser den code ändern, Anhängen 'about:' vor meinen URLs. Zweitens: es ist langsamer als das erste Verfahren (mit temp-Datei).
Kann ich das laden von HTML-code im browser ohne Navigation zunächst auf 'about:blank'?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie Ihren laden
HTML
code wie der unten<base href=...>
tag in derHTML
links.Ihre Qustions:
Erste, wenn ich links einfügen (...) in den HTML-code, den der browser den code ändern, anfügen von 'about:' vor meinen URLs.
Zweiten: es ist langsamer als das erste Verfahren (mit temp-Datei).
Kann ich das laden von HTML-code im browser ohne Navigation zunächst auf " about:blank'?
Antworten:
Beginnen wir mit dem code und der ersten Prozedur (nur um zu zeigen, wo das in etwa: ...) kommt.
Haben wir erstellt 2 Dateien (sind identisch) Skript nur abweicht, um eine Warnung zu laden.
bearbeiten1.html
bearbeiten3.html
Mit Klick auf Datei Laden wir laden die "bearbeiten1.html" Datei
und mit WB_LoadHTML wir in den Arbeitsspeicher zu laden.
bekommen wir URL : about:blank
und die Warnung
nun erstellen wir eine Verknüpfung:
wir wählen den blau Rahmen, und klicken Sie auf createlink
Den link erstellt
und auch die neue "Dok.Körper.innerHTML"
So weit, So gut ! Aber wird es funktionieren...? Keine
Nach einem Klick auf den link-alles, was wir bekommen ist eine leere Seite mit der URL:
Nun versuchen wir die neuen EditText() code
Mit klicken auf "Datei Laden" laden wir das "bearbeiten1.html" die Datei wieder
und mit EditTextBtnClick wir laden es direkt.
Sieht viel besser aus! Wird es funktionieren ...?
Let ' s klicken Sie auf den link ! Bekommen wir die Warnung !! aus Nr. ...3.html"
und die .html-Datei wird geladen, ohne problem.
Zu deinem anderen problem
Du hast es an der falschen Stelle das Körper ist nur verfügbar, nachdem die Seite geladen ist !!
Damit ich ihn im Falle WebBrowserNavigateComplete2
Nur eine schnelle Lösung verbessert werden kann
Der vollständige code.
UPDATE:
Ich habe vergessen zu setzen, das Tempfile Pfad in den code eingeben (copy paste Fehler).
Auch FormCreate Hinzugefügt.
und nur ein einziges mal laden das TempFile zweimal! (siehe code)
Wichtig in der Kopf tag der TempFile muss ein link
bearbeiten1.html gleiche wie bearbeiten3.html nur
alert ("bearbeiten3.html");
muss angepasst werden !!bearbeiten1.html
maor.css
Doc.execCommand('createlink', false,'bearbeiten3.html');
Es ist nur der name bearbeiten3.html benötigt und es wird die Datei finden, egal wie lange die Weg ist !! (natürlich muss die Datei im gleichen Dir oder unten! folder1/bearbeiten3.html wird auch funktionieren.Die einfachste Möglichkeit zum anzeigen von HTML-code in Delphi: