MktoForms2 :: Force known TLD - DNS API

by sanford

HTML

<script src="//app-sj01.marketo.com/js/forms2/js/forms2.min.js"></script>
<form id="mktoForm_169"></form>

JavaScript

MktoForms2.loadForm("//app-sj01.marketo.com", "410-XOR-673", 169)
MktoForms2.whenReady(function(form) {

		var emailExtendedValidationError = 'Doesn\'t sound like a real TLD!',
				emailField = 'Email',
				emailFieldSelector = '#' + emailField,
                validationComplete = false;
        
		form.onValidate(function(valid) {

            form.submittable(validationComplete); // we'll need to reenable on cb either way

            if (!form.submittable()) {
                debugger;
                console.log('performing secondary validation');
                
                var currentTLD = form.vals()[emailField].split('.').pop();

                dnsDomainExists(currentTLD, function(exists) {
                    if ( !exists ) {
				        form.showErrorMessage(emailExtendedValidationError, form.getFormElem().find(emailFieldSelector));
                    } else {
                        validationComplete = true;
                        form.submit();
                    }
				});
            } else {
                console.log('form will submit');   
            }
		});
    
		function dnsDomainExists(dnsDomain, callback) {

				var dnsAPIURL = 'http://api.statdns.com/' + dnsDomain + '/ns ',
						xdr;

				if ( window.XDomainRequest ) {
						xdr = new XDomainRequest;
						xdr.open('GET', dnsAPIURL); // IE8: HEAD + other peccadilloes
				} else {
						xdr = new XMLHttpRequest;
						xdr.open('HEAD', dnsAPIURL);
				}

				xdr.onerror = function() {
						if ( xdr instanceof XMLHttpRequest ) {
								alert('Unhandled error');
						} else {
								console.log('XDR handled error: API returned failure');
								callback(false);
						}

				};

				xdr.onload = function() {
						if ( xdr.status == 200 ) {
								console.log('XHR handled success: API returned success');
								callback(true);
						} else if (xdr instanceof XMLHttpRequest) {
								console.log('XHR handled success: API returned failure');
								callback(false);
						}...