Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как добраться до JS переменной в HTML из Delphi


Piter ©   (2005-07-12 14:21:00) 

Есть WebBrowser, в него загружена страничка, можно узнать ее код:

wb.OleObject.Document.documentElement.outerHTML;

видно, что внутри выдаваемого HTML кода объявляется переменная-массив logins, которая заполняется внутри HTML нужными мне данными. Как получить доступ к этой переменной logins из Delphi, через wb?


Almok   (2005-07-21 13:58:00) [1]

Удалено модератором


Piter   (2005-07-17 14:16:00) [2]

DiamondShark ©   (17.07.05 13:06) [10]

ясно! Еще раз спасибо!


DiamondShark   (2005-07-17 13:06:00) [3]


> а это зачем?

А это потому что IEnumVariant не финализирует передаваемый ему по ссылке вариант.


Piter   (2005-07-17 12:45:00) [4]

DiamondShark ©   (17.07.05 12:39) [8]
V := Unassigned;


а это зачем?


DiamondShark   (2005-07-17 12:39:00) [5]

Хех. Понты жабаскрипта, где всё -- объекты.

Пусть, есть ХТМЛ:


<SCRIPT language="JavaScript">
var JArray = Array("aaa","bbb","ccc");
</SCRIPT>

<SCRIPT language="VBScript">
Dim VBArray(3)
VBArray(0) = "aaa"
VBArray(1) = "bbb"
VBArray(2) = "ccc"
</SCRIPT>


Для VBArray всё честно, возвращается тип VT_ARRAY+VT_VARIANT
Для JArray возвращается тип VT_DISPATCH

Но жабаскриптовый массив поддерживает стандартный интерфейс OLE-коллекций. Т.е. получить элементы можно примерно так:


type
 ICrack = dispinterface
   ['{00020400-0000-0000-C000-000000000046}']
   property _NewEnum: IUnknown dispid DISPID_NEWENUM;
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 JArray: OleVariant;
 V: OleVariant;
 e: IEnumVariant;
 Dummy: DWORD;
begin
 JArray := FDocument.Script.JArray;

 e := ICrack(IDispatch(JArray))._NewEnum as IEnumVariant;
 while e.Next(1, V, Dummy) = S_OK do begin
   ShowMessage(V);
   V := Unassigned;
 end;
end;


Если очень захочется, можно по этому принципу написать преобразовалку коллекции в массив. Но мне лень. ;)


Piter   (2005-07-17 02:52:00) [6]

Хотя возникли кое какие проблемы :(
Видимо, с тем, что переменная - это массив.
То есть, MyVar - это массив.

Доступ, например, к FDocument.Script.MyVar.length - без проблем, показывает количество элементов, все супер.

А вот любой доступ к FDocument.Script.MyVar[i] не имеет успеха. Например, в том же JS скрипте есть обращение к: FDocument.Script.MyVar[i].login, в тоже время из Delphi так вызвать нельзя - пишет, что метод не поддерживается :(


Piter   (2005-07-17 00:30:00) [7]

DiamondShark ©   (15.07.05 19:09) [5]

О, Шарк, ты гений :)

Большой спасибо


DiamondShark   (2005-07-15 19:09:00) [8]

Ну, естественно

FDocument: Variant;


DiamondShark   (2005-07-15 19:02:00) [9]

IHTMLDocument.Script


<HTML>
<HEAD>
<SCRIPT language="JavaScript">
var MyVar = "Hello from hell!";
function TestFunction()
{
 alert("Ku-ku!");
}
</SCRIPT>
</HEAD>
<BODY>
<H1>Hello,world!</H1>
</BODY>
</HTML>



procedure TForm1.FormCreate(Sender: TObject);
begin
 WebBrowser1.Navigate('C:/zzz.html');
end;

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
 const pDisp: IDispatch; var URL: OleVariant);
begin
 FDocument := WebBrowser1.Document;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(FDocument.Script.MyVar);
 FDocument.Script.TestFunction;
end;


Piter   (2005-07-15 18:29:00) [10]

DiamondShark ©   (15.07.05 14:15) [2]

не понял мысль :(


DiamondShark   (2005-07-15 14:15:00) [11]

Сам не пробовал, но может получить интерфейс script engin'а и попробовать через него?


Piter   (2005-07-13 14:53:00) [12]

Удалено модератором
Примечание: оффтоп....


Наверх

Титульная страница Поиск, карта сайта Написать письмо