Page 1 sur 1
Communiquez avec JavaScript
Publié : mar. 13/sept./2016 11:21
par falsam
C'est une réponse que j'ai apporté sur le forum anglais.
Comment
- Envoyer une variable
n PB à un script JavaScript (
par exemple 16)
- Calculer la racine carré de cette valeur avec la fonction JavaScript Math.sqrt()
- Retourner le résultat au code PureBasic.
Code : Tout sélectionner
Enumeration Window
#mainForm
EndEnumeration
Enumeration Gadget
#HideWeb
EndEnumeration
Global HTML.s
OpenWindow(#mainForm, 88, 244, 500, 200, "PB <==> JavasScript", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
WebGadget (#HideWeb, 0, 0, 0, 0, "")
Procedure.s sqrt(n)
HTML = "<meta http-equiv='X-UA-Compatible' content='IE=edge' />"
HTML + "<script>"
HTML + "window.clipboardData.setData( 'Text', Math.sqrt(v_n).toString() );"
HTML + "</script>"
HTML = ReplaceString(HTML, "v_n", Str(n))
SetGadgetItemText(#HideWeb, #PB_Web_HtmlCode , HTML)
ProcedureReturn GetClipboardText()
EndProcedure
Debug sqrt(16)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Re: Communiquez avec JavaScript
Publié : mar. 13/sept./2016 12:29
par Kwai chang caine
Tiens....c'est "zarebi" ça marche pas à tous les coups avec la v5.40 !!!
Des fois le 4 apparait, et des fois non, j'ai essayé de lancer pleins de fois et j'ai pas compris pourquoi..peut être une histoire de delai ???
Avec la v5.50 ça a l'air de mieux marcher...
C'est cool ton histoire

Re: Communiquez avec JavaScript
Publié : mar. 13/sept./2016 20:04
par nico
Cool, merci du partage.
@Kwai chang caine
Je pense que c'est parce que la procédure sqr(...) est lancé avant la boucle window; essayes avec ça, j'ai mis un petit delai en plus:
Code : Tout sélectionner
Enumeration Window
#mainForm
EndEnumeration
Enumeration Gadget
#Bouton
#HideWeb
EndEnumeration
Global HTML.s
OpenWindow(#mainForm, 88, 244, 500, 200, "PB <==> JavasScript", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Bouton, 240,10,100,20,"Racine de 16")
WebGadget (#HideWeb, 0, 0, 200, 200, "")
HideGadget(#HideWeb, 1)
Procedure.s sqrt(n)
HTML = "<html>"
HTML + "<meta http-equiv='X-UA-Compatible' content='IE=edge' />"
HTML + "<body>"
HTML + "<script>"
HTML + "window.clipboardData.setData( 'Text', Math.sqrt(v_n).toString() );"
HTML + "</script>"
;HTML + "coucou"
HTML + "</body>"
HTML + "</html>"
HTML = ReplaceString(HTML, "v_n", Str(n))
SetGadgetItemText(#HideWeb, #PB_Web_HtmlCode , HTML)
Delay(100)
EndProcedure
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
gadget = EventGadget()
Select gadget
Case #Bouton
sqrt(16)
Debug GetClipboardText()
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
Re: Communiquez avec JavaScript
Publié : mar. 13/sept./2016 20:34
par nico
Une amélioration que je propose, au lieu d'utiliser le clipboard, j'utilise le titre de la page; ça évite d'éventuels problèmes et puis on peut en lancer plusieurs dans des threads sans soucis.
Code : Tout sélectionner
Enumeration Window
#mainForm
EndEnumeration
Enumeration Gadget
#Bouton
#HideWeb
EndEnumeration
Global HTML.s
OpenWindow(#mainForm, 88, 244, 500, 200, "PB <==> JavasScript", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Bouton, 240,10,100,20,"Racine de 16")
WebGadget (#HideWeb, 0, 0, 200, 200, "")
HideGadget(#HideWeb, 1)
Procedure.s sqrt(n)
HTML = "<html>"
HTML + "<meta http-equiv='X-UA-Compatible' content='IE=edge' />"
HTML + "<body>"
HTML + "<script>"
HTML + "result = Math.sqrt(v_n).toString();"
HTML + "document.title = result;"
HTML + "</script>"
HTML + "coucou"
HTML + "</body>"
HTML + "</html>"
HTML = ReplaceString(HTML, "v_n", Str(n))
SetGadgetItemText(#HideWeb, #PB_Web_HtmlCode , HTML)
Delay(100)
EndProcedure
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
gadget = EventGadget()
Select gadget
Case #Bouton
sqrt(16)
Debug GetGadgetItemText(#HideWeb, #PB_Web_PageTitle)
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
Re: Communiquez avec JavaScript
Publié : mar. 13/sept./2016 21:10
par nico
Un autre exemple, pour convertir une chaine en utf8 pour l'envoyer en post dans une requete web, pratique si on veut faire des push de messages via pushbullet par exemple.
Code : Tout sélectionner
Enumeration Window
#mainForm
EndEnumeration
Enumeration Gadget
#Bouton
#HideWeb
EndEnumeration
Global HTML.s
OpenWindow(#mainForm, 88, 244, 500, 200, "PB <==> JavasScript", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Bouton, 240,10,200,20,"x-www-form-urlencoded")
WebGadget (#HideWeb, 0, 0, 200, 200, "")
HideGadget(#HideWeb, 1)
Procedure.s FormUrlencoded(valeur.s)
HTML = "<html>" + Chr(13) + Chr(10)
HTML + "<meta http-equiv='X-UA-Compatible' content='IE=edge' />" + Chr(13) + Chr(10)
HTML + "<body>" + Chr(13) + Chr(10)
HTML + "<script>" + Chr(13) + Chr(10)
HTML + "function fixedEncodeURIComponent (str) {" + Chr(13) + Chr(10)
HTML + "return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {" + Chr(13) + Chr(10)
HTML + "return '%' + c.charCodeAt(0).toString(16);" + Chr(13) + Chr(10)
HTML + "});" + Chr(13) + Chr(10)
HTML + "}" + Chr(13) + Chr(10)
HTML + "result = fixedEncodeURIComponent ('string');" + Chr(13) + Chr(10)
HTML + "document.title = result;" + Chr(13) + Chr(10)
HTML + "</script>" + Chr(13) + Chr(10)
HTML + "coucou" + Chr(13) + Chr(10)
HTML + "</body>" + Chr(13) + Chr(10)
HTML + "</html>" + Chr(13) + Chr(10)
HTML = ReplaceString(HTML, "string", valeur)
SetGadgetItemText(#HideWeb, #PB_Web_HtmlCode , HTML)
Delay(100)
EndProcedure
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
gadget = EventGadget()
Select gadget
Case #Bouton
FormUrlencoded("Ceci est une chaîne !")
result.s = GetGadgetItemText(#HideWeb, #PB_Web_PageTitle)
result = ReplaceString(result, "%20", "+")
Debug result
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
Re: Communiquez avec JavaScript
Publié : mar. 13/sept./2016 21:48
par falsam
Bien ce dernier exemple.
nico a écrit :Je pense que c'est parce que la procédure sqr(...) est lancé avant la boucle window; essayes avec ça, j'ai mis un petit delai en plus:
N'ayant pas eu ce souci, j'ai oublié de tester la fin du chargement de la page.
L'utilisation du titre de la page pour stocker les variable est intéressante. Il permet de ne pas effacer ce que l'utilisateur a pu copier dans le clipboard. J'aurais pu aussi mémoriser le clipboard pour le restaurer par la suite.
Cette façon d'utiliser JavasScript est pratique pour l'utilisation de fonctionnalités JavaScript que Purebasic ne possède pas.
Re: Communiquez avec JavaScript
Publié : mar. 13/sept./2016 22:24
par djes
Super tout ça ! Est-ce qu'il y aurait moyen de récupérer l'adresse du proxy en javascript ? Je sais qu'IE propose parfois des trucs non standards, ici ce serait bien pratique pour certains problèmes spécifiques.
Re: Communiquez avec JavaScript
Publié : mar. 13/sept./2016 23:12
par nico
Encore une amélioration, j'utilise aussi le changement du titre comme évènement mais il a fallu faire un hack pour récupérer cette événement avec cette ligne:
HTML + "<img src='
http://127.0.0.1/image.image' >" + Chr(13) + Chr(10)
Voici l'exemple:
Code : Tout sélectionner
Enumeration Window
#mainForm
EndEnumeration
Enumeration Gadget
#Bouton
#HideWeb
EndEnumeration
Global HTML.s
Procedure.s FormUrlencoded(valeur.s)
HTML = "<html>" + Chr(13) + Chr(10)
HTML + "<head>" + Chr(13) + Chr(10)
HTML + "<meta http-equiv='X-UA-Compatible' content='IE=edge' />" + Chr(13) + Chr(10)
HTML + "<title>-</title>" + Chr(13) + Chr(10)
HTML + "</head>" + Chr(13) + Chr(10)
HTML + "<body>" + Chr(13) + Chr(10)
; nécessaire pour avoir l'event PB_EventType_TitleChange
; mettre au début
HTML + "<img src='http://127.0.0.1/image.image' >" + Chr(13) + Chr(10)
HTML + "<script>" + Chr(13) + Chr(10)
HTML + "function fixedEncodeURIComponent (str) {" + Chr(13) + Chr(10)
HTML + "return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {" + Chr(13) + Chr(10)
HTML + "return '%' + c.charCodeAt(0).toString(16);" + Chr(13) + Chr(10)
HTML + "});" + Chr(13) + Chr(10)
HTML + "}" + Chr(13) + Chr(10)
HTML + "result = fixedEncodeURIComponent ('string');" + Chr(13) + Chr(10)
HTML + "document.title = result;" + Chr(13) + Chr(10)
HTML + "</script>" + Chr(13) + Chr(10)
HTML + "coucou" + Chr(13) + Chr(10)
HTML + "</body>" + Chr(13) + Chr(10)
HTML + "</html>" + Chr(13) + Chr(10)
HTML = ReplaceString(HTML, "string", valeur)
SetGadgetItemText(#HideWeb, #PB_Web_HtmlCode , HTML)
EndProcedure
If OpenWindow(#mainForm, 88, 244, 500, 200, "PB <==> JavasScript", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Bouton, 240,10,200,20,"x-www-form-urlencoded")
WebGadget (#HideWeb, 0, 0, 0, 0, "")
HideGadget(#HideWeb, 1)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
gadget = EventGadget()
Select gadget
Case #Bouton
FormUrlencoded("Ceci est une chaîne !")
Case #HideWeb
Select EventType()
Case #PB_EventType_TitleChange
Debug "#PB_EventType_TitleChange"
result.s = GetGadgetItemText(#HideWeb, #PB_Web_PageTitle)
result = ReplaceString(result, "%20", "+")
Debug result
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Re: Communiquez avec JavaScript
Publié : mer. 14/sept./2016 9:11
par Kwai chang caine
Nico a écrit :@Kwai chang caine
Je pense que c'est parce que la procédure sqr(...) est lancé avant la boucle window; essayes avec ça, j'ai mis un petit delai en plus:
Merci Nico de t'être penché sur mon probleme
En fait c'est pas grave, c'était juste pour info, et comme j'ai trouvé ça bizarre...
Toujours W7 X86
Alors tes modifs marchent mieux, mais cette fois, la premiere fois avec la v5.40 c'est vide, le debugger s'affiche avec rien, et toutes les autres fois y'a le 4 qui apparait
Et avec la v5.50 tout marche niquel...diiiiiingue noooon !!!!
encore une fois c'est juste pour info, si ça vous intéresse de corriger...vous tracassez pas pour ça..
En tout cas intéréssant ce sujet et ces codes, j'adore tout ce qui touche au WEB en partant de PB
Ca permet de bidouiller cette daube de WEB tout en restant les deux pieds dans nos chaussons PB
Merci à vous

Re: Communiquez avec JavaScript
Publié : mer. 14/sept./2016 10:03
par falsam
Kwai chang caine a écrit :c'est juste pour info, si ça vous intéresse de corriger...
Oui ça m’intéresse de corriger afin d'obtenir une solution 100% fiable.
Le delay() n'est pas la solution ultime apparement. Hier soir JHPJHP sur le forum anglophone m'a donné une autre solution que je te propose de tester quand tu auras un moment.
Code : Tout sélectionner
Enumeration Window
#mainForm
EndEnumeration
Enumeration Gadget
#HideWeb
EndEnumeration
Global HTML.s
OpenWindow(#mainForm, 88, 244, 500, 200, "PB <==> JavasScript", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
WebGadget (#HideWeb, 0, 0, 0, 0, "")
Procedure.s sqrt(n)
HTML = "<html>"
HTML + "<meta http-equiv='X-UA-Compatible' content='IE=edge' />"
HTML + "<body>"
HTML + "<script>"
HTML + "result = Math.sqrt(v_n).toString();"
HTML + "document.title = result;"
HTML + "</script>"
HTML + "</body>"
HTML + "</html>"
HTML = ReplaceString(HTML, "v_n", Str(n))
SetGadgetItemText(#HideWeb, #PB_Web_HtmlCode , HTML)
;Le Delay() est remplacé par ces quelques lignes.
Repeat
PageTitle.s = GetGadgetItemText(#HideWeb, #PB_Web_PageTitle)
If FindString(GetGadgetItemText(#HideWeb, #PB_Web_HtmlCode), HTML) And PageTitle <> "" : Break : EndIf : WindowEvent() : Delay(1)
ForEver
ProcedureReturn GetGadgetItemText(#HideWeb, #PB_Web_PageTitle)
EndProcedure
Debug sqrt(16)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
djes a écrit :Est-ce qu'il y aurait moyen de récupérer l'adresse du proxy en javascript ?
Détecter un
bon proxy me parait pas possible.
Re: Communiquez avec JavaScript
Publié : mer. 14/sept./2016 10:33
par djes
Non, je veux juste l'adresse du proxy utilisé par ie sur la page en cours, la même chose qu'on aurait en regardant la base de registre. C'est peut-être dans le dom mais je n'ai pas encore regardé, je demande au cas où...
Re: Communiquez avec JavaScript
Publié : mer. 14/sept./2016 10:37
par Kwai chang caine
Falsam a écrit :que je te propose de tester quand tu auras un moment.
Maaaais ...je suis à toi comme la sardine est à l'huile..
Aaaah !! ce JHPJHP....c'est vraiment un magicien et une usine à lib à lui tout seul
Merci à vous deux...ça marche maintenant du tonnerre de dieu

Re: Communiquez avec JavaScript
Publié : mer. 14/sept./2016 10:38
par falsam
/YeahhHHHhhhhh ^^