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 !!! 8O
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 :D

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.. :wink:

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 :mrgreen:
Merci à vous 8)

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.. :D

Aaaah !! ce JHPJHP....c'est vraiment un magicien et une usine à lib à lui tout seul 8)
Merci à vous deux...ça marche maintenant du tonnerre de dieu :wink:

Re: Communiquez avec JavaScript

Publié : mer. 14/sept./2016 10:38
par falsam
/YeahhHHHhhhhh ^^