Communiquez avec JavaScript

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Communiquez avec JavaScript

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Communiquez avec JavaScript

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Communiquez avec JavaScript

Message 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
Dernière modification par nico le mar. 13/sept./2016 21:07, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Communiquez avec JavaScript

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Communiquez avec JavaScript

Message 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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Communiquez avec JavaScript

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Communiquez avec JavaScript

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Communiquez avec JavaScript

Message 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 
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Communiquez avec JavaScript

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Communiquez avec JavaScript

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Communiquez avec JavaScript

Message 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ù...
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Communiquez avec JavaScript

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Communiquez avec JavaScript

Message par falsam »

/YeahhHHHhhhhh ^^
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre