Address Validation Demo

Try Address Validation

Use this demo to try the Address Validation API using any address from a supported region. The demo takes address components as input, and displays the validation response below. To parse an unstructured address, enter the entire address in the Street Address 1 field. Select example addresses from the drop-down at the top of the form.

TypeScript

 // DOM Refs 
 const 
  
 addressForm 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'address-form' 
 ); 
 const 
  
 validateButton 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'validate-button' 
 ); 
 const 
  
 clearFormButton 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'clear-form-button' 
 ); 
 const 
  
 resultDisplay 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'result-display' 
 ); 
 const 
  
 loadingText 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'loading-text' 
 ); 
 // Input field refs 
 const 
  
 streetAddress1Input 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'street-address-1' 
 ) 
  
 as 
  
 HTMLInputElement 
 ; 
 const 
  
 streetAddress2Input 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'street-address-2' 
 ) 
  
 as 
  
 HTMLInputElement 
 ; 
 const 
  
 cityInput 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'city' 
 ) 
  
 as 
  
 HTMLInputElement 
 ; 
 const 
  
 stateInput 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'state' 
 ) 
  
 as 
  
 HTMLInputElement 
 ; 
 const 
  
 zipCodeInput 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'zip-code' 
 ) 
  
 as 
  
 HTMLInputElement 
 ; 
 const 
  
 regionSelect 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'region-select' 
 ) 
  
 as 
  
 HTMLSelectElement 
 ; 
 const 
  
 exampleSelect 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'example-select' 
 ) 
  
 as 
  
 HTMLSelectElement 
 ; 
 // Core Initialization 
 async 
  
 function 
  
 init 
 () 
  
 { 
  
 // Load the Address Validation library. 
  
 await 
  
 google 
 . 
 maps 
 . 
 importLibrary 
 ( 
 'addressValidation' 
 ); 
  
 // Set event listeners 
  
 addressForm 
 ! 
 . 
 addEventListener 
 ( 
 'submit' 
 , 
  
 handleValidationSubmit 
 ); 
  
 exampleSelect 
 ! 
 . 
 addEventListener 
 ( 
 'change' 
 , 
  
 handleExampleSelectChange 
 ); 
  
 clearFormButton 
 ! 
 . 
 addEventListener 
 ( 
 'click' 
 , 
  
 handleClearForm 
 ); 
 } 
 // Validation Handler 
 async 
  
 function 
  
 handleValidationSubmit 
 ( 
 event 
 ) 
  
 { 
  
 event 
 . 
 preventDefault 
 (); 
  
 // Prevent default form submission 
  
 resultDisplay 
 ! 
 . 
 textContent 
  
 = 
  
 'Validating...' 
 ; 
  
 // Clear previous results 
  
 // Validate the address 
  
 try 
  
 { 
  
 //@ts-ignore 
  
 const 
  
 result 
  
 = 
  
 await 
  
 google 
 . 
 maps 
 . 
 addressValidation 
 . 
 AddressValidation 
 . 
 fetchAddressValidation 
 ({ 
  
 address 
 : 
  
 { 
  
 regionCode 
 : 
  
 regionSelect 
 ! 
 . 
 value 
 . 
 trim 
 (), 
  
 languageCode 
 : 
  
 'en' 
 , 
  
 addressLines 
 : 
  
 [ 
  
 streetAddress1Input 
 ! 
 . 
 value 
 . 
 trim 
 (), 
  
 streetAddress2Input 
 ! 
 . 
 value 
 . 
 trim 
 () 
  
 ]. 
 filter 
 ( 
 line 
  
 = 
>  
 line 
 ), 
  
 // Filter out empty lines 
  
 locality 
 : 
  
 cityInput 
 ! 
 . 
 value 
 . 
 trim 
 (), 
  
 administrativeArea 
 : 
  
 stateInput 
 ! 
 . 
 value 
 . 
 trim 
 (), 
  
 postalCode 
 : 
  
 zipCodeInput 
 ! 
 . 
 value 
 . 
 trim 
 (), 
  
 }, 
  
 }); 
  
 resultDisplay 
 ! 
 . 
 textContent 
  
 = 
  
 "Verdict summary\n================\n" 
  
 + 
  
 `Formatted address: 
 ${ 
 result 
 . 
 address 
 . 
 formattedAddress 
 } 
 \n` 
  
 + 
  
 `Entered: 
 ${ 
 result 
 . 
 verdict 
 . 
 inputGranularity 
 } 
 \n` 
  
 + 
  
 `Validated: 
 ${ 
 result 
 . 
 verdict 
 . 
 validationGranularity 
 } 
 \n` 
  
 + 
  
 `Geocoded: 
 ${ 
 result 
 . 
 verdict 
 . 
 geocodeGranularity 
 } 
 \n` 
  
 + 
  
 `Possible next action: 
 ${ 
 result 
 . 
 verdict 
 . 
 possibleNextAction 
 } 
 \n\n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'addressComplete' 
 ) 
 } 
 \n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'hasUnconfirmedComponents' 
 ) 
 } 
 \n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'hasInferredComponents' 
 ) 
 } 
 \n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'hasReplacedComponents' 
 ) 
 } 
 \n\n` 
  
 + 
  
 `Raw JSON response\n=================\n` 
  
 + 
  
 JSON 
 . 
 stringify 
 ( 
 result 
 , 
  
 null 
 , 
  
 '  ' 
 ); 
  
 } 
  
 catch 
  
 ( 
 error 
 ) 
  
 { 
  
 console 
 . 
 error 
 ( 
 'Validation failed:' 
 , 
  
 error 
 ); 
  
  
 if 
  
 ( 
 error 
  
 instanceof 
  
 Error 
 ) 
  
 { 
  
 resultDisplay 
 ! 
 . 
 textContent 
  
 = 
  
 `Error: 
 ${ 
 error 
 . 
 message 
 } 
 ` 
 ; 
  
 } 
  
 } 
  
 } 
 // Verdict messages 
 const 
  
 verdictMessages 
  
 = 
  
 { 
  
 addressComplete 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API found no unresolved, unexpected, or missing address elements.' 
 , 
  
 falseMessage 
 : 
  
 '- At least one address element is unresolved, unexpected, or missing.' 
 , 
  
 }, 
  
 hasUnconfirmedComponents 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API can\'t confirm at least one address component.' 
 , 
  
 falseMessage 
 : 
  
 '- The API confirmed all address components.' 
 , 
  
 }, 
  
 hasInferredComponents 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API inferred (added) at least one address component.' 
 , 
  
 falseMessage 
 : 
  
 '- The API did not infer (add) any address components.' 
 , 
  
 }, 
  
 hasReplacedComponents 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API replaced at least one address component.' 
 , 
  
 falseMessage 
 : 
  
 '- The API did not replace any address components.' 
 , 
  
 }, 
 }; 
 // Helper function to get the verdict message for a given verdict key 
 function 
  
 getVerdictMessage 
 ( 
 verdict 
 , 
  
 key 
 ) 
  
 { 
  
 if 
  
 ( 
 ! 
 verdict 
  
 || 
  
 ! 
 verdictMessages 
 [ 
 key 
 ]) 
  
 return 
  
 'Unknown' 
 ; 
  
 return 
  
 verdict 
 [ 
 key 
 ] 
  
 ? 
  
 verdictMessages 
 [ 
 key 
 ] 
 .trueMessage 
  
 : 
  
 verdictMessages 
 [ 
 key 
 ]. 
 falseMessage 
 ; 
 } 
 // Handler for Dropdown Change 
 function 
  
 handleExampleSelectChange 
 ( 
 event 
 ) 
  
 { 
  
 const 
  
 selectedValue 
  
 = 
  
 event 
 . 
 target 
 . 
 value 
 ; 
  
 if 
  
 ( 
 selectedValue 
 && 
 examples 
 [ 
 selectedValue 
 ]) 
  
 { 
  
 populateAddressFields 
 ( 
 examples 
 [ 
 selectedValue 
 ]); 
  
 } 
  
 else 
  
 if 
  
 ( 
 ! 
 selectedValue 
 ) 
  
 { 
  
 populateAddressFields 
 ( 
 null 
 ); 
  
 // Pass null to clear fields 
  
 } 
 } 
 // Clear Form Handler 
 function 
  
 handleClearForm 
 () 
  
 { 
  
 streetAddress1Input 
 ! 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 streetAddress2Input 
 ! 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 cityInput 
 ! 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 stateInput 
 ! 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 zipCodeInput 
 ! 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 regionSelect 
 ! 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 exampleSelect 
 ! 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 resultDisplay 
 ! 
 . 
 textContent 
  
 = 
  
 'Result will appear here...' 
 ; 
  
 console 
 . 
 log 
 ( 
 'Cleared form' 
 ); 
 } 
 // Example Address Data 
 const 
  
 examples 
  
 = 
  
 { 
  
 google 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '1600 Amphitheatre Parkway' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 // Explicitly empty 
  
 city 
 : 
  
 'Mountain View' 
 , 
  
 state 
 : 
  
 'CA' 
 , 
  
 zipCode 
 : 
  
 '94043' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 nonExistentSubpremise 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '2930 Pearl St.' 
 , 
  
 streetAddress2 
 : 
  
 'Suite 100' 
 , 
  
 city 
 : 
  
 'Boulder' 
 , 
  
 state 
 : 
  
 'CO' 
 , 
  
 zipCode 
 : 
  
 '' 
 , 
  
 // Explicitly empty 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 missingSubpremise 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '500 West 2nd Street' 
 , 
  
 streetAddress2 
 : 
  
 null 
 , 
  
 // Can use null or undefined too 
  
 city 
 : 
  
 'Austin' 
 , 
  
 state 
 : 
  
 'TX' 
 , 
  
 zipCode 
 : 
  
 '78701' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 misspelledLocality 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '1600 Amphitheatre Pkwy' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 city 
 : 
  
 'Montan View' 
 , 
  
 state 
 : 
  
 'CA' 
 , 
  
 zipCode 
 : 
  
 '94043' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 missingLocality 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 'Brandschenkestrasse 110 8002' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 city 
 : 
  
 '' 
 , 
  
 state 
 : 
  
 '' 
 , 
  
 zipCode 
 : 
  
 '' 
 , 
  
 region 
 : 
  
 '' 
  
 }, 
  
 usPoBox 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 'PO Box 1108' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 city 
 : 
  
 'Sterling' 
 , 
  
 state 
 : 
  
 'VA' 
 , 
  
 zipCode 
 : 
  
 '20166-1108' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
 }; 
 // Helper function to populate form fields with example address data 
 function 
  
 populateAddressFields 
 ( 
 exampleAddress 
 ) 
  
 { 
  
 if 
  
 ( 
 ! 
 exampleAddress 
 ) 
  
 { 
  
 console 
 . 
 warn 
 ( 
 "No example address data provided." 
 ); 
  
 return 
 ; 
  
 } 
  
 // Get values from example, providing empty string as default 
  
 streetAddress1Input 
 ! 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 streetAddress1 
  
 || 
  
 '' 
 ; 
  
 streetAddress2Input 
 ! 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 streetAddress2 
  
 || 
  
 '' 
 ; 
  
 cityInput 
 ! 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 city 
  
 || 
  
 '' 
 ; 
  
 stateInput 
 ! 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 state 
  
 || 
  
 '' 
 ; 
  
 zipCodeInput 
 ! 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 zipCode 
  
 || 
  
 '' 
 ; 
  
 regionSelect 
 ! 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 region 
  
 || 
  
 '' 
 ; 
  
 // Clear previous results and errors 
  
 resultDisplay 
 ! 
 . 
 textContent 
  
 = 
  
 'Result will appear here...' 
 ; 
  
 console 
 . 
 log 
 ( 
 "Populated fields with example: " 
 , 
  
 exampleAddress 
 ); 
 } 
 init 
 (); 
  

