>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Gecko 1.8. Доступ к innerHTML из XPCOM http://forum.mozilla-russia.org/viewtopic.php?id=43497 |
myasoex > 01-03-2010 13:04:23 |
Всем привет, Как в версии 1.8 получить доступ к innerHTML-ю? Спасибо. |
Elexander > 02-03-2010 10:41:32 |
Есть такой nsIDOMSerializer. Он принимает nsIDOMNode и возвращает в виде текста html-содержимое элемента. Попробуйте nsIDOMHTMLDocument привести к nsIDOMNode, ну или получить DocumentElement через nsIDOMDocument. |
myasoex > 02-03-2010 13:56:39 |
Да, видел такой. Но к сожалению данного интерфейса нету в версии 1.8 PS Вообще задача не просто прочитать HTML, а ещё и модифицировать... |
Elexander > 02-03-2010 16:35:35 |
Вот, если интерестно, реализация InsertAdjacentHTML для Firefox. Правда на Delphi. Но вы, я думаю, разберетесь. Выделить код Код:procedure InsertAdjacentHTML(Element: IsokHtmlElement; Where: TsokWhereInsert; Html: sokWideString); var doc: nsIDOMDocument; docRange: nsIDOMDocumentRange; range: nsIDOMRange; nsRange: nsIDOMNSRange; fragment: nsIDOMDocumentFragment; node, parent, child, retval: nsIDOMNode; rv: nsResult; begin try if not Assigned(Element) then Exit; Element.QueryInterface(IID_nsIDOMNode, node); if not Assigned(node) then Exit; NS_ERROR(node.GetOwnerDocument(doc)); if not Assigned(doc) then Exit; doc.QueryInterface(NS_IDOMDOCUMENTRANGE_IID, docRange); if not Assigned(docRange) then Exit; range := docRange.CreateRange; if not Assigned(range) then Exit; rv := range.SelectNode(node); if NS_FAILED(rv) then begin NS_ERROR(node.GetParentNode(parent)); NS_ERROR(rv); end; if range.QueryInterface(IID_nsIDOMNSRange_190, nsRange) <> 0 then if range.QueryInterface(IID_nsIDOMNSRange_181, nsRange) <> 0 then Exit; if NS_FAILED(nsRange.CreateContextualFragment(NewString(Html).AString, fragment)) then Exit; if not Assigned(fragment) then Exit; // якщо фрагмент не вдалось створити (наприклад в XUL-документі) далі буде NS_ERROR_INVALID_POINTER NS_ERROR(node.GetParentNode(parent)); if not Assigned(parent) then Exit; case Where of beforeBegin: NS_ERROR(parent.InsertBefore(fragment, node, retval)); afterBegin: begin NS_ERROR(node.GetFirstChild(child)); NS_ERROR(node.InsertBefore(fragment, child, retval)); end; beforeEnd: NS_ERROR(node.AppendChild(fragment, retval)); afterEnd: begin NS_ERROR(node.GetNextSibling(child)); if (Assigned(child)) then NS_ERROR(parent.insertBefore(fragment, child, retval)) else NS_ERROR(parent.appendChild(fragment, retval)); end; end; except on E: Exception do LogException('InsertAdjacentHTML: ' + Html, E); end; end; |
digital > 30-09-2010 12:50:34 |
Elexander пишет
подскажи пожалуйста интерфейс nsIDOMNSRange где взять SDK под делфи с описанием даного интерфейса? очень нужно, спасибо |
Elexander > 02-10-2010 12:02:02 |
Я при использовании Gecko за основу брал http://d-gecko.svn.sourceforge.net/viewvc/d-gecko/trunk/?pathrev=17. Выделить код Код:nsIDOMNSRange = interface(nsISupports) ['{59188642-23B4-41D6-BDE1-302C3906D1F0}'] function CreateContextualFragment(const fragment: nsAString; var _retval: nsIDOMDocumentFragment): nsResult; stdcall; function IsPointInRange(parent: nsIDOMNode; offset: Integer; var _retval: LongBool): nsResult; stdcall; function ComparePoint(parent: nsIDOMNode; offset: Integer; var _retval: Smallint): nsResult; stdcall; end; Если нужен компилятор xpidl2pas, могу выслать на почту. |
digital > 05-10-2010 02:37:11 |
Elexander пишет
спасибо если можно на email можете прокомметнировать где взять: IID_nsIDOMNode и это откуда берется? еще, если можно показать пример доступа к фреймовой структуре документа, буду очень благодарен. Спасибо |
Elexander > 05-10-2010 17:45:29 |
IsokHtmlElement - это синоним IInterface. По сути это объект документной модели который поддерживает nsIDOMNode. В коде дальше у него просится этот интерфейс и работа ведется уже с ним. IID_nsIDOMNSRange_190, IID_nsIDOMNSRange_181 - это TGUID-ы для соответствующих интерфейсов для разных версий Gecko (1.9.0 и 1.8.1). Mozilla делает одну странность: они в разных версиях меняют guid-ы своих интерфейсов, хотя сами интерфейсы оставляют без изменений. Иными словами, если вам нужно получить интерфейс у объекта по глобальному идентификатору, то нужно знать в какой версии gecko вы работаете (какая версия firefox). Если хотите, чтобы компонент работал в разных версиях gecko нужно делать вот такие некрасивые проверки, как в той функции. NS_ERROR() - это функция которая проверяет NS_FAILED() и если результат положительный (nsResult <> 0) генерирует исключение. К фреймовой структуре доступ получается приблизительно так: В doc будет объект поддерживающий nsIDOMDocument. Я в Delphi с браузером работал так: сначала писал минимально возможный код на javascript, проверял работоспособность с консоли и потом искал соответствующие методы в интерфейсах SDK. P.S. И напишите адрес почты, куда выслать компилятор, можно в приват. |
digital > 18-10-2010 12:16:34 |
привет Elexander, вопрос такой, у меня 1.7.12 gecko SDK портированный на Делфи, но встретился с такой проблемой, при отображении некоторых сайтов, мигает текст на странице, как будто стоит атрибут у текста blink, но его там нет. в новых версиях gecko такого нет. незнаеш как побороть глюк? может есть где скачать более свежую SDK ? никто не переводил 1.9.х ? незнаеш? спасибо |
Elexander > 18-10-2010 12:29:36 |
digital пишет
Не понял вопрос. Если мигает текст, при чем здесь SDK? |
digital > 19-10-2010 12:21:47 |
Elexander пишет
я предполагаю что проблема с миганием в версии Gecko, т.к. он неправильно отображает страницу. самому перелопатить nsXPCOM.pas и все остальное ненаделав ошибок сложновато. насколько я понимаю дело заменой GUIDов необойдется, Компилятор я получил, спасибо, несколько нужных мне интерфейсов на нем сгенерировал. |
digital > 20-10-2010 14:33:32 |
как правильно изменить путь к папке GRE\xpcom.dll? unit nsXPCOMGlue; function GetGREDirectoryPath: String; ... |
Elexander > 20-10-2010 14:42:14 |
digital пишет
Я не использовал встроенный Gecko в своих приложениях. При разработке XPCOM-компонентов для расширений не нужно ничего вручную инициализировать. Все уже приготовлено броузером, поэтому тут ничем помочь не могу. Если стоит задача использовать в приложении на Delphi движок рендеринга HTML отличный от IE-шного, то советую посмотреть на WebKit. http://code.google.com/p/delphichromiumembedded/ |
digital > 29-11-2010 18:49:12 |
Elexander, подскажи пожалуйста, как заставить правильно работать диалоговые окна TGeckoBrowser под делфей. использую компоненты отсюда http://www.lazarus.freepascal.org/index.php?action=printpage;topic=7854.0 с движкол xulrunner 1.9 все нормально, за исключением того что если браузеру требуется вывести диалог, например прокси авторизации или еще какойто диалог, может нужно какойто интерфес обьявить и подключить? как это делается? в какую сторону копать? тут вопрос подымался но без ответа наставь на правильный путь, спасибо... |
Elexander > 30-11-2010 10:04:57 |
digital пишет
Хотел бы помочь, но не знаю как. TGeckoBrowser, к сожалению, никогда не использовал. |