Jump to content



Photo

Dynamic html in au3


  • Please log in to reply
13 replies to this topic

#1 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 22 May 2008 - 07:25 PM

Ever wanted to dynamically manipulate javascript objects in autoit, query object properties or even execute methods?

The example below is for an hta application which has 2 variables declared, IsLoaded and oRect.
The javascript basically creates js objects with oRect using 2 classes to create a rectangle when the document is loaded.

by creating objects from the IsLoaded and oRect hta variables, Autoit can execute the methods from the javascript object.

I know the example is ugly, but I'm sure you can see the potential.
By the way, this is not limited to javascript, but you may use it with vb as you can call vb from an hta and even access the FileSystem
IVAN
Plain Text         
#include <GUIConstants.au3> #include <IE.au3> #Include <Misc.au3> Global $jsScript = '    <script type="text/javascript">' & @CRLF _          & '    oHTA.IsLoaded=0;' & @CRLF _          & '    oHTA.oRect=new Array();' & @CRLF _          & '// class fJS_RectStruct' & @CRLF _          & 'function fJS_RectStruct(pX,pY,pW,pH,pColour,pInsance){' & @CRLF _          & "    this.Id='Rect_'+pInsance;" & @CRLF _          & "    this.Title='Rectangle #'+pInsance;" & @CRLF _          & "    this.Colour=pColour;" & @CRLF _          & "    this.Pos=Object();" & @CRLF _          & "    this.Pos=Object();" & @CRLF _          & "    this.Pos.x=Object();" & @CRLF _          & "    this.Pos.y=Object();" & @CRLF _          & "    this.Pos.w=Object();" & @CRLF _          & "    this.Pos.h=Object();" & @CRLF _          & "    this.Pos.x.val=pX;" & @CRLF _          & "    this.Pos.x.unit='px';" & @CRLF _          & "    this.Pos.y.val=pY;" & @CRLF _          & "    this.Pos.y.unit='px';" & @CRLF _          & "    this.Pos.w.val=pW;" & @CRLF _          & "    this.Pos.w.unit='px';" & @CRLF _          & "    this.Pos.h.val=pH;" & @CRLF _          & "    this.Pos.h.unit='px';" & @CRLF _          & "    // methods" & @CRLF _          & "    this._GetId=_GetId;" & @CRLF _          & "    this._GetTitle=_GetTitle;" & @CRLF _          & "    this._GetPos=_GetPos;" & @CRLF _          & "    this._GetColour=_GetColour;" & @CRLF _          & "    this._SetTitle=_SetTitle;" & @CRLF _          & "    this._SetPos=_SetPos;" & @CRLF _          & "    this._SetColour=_SetColour;" & @CRLF _          & "}" & @CRLF _          & "/*  METHODS */" & @CRLF _          & "function _GetId(){ return this.Id;}" & @CRLF _          & "function _GetTitle(){ return this.Title;}" & @CRLF _          & "function _GetPos(){ " & @CRLF _          & "    var lPos=Array();" & @CRLF _          & "    lPos[0]=this.Pos.x.val;" & @CRLF _          & "    lPos[1]=this.Pos.y.val;" & @CRLF _          & "    lPos[2]=this.Pos.w.val;" & @CRLF _          & "    lPos[3]=this.Pos.h.val;" & @CRLF _          & "return lPos;" & @CRLF _          & "}" & @CRLF _          & "function _GetColour(){return this.Colour;}" & @CRLF _          & "function _SetTitle(pTitle){ " & @CRLF _          & "    var lRef=document.getElementById(this.Id);" & @CRLF _          & "    this.Title=pTitle;" & @CRLF _          & "    lRef.title=this.Title;" & @CRLF _          & "}" & @CRLF _          & "function _SetPos(pX,pY,pW,pH){ " & @CRLF _          & "    var lRef=document.getElementById(this.Id);" & @CRLF _          & "    this.Pos.x.val=pX;" & @CRLF _          & "    this.Pos.y.val=pY;" & @CRLF _          & "    this.Pos.w.val=pW;" & @CRLF _          & "    this.Pos.h.val=pH;" & @CRLF _          & "    lRef.style.left     =this.Pos.x.val.toString()+this.Pos.x.unit.toString();" & @CRLF _          & "    lRef.style.top      =this.Pos.y.val.toString()+this.Pos.y.unit.toString();" & @CRLF _          & "    lRef.style.width    =this.Pos.w.val.toString()+this.Pos.w.unit.toString();" & @CRLF _          & "    lRef.style.height   =this.Pos.h.val.toString()+this.Pos.h.unit.toString();" & @CRLF _          & "}" & @CRLF _          & "function _SetColour(pColour){ " & @CRLF _          & "    var lRef=document.getElementById(this.Id);" & @CRLF _          & "    this.Colour=pColour;" & @CRLF _          & "    lRef.style.backgroundColor=pColour;" & @CRLF _          & "}" & @CRLF _          & '// class fJS_RectCreate' & @CRLF _          & "function fJS_RectCreate(pParentId,pX,pY,pW,pH,pColour,pInsance){" & @CRLF _          & "    var lHTML='<div ', lAttributes='style=" & '"' & "position: absolute; ',lRef=''; " & @CRLF _          & "    this.ParentId=pParentId;" & @CRLF _          & "    this.Struct=fJS_RectStruct;" & @CRLF _          & "    this.Struct(pX,pY,pW,pH,pColour,pInsance);" & @CRLF _          & "    lAttributes+='left: '+this.Pos.x.val+this.Pos.x.unit+'; ';" & @CRLF _          & "    lAttributes+='top: '+this.Pos.y.val+this.Pos.y.unit+'; ';" & @CRLF _          & "    lAttributes+='width: '+this.Pos.w.val+this.Pos.w.unit+'; ';" & @CRLF _          & "    lAttributes+='height: '+this.Pos.h.val+this.Pos.h.unit+'; ';" & @CRLF _          & "    lAttributes+='background-color: '+this.Colour+';" & ' "' & "'; " & @CRLF _          & "    lHTML+='id=" & '"' & "'+this.Id+'" & '" title="' & "'+this.Title+'" & '"' & "'+lAttributes+'></div>';" & @CRLF _          & "    lRef=document.getElementById(this.ParentId);" & @CRLF _          & "    lRef.innerHTML=lRef.innerHTML+lHTML;" & @CRLF _          & "}" & @CRLF _          & "window.onload = fJS_EventWinLoad;   // Pass onload window event to fJs_EventWinLoad" & @CRLF _          & "function fJS_EventWinLoad(){" & @CRLF _          & "    oHTA.oRect[oHTA.oRect.length]=new fJS_RectCreate('ParentLayerId',0,0,200,100,'#0000FF',oHTA.oRect.length);" & @CRLF _          & "    oHTA.IsLoaded=1;" & @CRLF _          & "}" & @CRLF _          & "</script>" & @CRLF Global $htaCode = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href='http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%22>' class='bbc_url' title='External link' rel='nofollow external'>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'</a> & @CRLF _          & '<html xmlns="<a href='http://www.w3.org/1999/xhtml' class='bbc_url' title='External link' rel='nofollow external'>http://www.w3.org/1999/xhtml"</a> >' & @CRLF _          & '<head>' & @CRLF _          & '    <title>js2au3</title>' & @CRLF _          & '    <HTA:APPLICATION ID="oHTA" APPLICATIONNAME="EmbeddedHTA"' & @CRLF _          & '    var IsLoaded ' & @CRLF _          & '    var oRect ' & @CRLF _          & '    />' & @CRLF _          & $jsScript & @CRLF _          & '</head>' & @CRLF _          & '<body unselectable="on" scroll="no" oncontextmenu="return false;">' & @CRLF _          & '<div id="ParentLayerId" style="position: absolute; width: 100%; height: 100%; top: 0px; left: 0px; background-color: #F5F5F5;" title="insert rects here"></div>' & @CRLF _          & '</body>' & @CRLF _          & '</html>' & @CRLF Global $Form = GUICreate("Talk to js", 600, 400, 0, 0) _IEErrorHandlerRegister() Global $oIE = _IECreateEmbedded() Global $IE_width = 575 Global $IE_height = 375 Global $GUIActiveX = GUICtrlCreateObj($oIE, 10, 20, $IE_width, $IE_height) _IENavigate($oIE, 'about:blank', 1) _IEDocWriteHTML($oIE, $htaCode) Global $oHTA = _IEGetObjById($oIE, 'oHTA') GUISetState(@SW_SHOW) Global $IsLoaded = $oHTA.IsLoaded While $IsLoaded <> 1     Sleep(25) WEnd MsgBox(0, 'Demo msg', 'Document Is Loaded, press ok to continue') Global $oRect = $oHTA.oRect MsgBox(0, 'Demo msg', 'This will execute some methods of the first instance of $oRect object') $rectPos = '' $rectPosStr = '' $newColour='' Dim $newPos[1] For $rect In $oRect     If IsObj($rect) Then         MsgBox(0, 'Demo msg', "Let's retrieve some data from the first instance of the $oRect object")         MsgBox(0, 'Demo msg', '_GetId method of $oRect object ' & @CRLF & $rect._GetId($rect))         MsgBox(0, 'Demo msg', '_GetTitle method of $oRect object ' & @CRLF & $rect._GetTitle($rect))         MsgBox(0, 'Demo msg', '_GetColour method of $oRect object ' & @CRLF & $rect._GetColour($rect))         $rectPos = $rect._GetPos($rect)         For $pos In $rectPos             $rectPosStr &= $pos & @CRLF             ReDim $newPos[UBound($newPos) + 1]             $newPos[UBound($newPos) - 1] = $pos * 2         Next         MsgBox(0, 'Demo msg', 'concatenated str from _GetPos method of $oRect object ' & @CRLF & $rectPosStr)         MsgBox(0, 'Demo msg', "Now Let's change some data and html of the first instance of the $oRect object")         #Region --- CodeWizard generated code Start ---     ;InputBox features: Title=Yes, Prompt=Yes, Default Text=No         If Not IsDeclared("sInputBoxAnswer") Then Local $sInputBoxAnswer         $sInputBoxAnswer = InputBox("change the obj","Insert a new title for the object",""," ","-1","-1","-1","-1")         Select             Case @Error = 0;OK - The string returned is valid                 $rect._SetTitle($sInputBoxAnswer)                 MsgBox(0, 'Demo msg', 'new title ' & @CRLF & $rect._GetTitle($rect))         EndSelect         $newColour=_ChooseColor(2)         $newColour=StringReplace($newColour,'0x','#')         $rect._SetColour($newColour)         MsgBox(0, 'Demo msg', 'new Colour ' & @CRLF & $rect._GetColour($rect))         MsgBox(0, 'Demo msg', 'x,y moved by 50 px and double the size of the rect obj ' )         $rect._SetPos($newPos[1]+50, $newPos[2]+50, $newPos[3], $newPos[4])         $rectPosStr=''         $rectPos = $rect._GetPos($rect)         For $pos In $rectPos             $rectPosStr &= $pos & @CRLF         Next         MsgBox(0, 'Demo msg', 'new pos of $oRect object ' & @CRLF & $rectPosStr)     Else         MsgBox(0,'oops','Ahr! This was not meant to happen')     EndIf Next MsgBox(0, 'Demo msg', 'End of demo')