JavaScript

 // DOM Refs 
 const 
  
 addressForm 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'address-form' 
 ); 
 const 
  
 validateButton 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'validate-button' 
 ); 
 const 
  
 clearFormButton 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'clear-form-button' 
 ); 
 const 
  
 resultDisplay 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'result-display' 
 ); 
 const 
  
 loadingText 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'loading-text' 
 ); 
 // Input field refs 
 const 
  
 streetAddress1Input 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'street-address-1' 
 ); 
 const 
  
 streetAddress2Input 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'street-address-2' 
 ); 
 const 
  
 cityInput 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'city' 
 ); 
 const 
  
 stateInput 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'state' 
 ); 
 const 
  
 zipCodeInput 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'zip-code' 
 ); 
 const 
  
 regionSelect 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'region-select' 
 ); 
 const 
  
 exampleSelect 
  
 = 
  
 document 
 . 
 getElementById 
 ( 
 'example-select' 
 ); 
 // Core Initialization 
 async 
  
 function 
  
 init 
 () 
  
 { 
  
 // Load the Address Validation library. 
  
 await 
  
 google 
 . 
 maps 
 . 
 importLibrary 
 ( 
 'addressValidation' 
 ); 
  
 // Set event listeners 
  
 addressForm 
 . 
 addEventListener 
 ( 
 'submit' 
 , 
  
 handleValidationSubmit 
 ); 
  
 exampleSelect 
 . 
 addEventListener 
 ( 
 'change' 
 , 
  
 handleExampleSelectChange 
 ); 
  
 clearFormButton 
 . 
 addEventListener 
 ( 
 'click' 
 , 
  
 handleClearForm 
 ); 
 } 
 // Validation Handler 
 async 
  
 function 
  
 handleValidationSubmit 
 ( 
 event 
 ) 
  
 { 
  
 event 
 . 
 preventDefault 
 (); 
  
 // Prevent default form submission 
  
 resultDisplay 
 . 
 textContent 
  
 = 
  
 'Validating...' 
 ; 
  
 // Clear previous results 
  
 // Validate the address 
  
 try 
  
 { 
  
 //@ts-ignore 
  
 const 
  
 result 
  
 = 
  
 await 
  
 google 
 . 
 maps 
 . 
 addressValidation 
 . 
 AddressValidation 
 . 
 fetchAddressValidation 
 ({ 
  
 address 
 : 
  
 { 
  
 regionCode 
 : 
  
 regionSelect 
 . 
 value 
 . 
 trim 
 (), 
  
 languageCode 
 : 
  
 'en' 
 , 
  
 addressLines 
 : 
  
 [ 
  
 streetAddress1Input 
 . 
 value 
 . 
 trim 
 (), 
  
 streetAddress2Input 
 . 
 value 
 . 
 trim 
 () 
  
 ]. 
 filter 
 ( 
 line 
  
 = 
>  
 line 
 ), 
  
 // Filter out empty lines 
  
 locality 
 : 
  
 cityInput 
 . 
 value 
 . 
 trim 
 (), 
  
 administrativeArea 
 : 
  
 stateInput 
 . 
 value 
 . 
 trim 
 (), 
  
 postalCode 
 : 
  
 zipCodeInput 
 . 
 value 
 . 
 trim 
 (), 
  
 }, 
  
 }); 
  
 resultDisplay 
 . 
 textContent 
  
 = 
  
 "Verdict summary\n================\n" 
  
 + 
  
 `Formatted address: 
 ${ 
 result 
 . 
 address 
 . 
 formattedAddress 
 } 
 \n` 
  
 + 
  
 `Entered: 
 ${ 
 result 
 . 
 verdict 
 . 
 inputGranularity 
 } 
 \n` 
  
 + 
  
 `Validated: 
 ${ 
 result 
 . 
 verdict 
 . 
 validationGranularity 
 } 
 \n` 
  
 + 
  
 `Geocoded: 
 ${ 
 result 
 . 
 verdict 
 . 
 geocodeGranularity 
 } 
 \n` 
  
 + 
  
 `Possible next action: 
 ${ 
 result 
 . 
 verdict 
 . 
 possibleNextAction 
 } 
 \n\n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'addressComplete' 
 ) 
 } 
 \n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'hasUnconfirmedComponents' 
 ) 
 } 
 \n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'hasInferredComponents' 
 ) 
 } 
 \n` 
  
 + 
  
 ` 
 ${ 
 getVerdictMessage 
 ( 
 result 
 . 
 verdict 
 , 
  
 'hasReplacedComponents' 
 ) 
 } 
 \n\n` 
  
 + 
  
 `Raw JSON response\n=================\n` 
  
 + 
  
 JSON 
 . 
 stringify 
 ( 
 result 
 , 
  
 null 
 , 
  
 '  ' 
 ); 
  
 } 
  
 catch 
  
 ( 
 error 
 ) 
  
 { 
  
 console 
 . 
 error 
 ( 
 'Validation failed:' 
 , 
  
 error 
 ); 
  
 if 
  
 ( 
 error 
  
 instanceof 
  
 Error 
 ) 
  
 { 
  
 resultDisplay 
 . 
 textContent 
  
 = 
  
 `Error: 
 ${ 
 error 
 . 
 message 
 } 
 ` 
 ; 
  
 } 
  
 } 
 } 
 // Verdict messages 
 const 
  
 verdictMessages 
  
 = 
  
 { 
  
 addressComplete 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API found no unresolved, unexpected, or missing address elements.' 
 , 
  
 falseMessage 
 : 
  
 '- At least one address element is unresolved, unexpected, or missing.' 
 , 
  
 }, 
  
 hasUnconfirmedComponents 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API can\'t confirm at least one address component.' 
 , 
  
 falseMessage 
 : 
  
 '- The API confirmed all address components.' 
 , 
  
 }, 
  
 hasInferredComponents 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API inferred (added) at least one address component.' 
 , 
  
 falseMessage 
 : 
  
 '- The API did not infer (add) any address components.' 
 , 
  
 }, 
  
 hasReplacedComponents 
 : 
  
 { 
  
 trueMessage 
 : 
  
 '- The API replaced at least one address component.' 
 , 
  
 falseMessage 
 : 
  
 '- The API did not replace any address components.' 
 , 
  
 }, 
 }; 
 // Helper function to get the verdict message for a given verdict key 
 function 
  
 getVerdictMessage 
 ( 
 verdict 
 , 
  
 key 
 ) 
  
 { 
  
 if 
  
 ( 
 ! 
 verdict 
  
 || 
  
 ! 
 verdictMessages 
 [ 
 key 
 ]) 
  
 return 
  
 'Unknown' 
 ; 
  
 return 
  
 verdict 
 [ 
 key 
 ] 
  
 ? 
  
 verdictMessages 
 [ 
 key 
 ]. 
 trueMessage 
  
 : 
  
 verdictMessages 
 [ 
 key 
 ]. 
 falseMessage 
 ; 
 } 
 // Handler for Dropdown Change 
 function 
  
 handleExampleSelectChange 
 ( 
 event 
 ) 
  
 { 
  
 const 
  
 selectedValue 
  
 = 
  
 event 
 . 
 target 
 . 
 value 
 ; 
  
 if 
  
 ( 
 selectedValue 
 && 
 examples 
 [ 
 selectedValue 
 ]) 
  
 { 
  
 populateAddressFields 
 ( 
 examples 
 [ 
 selectedValue 
 ]); 
  
 } 
  
 else 
  
 if 
  
 ( 
 ! 
 selectedValue 
 ) 
  
 { 
  
 populateAddressFields 
 ( 
 null 
 ); 
  
 // Pass null to clear fields 
  
 } 
 } 
 // Clear Form Handler 
 function 
  
 handleClearForm 
 () 
  
 { 
  
 streetAddress1Input 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 streetAddress2Input 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 cityInput 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 stateInput 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 zipCodeInput 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 regionSelect 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 exampleSelect 
 . 
 value 
  
 = 
  
 '' 
 ; 
  
 resultDisplay 
 . 
 textContent 
  
 = 
  
 'Result will appear here...' 
 ; 
  
 console 
 . 
 log 
 ( 
 'Cleared form' 
 ); 
 } 
 // Example Address Data 
 const 
  
 examples 
  
 = 
  
 { 
  
 google 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '1600 Amphitheatre Parkway' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 // Explicitly empty 
  
 city 
 : 
  
 'Mountain View' 
 , 
  
 state 
 : 
  
 'CA' 
 , 
  
 zipCode 
 : 
  
 '94043' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 nonExistentSubpremise 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '2930 Pearl St.' 
 , 
  
 streetAddress2 
 : 
  
 'Suite 100' 
 , 
  
 city 
 : 
  
 'Boulder' 
 , 
  
 state 
 : 
  
 'CO' 
 , 
  
 zipCode 
 : 
  
 '' 
 , 
  
 // Explicitly empty 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 missingSubpremise 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '500 West 2nd Street' 
 , 
  
 streetAddress2 
 : 
  
 null 
 , 
  
 // Can use null or undefined too 
  
 city 
 : 
  
 'Austin' 
 , 
  
 state 
 : 
  
 'TX' 
 , 
  
 zipCode 
 : 
  
 '78701' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 misspelledLocality 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 '1600 Amphitheatre Pkwy' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 city 
 : 
  
 'Montan View' 
 , 
  
 state 
 : 
  
 'CA' 
 , 
  
 zipCode 
 : 
  
 '94043' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
  
 missingLocality 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 'Brandschenkestrasse 110 8002' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 city 
 : 
  
 '' 
 , 
  
 state 
 : 
  
 '' 
 , 
  
 zipCode 
 : 
  
 '' 
 , 
  
 region 
 : 
  
 '' 
  
 }, 
  
 usPoBox 
 : 
  
 { 
  
 streetAddress1 
 : 
  
 'PO Box 1108' 
 , 
  
 streetAddress2 
 : 
  
 '' 
 , 
  
 city 
 : 
  
 'Sterling' 
 , 
  
 state 
 : 
  
 'VA' 
 , 
  
 zipCode 
 : 
  
 '20166-1108' 
 , 
  
 region 
 : 
  
 'US' 
  
 }, 
 }; 
 // Helper function to populate form fields with example address data 
 function 
  
 populateAddressFields 
 ( 
 exampleAddress 
 ) 
  
 { 
  
 if 
  
 ( 
 ! 
 exampleAddress 
 ) 
  
 { 
  
 console 
 . 
 warn 
 ( 
 "No example address data provided." 
 ); 
  
 return 
 ; 
  
 } 
  
 // Get values from example, providing empty string as default 
  
 streetAddress1Input 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 streetAddress1 
  
 || 
  
 '' 
 ; 
  
 streetAddress2Input 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 streetAddress2 
  
 || 
  
 '' 
 ; 
  
 cityInput 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 city 
  
 || 
  
 '' 
 ; 
  
 stateInput 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 state 
  
 || 
  
 '' 
 ; 
  
 zipCodeInput 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 zipCode 
  
 || 
  
 '' 
 ; 
  
 regionSelect 
 . 
 value 
  
 = 
  
 exampleAddress 
 . 
 region 
  
 || 
  
 '' 
 ; 
  
 // Clear previous results and errors 
  
 resultDisplay 
 . 
 textContent 
  
 = 
  
 'Result will appear here...' 
 ; 
  
 console 
 . 
 log 
 ( 
 "Populated fields with example: " 
 , 
  
 exampleAddress 
 ); 
 } 
 init 
 (); 
  

