Заглянул на огонек, вспомнил что когдато ковырял капчи. Отыскал старую недоделку, удалил все лишнее и добавил для размышления. Может кому пригодится, у меня времени нет допиливать. Если кто будет ковырять, нужно учитывать: Доступ к создаваемым объектам из скриптов выполненных с помощью 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,[]) }
|