Um einen bestimmten DOM-Knoten aus einer TChromium-Instanz in das aktuelle Webdokument einzubetten, verwenden Sie unter Verwendung seiner ID ICefDomDocument.getElementById(). Aber wie finden Sie Elemente durch das Attribut NAME? Javascript hat die document.getElementsByName() -Methode und TWebBrowser (die IE umschließt) hat einen ähnlichen Anruf, aber ich kann nicht herausfinden, wie man das mit TChromium macht. Ich muss einige DOM-Elemente finden, die NAME-Attribute aber keine ID-Attribute haben. Ich suchte die ceflib Einheit und sah nichts, was es tun würde.Wie erhält man Elemente in Delphi Chromium Embedded?
Seitliche Frage. Wenn jemand einen Link zu einer TChromium "Rezeptstil" -Seite oder einem Dokument hat, könnte ich es verwenden.
UPDATE: Während ich auf eine Antwort wartete, habe ich den folgenden Code für getElementsbyName() gefunden. Ich hätte gerne etwas schneller, als den gesamten DOM-Baum zu scannen. Wenn Sie etwas falsch im Code sehen lassen Sie mich wissen:
type
TDynamicCefDomNodeArray = array of ICefDomNode;
// Given a Chromium document interface reference and a NAME attribute to search for,
// return an array of all DOM nodes whose NAME attribute matches the desired.
function getElementsByName(ADocument: ICefDomDocument; theName: string): TDynamicCefDomNodeArray;
// Get all the elements with a particular NAME attribute value and return
// an array of them.
procedure getElementsByName1(intfParentNode: ICefDomNode; theName: string; var aryResults: TDynamicCefDomNodeArray);
var
oldLen: integer;
intfChildNode: ICefDomNode;
theNameAttr: string;
begin
Result := nil;
intfChildNode := nil;
if Assigned(intfParentNode) then
begin
// Attributes are case insensitive.
theNameAttr := intfParentNode.GetElementAttribute('name');
if AnsiSameText(theNameAttr, theName) then
begin
// Name attribute match. Add it to the results array.
oldLen := Length(aryResults);
SetLength(aryResults, oldLen + 1);
aryResults[oldLen] := intfParentNode;
end; // if AnsiSameText(intfParentNode.Name, theName) then
// Does the parent node have children?
if intfParentNode.HasChildren then
begin
intfChildNode := intfParentNode.FirstChild;
// Scan them.
while Assigned(intfChildNode) do
begin
getElementsByName1(intfChildNode, theName, aryResults);
if Assigned(intfChildNode) then
intfChildNode := intfChildNode.NextSibling;
end;
end; // if intfParentNode.HasChildren then
end; // if Assigned(intfParentNode) then
end;
// ---------------------------------------------------------------
var
intfCefDomNode: ICefDomNode;
begin
intfCefDomNode := nil;
Result := nil;
if Assigned(ADocument) then
begin
// Check the header.
intfCefDomNode := ADocument.Document;
if Assigned(intfCefDomNode) then
begin
// Check the parent.
getElementsByName1(intfCefDomNode, theName, Result);
end; // if Assigned(intfCefDomNode) then
end; // if Assigned(ADocoument) then
end;
// ---------------------------------------------------------------
Ich glaube nicht, es klug ist, und mit dem Stand der Technik Zeugs 10 Jahre alte Technik zu entsprechen zu mischen und zu erwarten, dass es eine gefunden und stabile Lösung werden. In diesem speziellen Fall unterstützt TChrium Delph 6 nicht. Http://code.google.com/p/delphichromiumedmbedded/ –
@ Jeroen, das [TChromium] (http://code.google.com/p/delphichromiumedmbedded) /) unterstützt Delphi 6 zwar nicht (es gibt kein Paket dafür), aber es bedeutet nicht, dass es dort nicht funktionieren könnte. Ich habe Delphi 2009, das auch nicht unterstützt wird, aber wenn man sich die Quelle anschaut, gibt es nichts, was die Verwendung dort hemmen könnte ;-) – TLama
@TLama Wenn mir meine Gedanken gut genug sind, hat Delphi 7 einige Fixes zum Umwickeln von COM-Sachen eingeführt. Das könnte ein Grund sein, Delphi 6 nicht zu unterstützen. Ich würde Robert empfehlen, diese Annahme mit dem TChrium-Team zu überprüfen. –