mdl-stepper icon indicating copy to clipboard operation
mdl-stepper copied to clipboard

MaterialStepper instance is not available for selector: .mdl-stepper#ipet-stepper.

Open redimongo opened this issue 7 years ago • 5 comments

Hi I really need some help getting this to work.

I have followed all the steps yet I keep getting this error MaterialStepper instance is not available for selector: .mdl-stepper#ipet-stepper. I am using mdl version 1.3.0

Here is my code


<script type="text/javascript">
 var uid = '{$smarty.session.ipet_user}';
 
	function stylesheet(url) {
            var s = document.createElement('link');
            s.rel = 'stylesheet';
            s.async = false;
            s.href = url;
            var x = document.getElementsByTagName('head')[0];
            x.appendChild(s);
        }
		
		function script(url) {
            var s = document.createElement('script');
            s.type = 'text/javascript';
            s.async = true;
            s.src = url;
            var x = document.getElementsByTagName('head')[0];
            x.appendChild(s);
        }
		
		
		 (function () {
				stylesheet('https://opensource.keycdn.com/fontawesome/4.7.0/font-awesome.min.css');
                stylesheet('https://fonts.googleapis.com/css?family=Roboto');
				stylesheet('https://fonts.googleapis.com/icon?family=Material+Icons');
				stylesheet('./templates/main/user-theme/tpl-files/material.act.css');
                stylesheet('plugins/dropzone/dropzone.css');
				stylesheet('plugins/stepper/stepper.min.css');
				stylesheet('./templates/main/user-theme/tpl-files/style.css');
                stylesheet('./templates/main/style/newprofile.css');
				stylesheet('plugins/getmdlselect/getmdl-select.min.css');		
				

				script('https://code.getmdl.io/1.3.0/material.min.js');
				script('https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js');
				script('https://apis.google.com/js/api:client.js');
				script('https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyBk99v0F4qkmvxifqOD48YktK-QO-3kopI');
				script('./templates/main/user-theme/javascript/google.js');
				script('plugins/getmdlselect/getmdl-select.min.js');
				script('./templates/main/user-theme/javascript/facebook.js');
                script('./templates/main/user-theme/javascript/newprofile.js');
				script('./templates/main/javascript/zipcode.js');
				script('plugins/stepper/stepper.js');
	
			 				
	     })();
 </script>


<section class="mdl-stepper mdl-cell mdl-cell--12-col">

    <div class="mdl-grid">
      <div class="mdl-cell mdl-cell--12-col">
       <!-- markup -->
		<ul class="mdl-stepper mdl-stepper--linear mdl-stepper--horizontal" id="ipet-stepper">
		  <li class="mdl-step mdl-step--editable">
			<span class="mdl-step__label">
			<span class="mdl-step__title">
				<span class="mdl-step__title-text">Your Information</span>
				<span class="mdl-step__title-message">Edit this step later</span>
			</span>
				<span class="mdl-step__label-indicator"><span class="mdl-step__label-indicator-content">1</span>
			</span>
			</span>
			<div class="mdl-step__content">
			</div>
			<div class="mdl-step__actions">
			  <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored mdl-button--raised" data-stepper-next>
					Continue
				  </button>
			  <button class="mdl-button mdl-js-button mdl-js-ripple-effect" data-stepper-cancel>
					Cancel
				  </button>
			</div>
		  </li>
		  <li class="mdl-step">
			<span class="mdl-step__label">
			<span class="mdl-step__title">
				<span class="mdl-step__title-text">Your Pets</span>
			</span>
				<span class="mdl-step__label-indicator"><span class="mdl-step__label-indicator-content">2</span>
			</span>
			</span>
			<div class="mdl-step__content"></div>
			<div class="mdl-step__actions">
			  <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored mdl-button--raised" data-stepper-next>
					Continue
				  </button>
			  <button class="mdl-button mdl-js-button mdl-js-ripple-effect" data-stepper-cancel>
					Cancel
				  </button>
			</div>
		  </li>
		  <li class="mdl-step">
			<span class="mdl-step__label">
			<span class="mdl-step__title">
				<span class="mdl-step__title-text">Emergency Contacts</span>
				<span class="mdl-step__title-message">Who should we contact if your pet goes missing?</span>
			</span>
				<span class="mdl-step__label-indicator"><span class="mdl-step__label-indicator-content">3</span>
			</span>
			</span>
			<div class="mdl-step__content"></div>
			<div class="mdl-step__actions">
			  <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored mdl-button--raised" data-stepper-next>
					Continue
				  </button>
			  <button class="mdl-button mdl-js-button mdl-js-ripple-effect" data-stepper-cancel>
					Cancel
				  </button>
			</div>
		  </li>
		</ul>

      </div>
    </div>

  </section>
<script>
 (function () {
                window.addEventListener('load', function () {
                    var selector = '.mdl-stepper#ipet-stepper';
                    // Select stepper container element      
                    var stepperElement = document.querySelector(selector);
                    var Stepper;
                    var steps;

                    if (!stepperElement) return;

                    // Get the MaterialStepper instance of element to control it.          
                    Stepper = stepperElement.MaterialStepper;

                    if (!Stepper) {
                        console.error('MaterialStepper instance is not available for selector: ' + selector + '.');
                        return;
                    }
                    steps = stepperElement.querySelectorAll('.mdl-step');

                    for (var i = 0; i < steps.length; i++) {
                        // When user clicks on [data-stepper-next] button of step.          
                        steps[i].addEventListener('onstepnext', function (e) {
                            // {element}.MaterialStepper.next() change the s```````tate of current step to "completed" 
                            // and move one step forward.        
                            Stepper.next();              
                        });
                        // When user clicks on [data-stepper-skip] button of step.          
                        steps[i].addEventListener('onstepskip', function (e) {
                            Stepper.skip();              
                        });
                    }

                    // When all steps are completed this event is dispatched.          
                    stepperElement.addEventListener('onsteppercomplete', function (e) {
                        var toast = document.querySelector('.mdl-js-snackbar');

                        if (!toast){
                            console.log("No Toast element available")
                            return;
                        } 

                        toast.MaterialSnackbar.showSnackbar({
                            message: 'Completed Use Case',
                            timeout: 4000,
                            actionText: 'Ok'
                        });
                    });
             })
 })();
 </script>