CSS

 body 
 , 
 html 
  
 { 
  
 height 
 : 
  
 100 
 % 
 ; 
  
 margin 
 : 
  
 0 
 ; 
  
 padding 
 : 
  
 0 
 ; 
  
 overflow 
 : 
  
 hidden 
 ; 
  
 font-family 
 : 
  
 "Google Sans" 
 , 
  
 sans-serif 
 ; 
  
 font-size 
 : 
  
 20 
 px 
 ; 
  
 color 
 : 
  
 #333 
 ; 
 } 
 # 
 sidebar 
  
 { 
  
 width 
 : 
  
 800 
 px 
 ; 
  
 max-width 
 : 
  
 calc 
 ( 
 100 
 % 
  
 - 
  
 2 
 rem 
 ); 
  
 background-color 
 : 
  
 #fff 
 ; 
  
 border-color 
 : 
  
 #9ca3af 
 ; 
  
 border-style 
 : 
  
 solid 
 ; 
  
 border-radius 
 : 
  
 .5 
 rem 
 ; 
  
 box-shadow 
 : 
  
 0 
  
 4 
 px 
  
 6 
 px 
  
 -1 
 px 
  
 rgba 
 ( 
 0 
 , 
  
 0 
 , 
  
 0 
 , 
  
 .1 
 ), 
  
 0 
  
 2 
 px 
  
 4 
 px 
  
 -1 
 px 
  
 rgba 
 ( 
 0 
 , 
  
 0 
 , 
  
 0 
 , 
  
 .06 
 ); 
  
 display 
 : 
  
 flex 
 ; 
  
 flex-direction 
 : 
  
 column 
 ; 
  
 overflow 
 : 
  
 hidden 
 ; 
  
 max-height 
 : 
  
 calc 
 ( 
 100 
 % 
  
 - 
  
 2 
 rem 
 ); 
 } 
 . 
 sidebar-header 
  
 { 
  
 padding 
 : 
  
 .75 
 rem 
 ; 
  
 border-bottom 
 : 
  
 1 
 px 
  
 solid 
  
 #e5e7eb 
 ; 
  
 flex-shrink 
 : 
  
 0 
 } 
 . 
 sidebar-header 
  
 h2 
  
 { 
  
 margin 
 : 
  
 0 
 ; 
  
 font-size 
 : 
  
 1.125 
 rem 
 ; 
  
 font-weight 
 : 
  
 600 
 ; 
  
 color 
 : 
  
 #1f2937 
 } 
 . 
 sidebar-content 
  
 { 
  
 padding 
 : 
  
 .75 
 rem 
 ; 
  
 overflow-y 
 : 
  
 auto 
 ; 
  
 flex-grow 
 : 
  
 1 
 } 
 . 
 sidebar-content 
 :: 
 -webkit-scrollbar 
  
 { 
  
 width 
 : 
  
 6 
 px 
 } 
 . 
 sidebar-content 
 :: 
 -webkit-scrollbar-thumb 
  
 { 
  
 background-color 
 : 
  
 rgba 
 ( 
 0 
 , 
  
 0 
 , 
  
 0 
 , 
  
 .2 
 ); 
  
 border-radius 
 : 
  
 3 
 px 
 } 
 # 
 address-form>div 
  
 { 
  
 margin-bottom 
 : 
  
 .75 
 rem 
 } 
 # 
 address-form>button 
  
 { 
  
 margin-top 
 : 
  
 1 
 rem 
 } 
 label 
  
 { 
  
 display 
 : 
  
 block 
 ; 
  
 font-size 
 : 
  
 .75 
 rem 
 ; 
  
 font-weight 
 : 
  
 500 
 ; 
  
 color 
 : 
  
 #4b5563 
 ; 
  
 margin-bottom 
 : 
  
 .25 
 rem 
 } 
 input 
 [ 
 type 
 = 
 text 
 ] 
  
 { 
  
 width 
 : 
  
 100 
 % 
 ; 
  
 padding 
 : 
  
 .5 
 rem 
  
 .75 
 rem 
 ; 
  
 font-size 
 : 
  
 .875 
 rem 
 ; 
  
 border 
 : 
  
 1 
 px 
  
 solid 
  
 #d1d5db 
 ; 
  
 border-radius 
 : 
  
 .375 
 rem 
 ; 
  
 box-sizing 
 : 
  
 border-box 
 ; 
  
 transition 
 : 
  
 border-color 
  
 .15 
 s 
  
 ease-in-out 
 , 
  
 box-shadow 
  
 .15 
 s 
  
 ease-in-out 
 } 
 input 
 [ 
 type 
 = 
 text 
 ] 
 : 
 focus 
  
 { 
  
 outline 
 : 
  
 0 
 ; 
  
 border-color 
 : 
  
 #2563eb 
 ; 
  
 box-shadow 
 : 
  
 0 
  
 0 
  
 0 
  
 1 
 px 
  
 #2563eb 
 } 
 . 
 form-grid-triple 
  
 { 
  
 display 
 : 
  
 grid 
 ; 
  
 grid-template-columns 
 : 
  
 repeat 
 ( 
 3 
 , 
  
 minmax 
 ( 
 0 
 , 
  
 1 
 fr 
 )); 
  
 gap 
 : 
  
 .75 
 rem 
 } 
 @ 
 media 
  
 ( 
 max-width 
 : 
 400px 
 ) 
  
 { 
  
 . 
 form-grid-triple 
  
 { 
  
 grid-template-columns 
 : 
  
 1 
 fr 
  
 } 
 } 
 button 
  
 { 
  
 display 
 : 
  
 inline-block 
 ; 
  
 margin-right 
 : 
  
 .5 
 rem 
 ; 
  
 width 
 : 
  
 auto 
 ; 
  
 padding 
 : 
  
 .6 
 rem 
  
 .75 
 rem 
 ; 
  
 font-size 
 : 
  
 .875 
 rem 
 ; 
  
 font-weight 
 : 
  
 500 
 ; 
  
 color 
 : 
  
 #fff 
 ; 
  
 background-color 
 : 
  
 #2563eb 
 ; 
  
 border 
 : 
  
 none 
 ; 
  
 border-radius 
 : 
  
 .375 
 rem 
 ; 
  
 cursor 
 : 
  
 pointer 
 ; 
  
 transition 
 : 
  
 background-color 
  
 .15 
 s 
  
 ease-in-out 
 ; 
  
 text-align 
 : 
  
 center 
 } 
 button 
 : 
 hover 
  
 { 
  
 background-color 
 : 
  
 #1d4ed8 
 } 
 # 
 loading-indicator 
  
 { 
  
 margin-top 
 : 
  
 .5 
 rem 
 ; 
  
 font-size 
 : 
  
 .75 
 rem 
 ; 
  
 color 
 : 
  
 #2563eb 
 ; 
  
 font-style 
 : 
  
 italic 
 ; 
  
 display 
 : 
  
 none 
 ; 
  
 align-items 
 : 
  
 center 
 ; 
  
 gap 
 : 
  
 .5 
 rem 
 } 
 . 
 spinner 
  
 { 
  
 width 
 : 
  
 1 
 em 
 ; 
  
 height 
 : 
  
 1 
 em 
 ; 
  
 border 
 : 
  
 2 
 px 
  
 solid 
  
 currentColor 
 ; 
  
 border-right-color 
 : 
  
 transparent 
 ; 
  
 border-radius 
 : 
  
 50 
 % 
 ; 
  
 animation 
 : 
  
 spin 
  
 1 
 s 
  
 linear 
  
 infinite 
 ; 
  
 display 
 : 
  
 inline-block 
 } 
 @ 
 keyframes 
  
 spin 
  
 { 
  
 to 
  
 { 
  
 transform 
 : 
  
 rotate 
 ( 
 360 
 deg 
 ) 
  
 } 
 } 
 # 
 error-message 
  
 { 
  
 margin-top 
 : 
  
 .5 
 rem 
 ; 
  
 font-size 
 : 
  
 .75 
 rem 
 ; 
  
 color 
 : 
  
 #dc2626 
 ; 
  
 font-weight 
 : 
  
 500 
 ; 
  
 display 
 : 
  
 none 
 } 
 # 
 result-container 
  
 { 
  
 margin-top 
 : 
  
 1 
 rem 
 ; 
  
 border-top 
 : 
  
 1 
 px 
  
 solid 
  
 #e5e7eb 
 ; 
  
 padding-top 
 : 
  
 .75 
 rem 
 } 
 # 
 result-display 
  
 { 
  
 font-family 
 : 
  
 Consolas 
 , 
  
 Monaco 
 , 
  
 "Andale Mono" 
 , 
  
 "Ubuntu Mono" 
 , 
  
 monospace 
 ; 
  
 font-size 
 : 
  
 .75 
 rem 
 ; 
  
 background-color 
 : 
  
 #f3f4f6 
 ; 
  
 padding 
 : 
  
 .5 
 rem 
 ; 
  
 border-radius 
 : 
  
 .25 
 rem 
 ; 
  
 overflow-x 
 : 
  
 auto 
 ; 
  
 white-space 
 : 
  
 pre 
 ; 
  
 height 
 : 
  
 12 
 rem 
 ; 
  
 border 
 : 
  
 1 
 px 
  
 solid 
  
 #e5e7eb 
 } 
 @ 
 media 
  
 ( 
 max-width 
 : 
 767px 
 ) 
  
 { 
  
 # 
 sidebar 
  
 { 
  
 width 
 : 
  
 auto 
 ; 
  
 max-width 
 : 
  
 100 
 % 
 ; 
  
 margin 
 : 
  
 0 
 ; 
  
 max-height 
 : 
  
 70 
 vh 
 ; 
  
 border-radius 
 : 
  
 0 
 ; 
  
 border-top-left-radius 
 : 
  
 .5 
 rem 
 ; 
  
 border-top-right-radius 
 : 
  
 .5 
 rem 
 ; 
  
 border-top 
 : 
  
 1 
 px 
  
 solid 
  
 #d1d5db 
 ; 
  
 box-shadow 
 : 
  
 0 
  
 -4 
 px 
  
 6 
 px 
  
 -1 
 px 
  
 rgba 
 ( 
 0 
 , 
  
 0 
 , 
  
 0 
 , 
  
 .1 
 ), 
  
 0 
  
 -2 
 px 
  
 4 
 px 
  
 -1 
 px 
  
 rgba 
 ( 
 0 
 , 
  
 0 
 , 
  
 0 
 , 
  
 .06 
 ) 
  
 } 
 } 
 . 
 form-select 
  
 { 
  
 display 
 : 
  
 block 
 ; 
  
 width 
 : 
  
 100 
 % 
 ; 
  
 padding 
 : 
  
 .5 
 rem 
  
 2.5 
 rem 
  
 .5 
 rem 
  
 .75 
 rem 
 ; 
  
 font-size 
 : 
  
 .875 
 rem 
 ; 
  
 font-weight 
 : 
  
 400 
 ; 
  
 line-height 
 : 
  
 1.5 
 ; 
  
 color 
 : 
  
 #333 
 ; 
  
 background-color 
 : 
  
 #fff 
 ; 
  
 background-image 
 : 
  
 url 
 ( 
 "data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e" 
 ); 
  
 background-repeat 
 : 
  
 no-repeat 
 ; 
  
 background-position 
 : 
  
 right 
  
 .75 
 rem 
  
 center 
 ; 
  
 background-size 
 : 
  
 16 
 px 
  
 12 
 px 
 ; 
  
 border 
 : 
  
 1 
 px 
  
 solid 
  
 #d1d5db 
 ; 
  
 border-radius 
 : 
  
 .375 
 rem 
 ; 
  
 appearance 
 : 
  
 none 
 ; 
  
 transition 
 : 
  
 border-color 
  
 .15 
 s 
  
 ease-in-out 
 , 
  
 box-shadow 
  
 .15 
 s 
  
 ease-in-out 
 ; 
  
 cursor 
 : 
  
 pointer 
 } 
 . 
 form-select 
 : 
 focus 
  
 { 
  
 border-color 
 : 
  
 #2563eb 
 ; 
  
 outline 
 : 
  
 0 
 ; 
  
 box-shadow 
 : 
  
 0 
  
 0 
  
 0 
  
 1 
 px 
  
 #2563eb 
 } 
 . 
 form-select 
  
 option 
 [ 
 disabled 
 ] 
  
 { 
  
 color 
 : 
  
 #9ca3af 
 } 
  

