'Bootstrap Tour "Tour is not defined"

I am new to Bootstrap Tour, and I was working on a simple site to learn how to use Bootstrap Tour. However, there is one error that is causing some confusion. Every time I try to run this code, the console gives me the error "Uncaught Reference Error: Tour is not defined." Can anyone help me explain the problem?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Bootstrap Tour Test</title>

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">

    <!-- Bootstrap Tour CSS -->
    <link href="../TestFolder/bootstrap-tour/build/css/bootstrap-tour.min.css" rel="stylesheet">

    <script>
            var tour = new Tour({
              steps: [
                {
                  element: "#content",
                  title: "Title of my step",
                  content: "Content of my step",
                },
                {
                  element: "#content1",
                  title: "Title of my step",
                  content: "Content of my step",
                }
              ]
            });
    </script>

</head>

<body>

    <div id="content">
      Hello, World!
    </div>
    <br>
    <br>
    <br>
    <div id="content1">
      Another Hello, World!
    </div>

    <!-- <script>
        var tour = new Tour();

        // Add your steps. Not too many, you don't really want to get your users sleepy
        tour.addSteps([{
          element: "#content", // string (jQuery selector) - html element next to which the step popover should be shown
          title: "Title of my step", // string - title of the popover
          content: "Content of my step" // string - content of the popover
        }, {
          element: "#content1",
          title: "Title of my step",
          content: "Content of my step"
        }]);

        // Initialize the tour
        tour.init();

        // Start the tour
        tour.start();
    </script> -->

    <!-- jQuery -->
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>

    <!-- Poopper.js -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>

    <!-- Bootstrap Javascript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>

    <!-- Boostrap Tour Javascript -->
    <script src="../TestFolder/bootstrap-tour/build/js/bootstrap-tour.min.js"></script>

</body>
</html>


Solution 1:[1]

Move your script after your Bootstrap Tour file is loaded.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
    	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    	<meta name="viewport" content="width=device-width, initial-scale=1">
    	<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    	<title>Bootstrap Tour Test</title>

    	<!-- Bootstrap CSS -->
    	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">

    	<!-- Bootstrap Tour CSS -->
    	<link href="../TestFolder/bootstrap-tour/build/css/bootstrap-tour.min.css" rel="stylesheet">

    </head>
   	
   	<body>

   		<div id="content">
		  Hello, World!
		</div>
		<br>
		<br>
		<br>
		<div id="content1">
		  Another Hello, World!
		</div>

		<!-- <script>
			var tour = new Tour();

			// Add your steps. Not too many, you don't really want to get your users sleepy
			tour.addSteps([{
			  element: "#content", // string (jQuery selector) - html element next to which the step popover should be shown
			  title: "Title of my step", // string - title of the popover
			  content: "Content of my step" // string - content of the popover
			}, {
			  element: "#content1",
			  title: "Title of my step",
			  content: "Content of my step"
			}]);

			// Initialize the tour
			tour.init();

			// Start the tour
			tour.start();
		</script> -->

   		<!-- jQuery -->
   		<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>

   		<!-- Poopper.js -->
		<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>

		<!-- Bootstrap Javascript -->
		<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>

		<!-- Boostrap Tour Javascript -->
		<script src="../TestFolder/bootstrap-tour/build/js/bootstrap-tour.min.js"></script>
    
        	<script>
    			var tour = new Tour({
				  steps: [
				    {
				      element: "#content",
				      title: "Title of my step",
				      content: "Content of my step",
				    },
				    {
				      element: "#content1",
				      title: "Title of my step",
				      content: "Content of my step",
				    }
				  ]
				});
		</script>

    </body>
    </html>

Solution 2:[2]

In HTML the is loaded first before the .

So since your is inside the , the function is initiated before the js of the imported file is initialized.

One fix would be move the import above the on the

Solution 3:[3]

If you are using Angular 2+ (and bootstrap 4), then you need to add the js and css to your angular.json file. After installing the library (via npm for example). Update the angular.json file.

"styles": [..
           ..
          "node_modules/bootstrap-tour/build/css/bootstrap-tour.min.css"
          ],
"scripts": [..
            ..
          "node_modules/bootstrap-tour/build/js/bootstrap-tour.min.js"
        ]
      },

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Win
Solution 2 Sanmitra Nagaraj
Solution 3 DancingDad