MktoForms2 :: Dependent Selects for Chris Perez

by sanford

HTML

<script src="//app-sj01.marketo.com/js/forms2/js/forms2.min.js"></script>
<form id="mktoForm_1972"></form>
<script>MktoForms2.loadForm("//app-sj03.marketo.com", "856-MGL-296", 1972, function(form) 
    {
    
        var master = document.getElementById('meetingTopics');
        var dependent = document.getElementById('leadership');
        var dependencies = JSON.parse(document.getElementById('select-dependencies').innerText)
        var depId = dependent.id, templateId = depId + '_template';
        
        // create template shell
        var dynamicDependentTemplate = document.createElement('SELECT');
        dependent.parentNode.appendChild(dynamicDependentTemplate);        
        
        // clone initial select into template w/modified id
        dependent.setAttribute('id', templateId);
        dynamicDependentTemplate.outerHTML = dependent.outerHTML;
        
        // reset to original id, truncate to placeholder option ("Select...")
        dependent.setAttribute('id', depId);
        dependent.options.length = 1;
        
        // reset reference and eject template from DOM
        dynamicDependentTemplate = document.getElementById(templateId);
        dynamicDependentTemplate.parentNode.removeChild(dynamicDependentTemplate);
        
        // run through master's selected options on every change and repopulate dependent from template
        master[master.addEventListener ? 'addEventListener' : 'attachEvent'](
            master.addEventListener ? 'change' : 'onchange',function(){
            dependent.options.length = 1;
            
            for ( var opts = dynamicDependentTemplate.options, 
                    currentOpt = 1, 
                    maxOpt = opts.length; currentOpt < maxOpt; currentOpt++ ) 
            {
                var newOpt = new Option(), optValue = opts[currentOpt].getAttribute('value');    

                for ( var selects = master.options, 
                        currentSelect = 1, 
                       ...

CSS

INPUT:focus {
    outline: none;
}