HTML

<html>
  <head>
    <title>Address Validation</title>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
      <!-- Address Validation Form Container -->
      <div id="sidebar">
        <!-- Header -->
        <div class="sidebar-header">
          <h2>Address Validation</h2>
        </div>
        <!-- Content: Address Form -->
        <form id="address-form" class="sidebar-content" autocomplete="off">
          <!-- Example Dropdown Section -->
          <div id="example-dropdown-container" style="margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid #e5e7eb;">
            <label for="example-select" style="margin-bottom: 0.5rem;">Load Example Address:</label>
            <select id="example-select" name="exampleSelect" class="form-select">
              <option value="" selected disabled>-- Select an Example --</option>
              <option value="google">Valid Address</option>
              <option value="nonExistentSubpremise">Non-existent Subpremise</option>
              <option value="missingSubpremise">Missing Subpremise</option>
              <option value="misspelledLocality">Misspelled Locality</option>
              <option value="missingLocality">Missing Locality</option>
              <option value="usPoBox">US PO Box</option>
            </select>
          </div>
          <div>
            <label for="street-address-1">Street Address 1</label>
            <input
              id="street-address-1"
              name="streetAddress1"
              type="text"
              placeholder="e.g., 1600 Amphitheatre Parkway"
            />
          </div>
          <div>
            <label for="street-address-2">Street Address 2 (Optional)</label>
            <input
              id="street-address-2"
              name="streetAddress2"
              type="text"
              placeholder="e.g., Suite 100"
            />
          </div>
          <!-- Use a div with grid class for City/State/ZIP layout -->
          <div class="form-grid-triple">
            <div>
              <label for="city">City</label>
              <input id="city" name="city" type="text" placeholder="e.g., Mountain View" />
            </div>
            <div>
              <label for="state">State or territory</label>
              <input id="state" name="state" type="text" placeholder="e.g., CA" />
            </div>
            <div>
              <label for="zip-code">ZIP Code</label>
              <input id="zip-code" name="zipCode" type="text" placeholder="e.g., 94043" />
            </div>
          </div>
          <div id="region-select-container">
            <div>
              <label for="region-select">Region</label>
              <select id="region-select" name="regionSelect" class="form-select">
                <option value="AR">Argentina</option>
                <option value="AU">Australia</option>
                <option value="AT">Austria</option>
                <option value="BE">Belgium</option>
                <option value="BR">Brazil</option>
                <option value="BG">Bulgaria</option>
                <option value="CA">Canada</option>
                <option value="CL">Chile</option>
                <option value="CO">Colombia</option>
                <option value="HR">Croatia</option>
                <option value="CZ">Czechia</option>
                <option value="DK">Denmark</option>
                <option value="EE">Estonia</option>
                <option value="FI">Finland</option>
                <option value="FR">France</option>
                <option value="DE">Germany</option>
                <option value="HU">Hungary</option>
                <option value="IN">India</option>
                <option value="IE">Ireland</option>
                <option value="IT">Italy</option>
                <option value="JP">Japan</option>
                <option value="LV">Latvia</option>
                <option value="LT">Lithuania</option>
                <option value="LU">Luxembourg</option>
                <option value="MY">Malaysia</option>
                <option value="MX">Mexico</option>
                <option value="NL">Netherlands</option>
                <option value="NO">Norway</option>
                <option value="NZ">New Zealand</option>
                <option value="PL">Poland</option>
                <option value="PT">Portugal</option>
                <option value="PR">Puerto Rico</option>
                <option value="SG">Singapore</option>
                <option value="SK">Slovakia</option>
                <option value="SI">Slovenia</option>
                <option value="ES">Spain</option>
                <option value="SE">Sweden</option>
                <option value="CH">Switzerland</option>
                <option value="GB">United Kingdom</option>
                <option value="US" selected>United States</option>
                <option value="">Unknown</option>
              </select>
            </div>
          </div>

          <button id="validate-button" type="submit">Validate Address</button>

          <button id="clear-form-button" type="button" event="handleClearForm">Clear Form</button>

          <!-- Result Display Area -->
          <div id="result-container">
            <label for="result-display">Validation Result (formatted address and JSON)</label>
            <pre id="result-display">Result will appear here...</pre>
          </div>
        </form>
      </div>
    <!-- prettier-ignore -->
    <script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
      ({key: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "beta"});</script>
  </body>
</html>  

Try Sample

Create a Mobile Website
View Site in Mobile | Classic
Share by: