Вверх ↑
Ответов: 1073
Рейтинг: 76
#1: 2015-11-30 02:55:45 ЛС | профиль | цитата
Заглянул на огонек, вспомнил что когдато ковырял капчи.
Отыскал старую недоделку, удалил все лишнее и добавил для размышления. Может кому пригодится, у меня времени нет допиливать.

Если кто будет ковырять, нужно учитывать:
   Доступ к создаваемым объектам из скриптов выполненных с помощью ExecScript - отсутствует либо ограничен.
   Функции выполненные ExecScript не могут возвращать результат, передача параметров поддерживается.
   Чтобы достучатся к переменным из IC их нужно явно присваивать объекту window.(возможно не во всех версиях IE)
   Возвращаемый результат желательно в string-е или integer-е и т.п. Функция может вернуть массив, но вот работать с ним у меня так и не получилось, поскольку он в реальности будет olevariant. Если кто имеет опыт пускай поделится.

В IC и Memo есть немного подсказок для понятия принципа. Все недостающее легко доделывается по тому же принципу.
Add(MainForm,2953706,63,56)
{
Width=887
Height=622
Position=1
Point(onClose)
link(onCreate,13950465:doWork,[])
link(onClose,9676733:doWork,[])
}
Add(Edit,6271191,112,133)
{
Left=475
Top=5
Width=355
Text="https://www.google.ru/"
}
Add(Button,16349967,63,182)
{
Left=830
Top=5
Width=35
Caption="GO"
link(onClick,12976651:doNavigate,[])
}
Add(WebBrowser,12976651,112,182)
{
Left=475
Top=30
Width=390
Height=265
Point(PHandle)
Point(doFromText)
link(URL,6271191:Text,[])
}
Add(Button,4333300,63,266)
{
Left=5
Top=5
Width=85
Caption="execjs"
link(onClick,1727944:execjs,[])
}
Add(InlineCode,1727944,126,266)
{
WorkPoints=#6:execjs|6:evaljs|
EventPoints=#6:result|6:source|
DataPoints=#13:HandleBrouser|7:JScript|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|40:uses kol,Share,Debug,ActiveX,KOLSHDocVw;|0:|4:type|28: THiAsmClass = class(TDebug)|0:|10: private|0:|9: public|28: HandleBrouser: THI_Event;|22: JScript: THI_Event;|21: result: THI_Event;|21: source: THI_Event;|16: pc: PControl;|49: procedure execjs(var _Data:TData; Index:Word);|49: procedure evaljs(var _Data:TData; Index:Word);|0:|5: end;|1: |14:implementation|4:type|31: TKOLWebBrowser = PWebBrowser;|31: PKOLWebBrowser = PWebBrowser;|0:|58:procedure THiAsmClass.execjs(var _Data:TData; Index:Word);|9:begin |47: pc := PControl(ToIntegerEvent(HandleBrouser));|31: if not Assigned(pc) then exit;|11: begin|113: PKOLWebBrowser(pc).OleObject.Document.ParentWindow.ExecScript(ReadString(_Data, JScript), 'javascript') ;|102: _hi_onEvent(source, String(PKOLWebBrowser(pc).OleObject.Document.documentElement.outerHTML));|10: end;|4:end;|0:|58:procedure THiAsmClass.evaljs(var _Data:TData; Index:Word);|9:begin |46:pc := PControl(ToIntegerEvent(HandleBrouser));|32: if not Assigned(pc) then exit;|8: begin|9: |115: _hi_onEvent(result, String(PKOLWebBrowser(pc).OleObject.Document.ParentWindow.test1())); // вызов функции|145: _hi_onEvent(result, String(PKOLWebBrowser(pc).OleObject.Document.ParentWindow.test2(' test params'))); // передача параметров в функцию|148: _hi_onEvent(result, 'тело функции равно = ' + String(PKOLWebBrowser(pc).OleObject.Document.ParentWindow.test1)); // Получаем тело функции|114: PKOLWebBrowser(pc).OleObject.Document.ParentWindow.test3(); // Создание переменных с дефолтным значением|170: _hi_onEvent(result, 'значение тестовой переменной равно =' + String(PKOLWebBrowser(pc).OleObject.Document.ParentWindow.testvar));// получаем значение переменной|106: PKOLWebBrowser(pc).OleObject.Document.ParentWindow.testvar := 'new value'; // установка значения|170: _hi_onEvent(result, 'значение тестовой переменной равно =' + String(PKOLWebBrowser(pc).OleObject.Document.ParentWindow.testvar));// получаем значение переменной|144: _hi_onEvent(result, 'Длинна массива =' + String(PKOLWebBrowser(pc).OleObject.Document.ParentWindow.testvar2.length));// Длинна массива|13: // |100: _hi_onEvent(result, String(PKOLWebBrowser(pc).OleObject.Document.ParentWindow.hi_func()));|7: end;|4:end;|0:|123://_hi_onEvent(result, String(PKOLWebBrowser(pc).OleObject.Document.documentElement.outerHTML)); // .innerHTML // .outerText|68://PKOLWebBrowser(pc).OleObject.Document.all.tags('TagName').Length; |126://_hi_onEvent(result, String(PKOLWebBrowser(pc).OleObject.Document.all.tags('TagName').Item('index').outerHTML)); // innerHTML|105://PKOLWebBrowser(pc).OleObject.Document.all.tags('TagName').Item('index').focus; //.click // .onmousedown|130://PKOLWebBrowser(pc).OleObject.Document.all.tags('TagName').Item('index').setAttribute('target', '_self'); // открыть в томже окне|143:// .setAttribute(AttributeName,AttributeValue) // .getattribute(AttributeName) //.HasAttribute(AttributeName) //.RemoveAttribute(AttributeName)|112://OffsetLeft:= PKOLWebBrowser(pc).OleObject.Document.all.tags('TagName').Item('index').offsetLeft; //.offsetTop;|135:// .getBoundingClientRect().top; // .getBoundingClientRect().left; // .getBoundingClientRect().right //.getBoundingClientRect().bottom|99://PKOLWebBrowser(pc).OleObject.Document.ParentWindow.ScrollTo(val1, val2); // .ScrollBy(val1, val2)|100://PKOLWebBrowser(pc).OleObject.Document.Body.Style.OverflowX := 'hidden'; // .OverflowY := 'hidden';|114://scrollWidth/scrollHeight // scrollLeft/Top //ParentWindow.pageXOffset/pageYOffset document.body.scrollLeft/Top|84://PKOLWebBrowser(pc).OleObject.Document.documentElement.ClientWidth // .ClientHeight|40://перенос строки 'часть1'#13#10'часть2'|100://Text2Clipboard(PKOLWebBrowser(pc).OleObject.Document.all.tags('TagName').Item('index').outerHTML);|0:|4:end.|
link(result,3309072:doAdd,[])
link(HandleBrouser,12976651:PHandle,[])
link(JScript,11306264:Text,[(139,236)(160,236)])
link(source,5559069:doEvent1,[])
}
Add(MultiElementEx,9371579,210,70)
{
@Hint=#11:эмуляция IE|10:11001 IE11|10:11000 IE11|10:10001 IE10|10:10000 IE10|10:9999 IE9 |9:9000 IE9|10:8888 IE8 |9:8000 IE8|9:7000 IE7|
link(Data,14602570:Text,[])
AddHint(36,0,77,130,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,16166731,21,21)
{
WorkCount=#5:write|3:del|
DataCount=#4:Data|
link(write,7906811:doPart,[(95,27)(95,97)])
link(del,1560214:doDeleteValue,[(87,34)(87,160)])
}
Add(Registry,1560214,154,140)
{
HKey=2
Key="SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION\"
DataType=0
Point(doDeleteValue)
link(Data,16166731:Data,[(160,84)(27,84)])
link(Value,7906811:Part,[])
}
Add(Application,12963505,168,42)
{
}
Add(FilePartElm,7906811,168,91)
{
Point(Part)
link(onPart,1560214:doWrite,[(207,97)(207,125)(144,125)(144,153)])
link(FileName,12963505:AppFileName,[])
}
END_SDK
Add(VisualStrings,14602570,210,35)
{
Lines=#5:11000|
Width=46
}
Add(RichEdit,11306264,154,182)
{
Left=5
Top=30
Width=465
Height=550
Ctl3D=0
Strings=#29:// пример добавления функций |17:function mytest()|1:{|31: alert('выполнение mytest()');|2:};|21:function mytest1(msg)|1:{|13: alert(msg);|2:};|0:|8:// вызов|9:mytest();|32:mytest1('выполнение mytest1()');|0:|52:// загрузчик скриптов для добавления в тело страницы|26:function JSLoader(source){|53:var head = document.getElementsByTagName('head')[0]; |40:script=document.createElement('script');|30:script.type='text/javascript';|26://script.innerHTML=source;|60:script.text=source; // в новых версиях innerHTML не работает|28:head.appendChild(script); };|0:|40:// Пример добавления скрипта на страницу|43:// попытка получить картинку base64 строкой|9:JSLoader(|24:function getimg(number){|35: var img = document.images[number]|48: var canvas = document.createElement("canvas");|27: canvas.width = img.width;|29: canvas.height = img.height;|40: var context = canvas.getContext('2d');|29: context.drawImage(img,0,0);|46: var dataURL = canvas.toDataURL("image/png");|63: return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");|3:});|0:|43:// попытка получить картинку base64 строкой|18:function mytest3()|1:{|47: for(var i = 0; i<document.images.length; i++)|3: {|56: alert('всего - '+document.images.length+': #' + i);|44: alert('src - '+document.images[i].src);|22: alert(getimg(i));|3: }|2:};|10:mytest3();|0:|30:// пример получения результата|9:JSLoader(|18:function hi_func()|1:{|45: return 'возвращаемый результат из hi_func';|3:});|1: |18:// Тест для evaljs|9:JSLoader(|16:function test1()|1:{|51: return 'test1 - вызов переменной без параметров';|3:});|0:|9:JSLoader(|19:function test2(msg)|1:{|70: return 'test2 - вызов переменной с параметрами. Параметры = ' + msg;|3:});|0:|9:JSLoader(|16:function test3()|1:{|35: window.testvar = 'default value';|49: window.testvar2 = ['elem0', 'elem1', 'elem2']; |3:});|
ScrollBars=3
}
Add(Hub,5559069,175,273)
{
link(onEvent1,16260432:doClear,[(203,279)(203,293)])
link(onEvent2,16260432:doAdd,[])
}
Add(Button,14640082,63,301)
{
Left=385
Top=5
Width=85
Caption="evaljs"
link(onClick,1727944:evaljs,[(111,307)(111,279)])
}
Add(RichEdit,3309072,259,266)
{
Left=475
Top=495
Width=390
Height=85
ScrollBars=3
}
Add(RichEdit,16260432,217,280)
{
Left=475
Top=300
Width=390
Height=190
Ctl3D=0
ScrollBars=3
}
Add(Check,13950465,119,70)
{
Check=1
Caption="wr"
link(onEvent,9371579:write,[])
}
Add(Check,9676733,161,77)
{
Check=1
Caption="del"
link(onEvent,9371579:del,[])
}


карма: 0

0