#2 AlmarM

AlmarM

    Programming my way.

  • Active Members
  • PipPipPipPipPipPip
  • 1,642 posts

Posted 22 May 2008 - 07:29 PM

Hehe, I like the Demo :)

#3 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 22 May 2008 - 07:36 PM

Hehe, I like the Demo :)

Thx mate. I actually wanted to use this stuff bo build a gui in html and have js worry about display, while au3 does the data handling. I left it though to a conceptual item, rather than put plenty of untested code here.

#4 weaponx

weaponx

    I'm coming for blood, no code of conduct, no law.

  • MVPs
  • 5,366 posts

Posted 22 May 2008 - 07:39 PM

Definitely interesting.

#5 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 22 May 2008 - 07:41 PM

Definitely interesting.

Again thx. I thought some people were gonna like it!

#6 ptrex

ptrex

    Universalist

  • MVPs
  • 2,399 posts

Posted 23 May 2008 - 07:23 AM

@ivan

Very nice !! :)

regards

ptrex

#7 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 23 May 2008 - 01:20 PM

@ivan

Very nice !! :)

regards

ptrex

Thank you ptrex, i'm flattered.

#8 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 03 September 2008 - 02:45 AM

Linking this topic to another one that allows execution of javascript code, but not returning objects or values, see http://www.autoitscript.com/forum/index.ph...st&p=573886

