Wie man Elemente von Namen in Delphi Chromium Embedded?
Zu einem bestimmten DOM-Knoten eingebettet in die aktuelle web-Dokument von einem TChromium Instanz, mittels seiner ID, die Sie verwenden ICefDomDocument.getElementById(). Aber wie findet man Elemente, die durch das NAME-Attribut? Javascript ist document.getElementsByName () - Methode und TWebBrowser (die wraps IE) hat einen ähnlichen Anruf, aber ich kann nicht herausfinden, wie dies mit TChromium. Ich muss einige DOM-Elemente, die über NAME-Attribute, aber keine ID-Attribute. Ich suchte die ceflib Einheit und nicht sehen alles, was es tun würde.
Seite Frage. Wenn jemand einen link zu einer TChromium "Rezepte" style Website oder Dokument, das ich nutzen könnte.
UPDATE: Beim warten auf eine Antwort ich habe mit den folgenden code für das tun von getElementsbyName(). Ich würde gerne etwas schneller als das Scannen des gesamten DOM-Baum. Wenn Sie sehen, dass etwas falsch im code lassen Sie es 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;
// ---------------------------------------------------------------
TChromium
nicht unterstützt Delphi 6, aber (es ist kein Paket für Sie), aber es bedeutet nicht, es konnte nicht dort arbeiten. Ich habe Delphi 2009, die auch nicht unterstützt, aber ein Blick in die Quelle, es gibt nichts, was hemmen könnte der Verbrauch da 😉wenn mein Geist dient mir gut genug, Delphi 7 eingeführt, die durchaus ein paar fixes in Bezug auf Verpackung COM-Zeug. Das könnte ein Grund für die nicht-Unterstützung von Delphi 6. Ich würde empfehlen, Robert, überprüfen Sie diese Annahme mit der TChromium team.
Ich glaube, so. Die drei Delphi-Einheiten, die ich Verwandte, Chrom: cef, ceflib, ceffilescheme. Auch ich habe TChromium verfügbar in meine Komponenten-palette und können legen Sie es auf einem Formular.
InformationsquelleAutor Robert Oschler | 2012-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Funktion wie JavaScript,
getElementsByName
oder MSHTMLgetElementsByName
gebaut in derChromium Embedded
noch Ihre Delphi-wrapper in dieser Zeit. Sie können dieses Problem beheben, nur durch Iteration über alle DOM-Elemente, z.B. durch erstellen von Ihren eigenen DOM-Besucher-Klasse wie folgt aus:Bitte beachten Sie die
VisitDom
Prozedur ist asynchron, so gibt es sofort (eigentlich vor dem DOM-Besucher beendet seinevisit
) und es funktioniert mit einem snapshot der DOM an der Zeit es ausgeführt wird.So nehme ich es, dass der Aufruf mit einem Besuch TCefDomVisitorOwn Nachfahre implementiert Visitor-pattern? In anderen Worten, CEF wird, gilt dieses Muster für alle Knoten im DOM, den Umgang mit den rekursiven Abstieg durch die Knoten-Struktur für Sie? Das ist sehr cool, wenn das so ist, aber ich möchte absolut sicher sein, so bitte ich um Bestätigung.
Nein, die iteration, die Sie haben zu tun, noch mit dem eigenen. Der Unterschied der Verwendung der
VisitDom
Methode ist, dass es macht eine Kopie (snapshot) des aktuellen DOM-Staat. In meinem Beispiel dieTElementNameVisitor.visit
arbeitet mit einer Kopie des Dokuments, nicht mit dem Dokument selbst (die geändert werden können auf die Zeit, die Sie Durchlaufen). Ich weiß nicht, ob es schneller ist, es ist einfach sicherer.Ok, danke. Das ist ein guter Punkt.
Habe vergessen zu bemerken, die
VisitDom
ist asynchron, das ist, warum ich verwendet nameProcessElementsByName
nichtgetElementsByName
da müsste ich warten, bis der Besucher endet dasvisit
.InformationsquelleAutor TLama