Страницы: 1
Всем привет,
Как в версии 1.8 получить доступ к innerHTML-ю?
У меня на руках в обработчике OnStateChange есть aWebProgress, от туда я могу добраться к nsIDOMHTMLDocument. А дальше?
Спасибо.
Отсутствует
Есть такой nsIDOMSerializer. Он принимает nsIDOMNode и возвращает в виде текста html-содержимое элемента. Попробуйте nsIDOMHTMLDocument привести к nsIDOMNode, ну или получить DocumentElement через nsIDOMDocument.
Отсутствует
Да, видел такой. Но к сожалению данного интерфейса нету в версии 1.8
PS Вообще задача не просто прочитать HTML, а ещё и модифицировать...
В ИЕ в этом смысле проще, взял и дёрнул get_body/put_body у IHTMLElement-а.
Отсутствует
Вот, если интерестно, реализация 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;
Отредактировано Elexander (02-03-2010 16:36:13)
Отсутствует
Вот, если интерестно, реализация InsertAdjacentHTML для Firefox. Правда на Delphi. Но вы, я думаю, разберетесь.
подскажи пожалуйста интерфейс nsIDOMNSRange где взять SDK под делфи с описанием даного интерфейса?
очень нужно, спасибо
Отсутствует
Я при использовании Gecko за основу брал http://d-gecko.svn.sourceforge.net/viewvc/d-gecko/trunk/?pathrev=17.
Все интерфейсы, которые в нем не были описаны генерировал с idl файлов с помощью xpidl2pas компилятора. Его можно было когда-то найти в проекте Dino, который сейчас мертв. Если вам нужен только этот интерфейс, то вот:
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, могу выслать на почту.
Отсутствует
Если нужен компилятор xpidl2pas, могу выслать на почту.
спасибо если можно на email
можете прокомметнировать где взять:
IID_nsIDOMNode
IID_nsIDOMNSRange_190
IID_nsIDOMNSRange_181
NS_ERROR()
и это откуда берется?
Element: IsokHtmlElement;
это nsIDOMHTMLElement или я ошибаюсь?
еще, если можно показать пример доступа к фреймовой структуре документа, буду очень благодарен.
Спасибо
Отредактировано digital (05-10-2010 09:43:45)
Отсутствует
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. И напишите адрес почты, куда выслать компилятор, можно в приват.
Отсутствует
привет Elexander, вопрос такой, у меня 1.7.12 gecko SDK портированный на Делфи, но встретился с такой проблемой, при отображении некоторых сайтов, мигает текст на странице, как будто стоит атрибут у текста blink, но его там нет. в новых версиях gecko такого нет. незнаеш как побороть глюк? может есть где скачать более свежую SDK ? никто не переводил 1.9.х ? незнаеш?
спасибо
Отсутствует
привет Elexander, вопрос такой, у меня 1.7.12 gecko SDK портированный на Делфи, но встретился с такой проблемой, при отображении некоторых сайтов, мигает текст на странице, как будто стоит атрибут у текста blink, но его там нет. в новых версиях gecko такого нет. незнаеш как побороть глюк? может есть где скачать более свежую SDK ? никто не переводил 1.9.х ? незнаеш?
спасибо
Не понял вопрос. Если мигает текст, при чем здесь SDK?
Интерфейсы для новых версий Geckо генерируются с idl файлов. Компилятор я вам выслал.
Отсутствует
Не понял вопрос. Если мигает текст, при чем здесь SDK?
Интерфейсы для новых версий Geckо генерируются с idl файлов. Компилятор я вам выслал.
я предполагаю что проблема с миганием в версии Gecko, т.к. он неправильно отображает страницу.
потому хотел найти новую версию, может где есть уже более новый TGeckoBrowser под версию 1.9.х
самому перелопатить nsXPCOM.pas и все остальное ненаделав ошибок сложновато. насколько я понимаю дело заменой GUIDов необойдется,
скорее всего структура интерфейсов и работа с ними тоже поменяется. надо быть профи в этом деле чтобы правильно сделать.
Компилятор я получил, спасибо, несколько нужных мне интерфейсов на нем сгенерировал.
Отсутствует
как правильно изменить путь к папке GRE\xpcom.dll?
пробовал вставочку сделать '\browser', но появляются побочные глюки, пропадают скролбары и поля ввода на страницах
unit nsXPCOMGlue;
...
function GetGREDirectoryPath: String;
var
cpd: String;
xpcomLibPath: String;
...
begin
...
cpd := GetCurrentProccessDirectory; //+'\browser';
if Length(cpd)>0 then
begin
xpcomLibPath := cpd + '\xpcom.dll';
if FileExists(xpcomLibPath) {and CheckoGeckoVersion(xpcomLibPath)} then
begin
Result := cpd;
Exit;
end;
end;
...
Отсутствует
как правильно изменить путь к папке GRE\xpcom.dll?
пробовал вставочку сделать '\browser', но появляются побочные глюки, пропадают скролбары и поля ввода на страницах
Я не использовал встроенный Gecko в своих приложениях. При разработке XPCOM-компонентов для расширений не нужно ничего вручную инициализировать. Все уже приготовлено броузером, поэтому тут ничем помочь не могу.
Если стоит задача использовать в приложении на Delphi движок рендеринга HTML отличный от IE-шного, то советую посмотреть на WebKit.
http://code.google.com/p/delphichromiumembedded/
http://code.google.com/p/chromiumembedded/
Отсутствует
Elexander, подскажи пожалуйста, как заставить правильно работать диалоговые окна TGeckoBrowser под делфей.
использую компоненты отсюда
http://www.lazarus.freepascal.org/index.php?action=printpage;topic=7854.0
с движкол xulrunner 1.9
все нормально, за исключением того что если браузеру требуется вывести диалог, например прокси авторизации или еще какойто диалог,
то вместо нужного диалога открывается пустое окно с 2мя кнопками ок и отмена.
может нужно какойто интерфес обьявить и подключить? как это делается?
в какую сторону копать?
тут вопрос подымался но без ответа
http://forum.mozilla-russia.org/viewtopic.php?pid=454112
наставь на правильный путь, спасибо...
Отсутствует
Elexander, подскажи пожалуйста, как заставить правильно работать диалоговые окна TGeckoBrowser под делфей.
...
в какую сторону копать?
Хотел бы помочь, но не знаю как. TGeckoBrowser, к сожалению, никогда не использовал.
Отсутствует
Страницы: 1