ivan

#9 Michel Claveau

Michel Claveau

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 352 posts

Posted 03 September 2008 - 06:25 AM

Hi, Ivan!

Thank you, but the exemple run not in HTA mode. It run under iexplore.exe and not under mshta.exe.
Rights are differents ; characteristics of HTA are not supported.

But your code is good for show interaction between Autoit & IE+Jscript.

@-salutations
--
Michel Claveau

#10 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 03 September 2008 - 01:15 PM

@michel,
Thanks for the advice. I know it runs under iexplore.exe, and as far as i've seen it, i can access the file system. If I may ask, in which other ways are the rights different?

#11 Michel Claveau

Michel Claveau

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 352 posts

Posted 04 September 2008 - 06:29 AM

Hi!

in which other ways are the rights different?



HTA run in the zone "Poste de travail" (sorry, I don't know the english name) ; iexplore run in the zone "Local zone".
When I open some COM (ActiveX) object, in "pure" HTA, there are no question ; in IE, the navigator prompt to user, for confirm. In IE embbed, no question, but the connexion is refused, with the internal error (not visible): access denied. With your exemple, I am in this last case.

I have a more complicated case. HTA can not be used by COM (it is NOT a COM server). I use often this technique:
- open a HTA, who connect to several COM servers (objects) (in an invisible window)
- the HTA open a IE instance, via OLE-automation (COM), with a local file
- the HTA inject, in some objects of the IE page, his propers links to COM-objects
- the HTA force the IE page to invisibility
By this way, I have a persistant COM access to the HTA, via the (invisible) IE page.

But this method don't run with a IE embbed, and the HTA-balises don't change the things.


Conclusion : the HTA balises are not suffisant to determine the HTA statut, over HTML.


*** sorry for my bad english ***

Edited by Michel Claveau, 04 September 2008 - 06:31 AM.


#12 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 05 September 2008 - 03:20 AM

Thanks Michel. I read your post carefully, as it seems you've done a lot more experimentation on this than I have. I have run similar scripts with JSrcipt (as opposed to javascript) and VBScript to query files and folders, so I thought I had the same access level as hta applications. Your procedure seems logical and I am wuite interested if you could provide a simple example. Only out of curiosity.

Thanks
ivan

#13 Michel Claveau

Michel Claveau

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 352 posts

Posted 05 September 2008 - 07:11 PM

Hi, Ivan!

In practice, I develop a big (fat? huge?) tool. Name : Ponx
Ponx is written in Python, with several tools & parts in AutoIt, Jscript and/or Batchs.

Basically, Ponx is a COM server. But more:
- Ponx is extensible (user can write new function during execution, in Python)
- Ponx is a dynamic COM server. Functions of ponx become functions of the caller (even user function)
- Ponx has many functions predefined (more then 1000)
- Ponx has sevaral extensions (primarily in Python), for control Excel, Word, OOo, emailing, newsgroups, voice, Idapi, PDF, etc.

in short, in the middle of all that, there is PBridge, who is the bridge (in HTA) between Ponx & IE.
All sources are included.

BUT :
- The documentation is very very late
- I don't speak english ; Ponx is in french (even several parts are multi-languages)


The site of Ponx: http://ponx.org
For install on line: http://www.ponx.org/ponx/linstal.htm (installer written in Autoit + Batch).


@-salutations

Michel Claveau


PS: another example of usage of Ponx+Autoit:
http://www.autoitscript.com/forum/index.ph...st&p=398746

#14 ivan

ivan

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 398 posts

Posted 05 September 2008 - 07:58 PM

I will try to polish my French, it's been almost 15 years since I last spoke or wrote anything, mais je vais essayer...
J'ai vécu cinq ans á Genéve il y a plus de veingt ans, alors ca va me prendre du temp. Je suis désolé mon "keyborad" est en Anglais.
Salut Michel




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users