To get the specific DOM node embedded in the current web document from the TChromium instance using its identifier, you use ICefDomDocument.getElementById (). But how do you find elements with the NAME attribute? Javascript has a document.getElementsByName () method, and TWebBrowser (which wraps IE) has a similar call, but I cannot figure out how to do it with TChromium. I need to find some DOM elements that have NAME attributes but not identifier attributes. I searched the ceflib block and did not see anything that would do this.
Side question. If anyone has a link to a style site or a recipe based on TChromium recipes, I could use it.
UPDATE: waiting for a response, I came up with the following code to execute getElementsbyName (). I would like something faster than scanning the entire DOM tree. If you see something wrong in the code, let me know:
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; //
source share