{"id":3197,"date":"2016-01-28T17:47:07","date_gmt":"2016-01-28T13:47:07","guid":{"rendered":"http:\/\/www.dhtmlx.com\/blog\/?p=3197"},"modified":"2023-05-05T13:26:52","modified_gmt":"2023-05-05T10:26:52","slug":"save-login-password-in-browser","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/save-login-password-in-browser\/","title":{"rendered":"DHTMLX Little-Known Features: How To Save Login\/Password in Browser"},"content":{"rendered":"<p>From time to time we are asked to offer an easy way to use real HTML form with <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxForm\/\" target=\"_blank\">dhtmlxForm<\/a>. So we&#8217;d like to share this tip with you and show you the working sample of login form that forces a browser to save credentials for login\/password form.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/01\/save-credentials-in-chrome.png\" alt=\"Login\/password form\" width=\"585\" height=\"398\" class=\"aligncenter size-full wp-image-3198\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/01\/save-credentials-in-chrome.png 585w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/01\/save-credentials-in-chrome-300x204.png 300w\" sizes=\"auto, (max-width: 585px) 100vw, 585px\" \/><\/p>\n<p>Here is a complete demo (Enter &#8220;admin \/ 1&#8221; login details to check it). If you want to know how to make it in your application, continue reading this mini tutorial.<br \/>\n<!--more--><\/p>\n<p><strong> Step 1.<\/strong><\/p>\n<p>First of all, let&#8217;s create a real html form:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>form id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;realForm&quot;<\/span> action<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;check.php&quot;<\/span> method<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;POST&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>form<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p>Do not add inputs into it, this will be done by dhtmlxForm.<\/p>\n<p><strong>Step 2.<\/strong><\/p>\n<p>Add hidden iframe on page to submit real form without the page reloading:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>iframe border<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;0&quot;<\/span> frameBorder<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;0&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;submit_ifr&quot;<\/span> <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;submit_iframe&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>iframe<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p>And you need some css to hide it from eyes:<\/p>\n<div class=\"codecolorer-container css default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"css codecolorer\">&lt;style<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; iframe<span class=\"re1\">.submit_iframe<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">1px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">1px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">left<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">-100px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">top<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">-100px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">font-size<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">1px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&lt;\/style<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p><strong>Step 3.<\/strong><\/p>\n<p>Add <em>target<\/em> attr to form to force submit to the hidden iframe:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>form id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;realForm&quot;<\/span> action<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;check.php&quot;<\/span> method<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;POST&quot;<\/span> target<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;submit_ifr&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>form<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p><strong>Step 4.<\/strong><\/p>\n<p>Now it&#8217;s time to add dhtmlxForm:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">var<\/span> formData <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;settings&quot;<\/span><span class=\"sy0\">,<\/span> position<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;label-left&quot;<\/span><span class=\"sy0\">,<\/span> labelWidth<span class=\"sy0\">:<\/span> <span class=\"nu0\">75<\/span><span class=\"sy0\">,<\/span> inputWidth<span class=\"sy0\">:<\/span> <span class=\"nu0\">150<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;block&quot;<\/span><span class=\"sy0\">,<\/span> blockOffset<span class=\"sy0\">:<\/span> <span class=\"nu0\">30<\/span><span class=\"sy0\">,<\/span> offsetTop<span class=\"sy0\">:<\/span> <span class=\"nu0\">15<\/span><span class=\"sy0\">,<\/span> width<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;auto&quot;<\/span><span class=\"sy0\">,<\/span> list<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;label&quot;<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Please introduce yourself&quot;<\/span><span class=\"sy0\">,<\/span> labelWidth<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;auto&quot;<\/span><span class=\"sy0\">,<\/span> offsetLeft<span class=\"sy0\">:<\/span> <span class=\"nu0\">35<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;input&quot;<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Login&quot;<\/span><span class=\"sy0\">,<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhxform_demo_login&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span> offsetTop<span class=\"sy0\">:<\/span> <span class=\"nu0\">20<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;password&quot;<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Password&quot;<\/span><span class=\"sy0\">,<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhxform_demo_pwd&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;button&quot;<\/span><span class=\"sy0\">,<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;submit&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Let me in&quot;<\/span><span class=\"sy0\">,<\/span> offsetTop<span class=\"sy0\">:<\/span> <span class=\"nu0\">20<\/span><span class=\"sy0\">,<\/span> offsetLeft<span class=\"sy0\">:<\/span> <span class=\"nu0\">72<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> myForm <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhtmlXForm<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;dhxForm&quot;<\/span><span class=\"sy0\">,<\/span> formData<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><strong>Step 5.<\/strong><\/p>\n<p>Add an event handler for submitting (here instead of dhtmlxForm we&#8217;ll submit the real form):<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">myForm.<span class=\"me1\">attachEvent<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;onButtonClick&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>name<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>name <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;submit&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; document.<span class=\"me1\">getElementById<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;realForm&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">submit<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><strong>Step 6.<\/strong><\/p>\n<p>Here is the server side code you need:<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">&lt;?php<\/span><br \/>\n<span class=\"kw3\">header<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Content-Type: text\/html; charset=utf-8&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"sy0\">@<\/span><span class=\"re0\">$_REQUEST<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;dhxform_demo_login&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;admin&quot;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"sy0\">@<\/span><span class=\"re0\">$_REQUEST<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;dhxform_demo_pwd&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;1&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$state<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$state<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw3\">print_r<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&lt;meta http-equiv='Content-Type' content='text\/html; charset=UTF-8'\/&gt;&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw3\">print_r<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&lt;script&gt; try { parent.submitCallback(&quot;<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$state<\/span><span class=\"sy0\">.<\/span><span class=\"st0\">&quot;); } catch(e) {};&lt;\/script&gt;&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"sy1\">?&gt;<\/span><\/div><\/div>\n<p><strong>Final Step 7.<\/strong><\/p>\n<p>Add <em>submitCallback<\/em> function on client which will parse server response:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">function<\/span> submitCallback<span class=\"br0\">&#40;<\/span>status<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>status <span class=\"sy0\">==<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; document.<span class=\"me1\">location<\/span>.<span class=\"me1\">href<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;secret.html&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ reset form<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; myForm.<span class=\"me1\">setFormData<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span>dhxform_demo_login<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span> dhxform_demo_pwd<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>As a result you have a login\/password form that allows you to save credentials in browsers. We&#8217;ve set up our server so that if you enter the credentials &#8220;admin \/ 1&#8221; you&#8217;ll get to the secret page.<\/p>\n<p class=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/01\/login-form.png\" alt=\"login form with dhtmlxForm\" width=\"600\" height=\"367\" class=\"aligncenter size-full wp-image-3199\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/01\/login-form.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/01\/login-form-300x184.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>We hope this piece of information was useful for you; and feel free to use it in your applications. Share your comments below!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From time to time we are asked to offer an easy way to use real HTML form with dhtmlxForm. So we&#8217;d like to share this tip with you and &#8230;<\/p>\n","protected":false},"author":2,"featured_media":3392,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,72,1,38],"tags":[33,43,31,14],"class_list":["post-3197","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts-for-codeproject-com","category-general","category-uncategorized","category-visible","tag-all-posts","tag-dhtmlx-tips","tag-form","tag-tips"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=3197"}],"version-history":[{"count":1,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3197\/revisions"}],"predecessor-version":[{"id":11387,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3197\/revisions\/11387"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/3392"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=3197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=3197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=3197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}