redimongo avatar Jul 14 '17 04:07 redimongo

Same issue any news?

piermariacosina avatar Aug 01 '17 07:08 piermariacosina

The selector works fine which leads me to believe window.load is too early and the dynamically added markup is not quite on the DOM yet, therefore querySelector doesn't locate it. It shouldn't have anything to do with the stepper component as it hasn't been upgraded yet.

russell-tarpley avatar Aug 01 '17 13:08 russell-tarpley

Getting same issue .in my case there is no dynamically added markup.

<!DOCTYPE html>
<html lang="en">
<head>
        <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
        <link rel="stylesheet" href="https://code.getmdl.io/1.1.3/material.indigo-pink.min.css">
        <script defer src="https://code.getmdl.io/1.1.3/material.min.js"></script>
        <!-- Stepper CSS minified -->
        <link rel="stylesheet" href="./stepper.min.css">
        <!-- Stepper Javascript minified -->
        <script defer src="./stepper.min.js"></script>

</head>
<!-- style -->
<style>
        .mdl-stepper > .mdl-step > .mdl-step__content {
          background-color: rgba(0,0,0,0.2);
        }
        </style>
     <body>
        <!-- markup -->
        <ul class="mdl-stepper mdl-stepper--linear" id="demo-stepper-linear">
          <li class="mdl-step">
            <span class="mdl-step__label">
              <span class="mdl-step__title">
                <span class="mdl-step__title-text">Title of step 1</span>
                <span class="mdl-step__title-message">Summarize if needed</span>
              </span>
            </span>
            <div class="mdl-step__content"></div>
            <div class="mdl-step__actions">
              <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored mdl-button--raised" data-stepper-next>
                Continue
              </button>
              <button class="mdl-button mdl-js-button mdl-js-ripple-effect" data-stepper-cancel>
                Cancel
              </button>
            </div>
          </li>
          <li class="mdl-step">
            <span class="mdl-step__label">
              <span class="mdl-step__title">
                <span class="mdl-step__title-text">Title of step 2</span>
              </span>
            </span>
            <div class="mdl-step__content"></div>
            <div class="mdl-step__actions">
              <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored mdl-button--raised" data-stepper-next>
                Continue
              </button>
              <button class="mdl-button mdl-js-button mdl-js-ripple-effect" data-stepper-cancel>
                Cancel
              </button>
            </div>
          </li>
          <li class="mdl-step">
            <span class="mdl-step__label">
              <span class="mdl-step__title">
                <span class="mdl-step__title-text">Title of step 3</span>
              </span>
            </span>
            <div class="mdl-step__content"></div>
            <div class="mdl-step__actions">
              <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--colored mdl-button--raised" data-stepper-next>
                Continue
              </button>
              <button class="mdl-button mdl-js-button mdl-js-ripple-effect" data-stepper-cancel>
                Cancel
              </button>
            </div>
          </li>
        </ul>
    </body>       
        <!-- scrip -->



        <script>
                let element = document.querySelector('.mdl-stepper#demo-stepper-linear');

            var demoLinear = function (e) {
              // Select stepper container element      
            
              if (!element) return false;
              // Get the MaterialStepper instance of element to control it          
              let stepper = element.MaterialStepper;
              
              console.log("element"+element);
              console.log("element.MaterialStepper==> "+element.MaterialStepper);  //UNDEFINED AS OUTPUT
              console.log("stepper===>"+stepper); //UNDEFINED AS OUTPUT

              let steps = element.querySelectorAll('.mdl-step');
              // Just looping and adding listener to event onstepnext to the all steps          
              steps.forEach(function (step, index, steps) {
                // When user clicks on [data-stepper-next] button of step          
                step.addEventListener('onstepnext', function (e) {
                  // {element}.MaterialStepper.next() change the state of current step to "completed" 
                  // and move one step forward        
                      
                });
              });
              // When all steps is completed this event is dispatched          
              element.addEventListener('onsteppercomplete', function (e) {
                let toast = document.querySelector('#snackbar-stepper-complete');
                if (!toast) return false;
                toast.MaterialSnackbar.showSnackbar({ message: 'Stepper linear is completed', timeout: 4000, actionText: 'Ok' });
              });
            };
         window.addEventListener('load', demoLinear);
             
          </script>
              </html>

Pls Help on this.

bhupathyap avatar Oct 23 '17 06:10 bhupathyap

I added this bit of code after getting the same error. Add it after opening the script tag before the main function

`// Gets your stepper element added after initial page load. var stepperElement = document.querySelector('.mdl-stepper');

// Upgrades all registered components found in the current DOM.
// This is automatically called on window load.
componentHandler.upgradeAllRegistered();`

dominicbure avatar Nov 23 '17 08:11 dominicbure

Hi, try: init code... ` (function (componentHandler) { ..... var stepperElement = document.getElementById(selector); componentHandler.upgradeElement(stepperElement); ......

})(componentHandler); ` the componentHandler is out context on function

cabraljunior avatar Oct 18 '18 22:10 cabraljunior