crazydev
crazydev

Reputation: 575

Get values from drop down button generated dynamically in jquery

I am a simple category form that consists of a button Choose the Item that acts like a drop down component. Initially, the content form is a static html and when the user clicks on Add Content, another content form is added / duplicated dynamically.

There is a button called Choose the Item, that when clicked, it gives a drop down list, showing the values and the user selects a value, the button name changes to that value selected.

Here in this example, the look and feel is not the same because of missing bootstrap libraries.

The issue that I am having that, the click event is not working on the second generated dynamically content. That, is I am unable to click the button Choose the Item when I add another content. Can someone please help me with this ?

var count = 1;

$('.js-add').click(function() {
	count++;
  var content = `        
   
                <div class="form-control-group">
            <h3>Content No. `+count+`</h3>

            <div class="form-control">
                <label for="volume">Item</label>

                <button type="button" id="volume-menu`+count+`" class="mdl-button js-custom-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                    Choose the item
                </button>

                <ul class="mdl-menu mdl-js-menu" for="volume-menu`+count+`">
                    <li class="mdl-menu__item" data-value="10">10</li>
                    <li class="mdl-menu__item" data-value="20">20</li>
                    <li class="mdl-menu__item" data-value="30">30</li>
                </ul>

            </div>
        </div>
        
        
        <br>`
        
       $('.main').append(content);

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>

<title>Page Title</title>
</head>
<body>

<div class="btn btn-success js-add">
Add Content
</div> 

<div class="main">


        <div class="form-control-group">
            <h3>Content No. 1</h3>

            <div class="form-control">
                <label for="volume">Item</label>

                <button type="button" id="volume-menu" class="mdl-button js-custom-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                    Choose the item
                </button>

                <ul class="mdl-menu mdl-js-menu" for="volume-menu">
                    <li class="mdl-menu__item" data-value="10">10</li>
                    <li class="mdl-menu__item" data-value="20">20</li>
                    <li class="mdl-menu__item" data-value="30">30</li>
                </ul>
            </div>
        </div>
        
        
        <br>

        
        
        </div>
        
        

</body>

Upvotes: 1

Views: 428

Answers (2)

Priyal Pithadiya
Priyal Pithadiya

Reputation: 889

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
<script>
$(document).ready(function(){
$(document.body).on('click', 'li.mdl-menu__item', function () {
    var selectedID = $(this).closest('ul');
    var countID = $(selectedID).attr("for");
    var cnt = $(selectedID).attr("for").replace("volume-menu","");
    $("#volume-menu"+ cnt).html($(this).text());
 });
var count = 1;
$('.js-add').click(function() {
    count++;
     var content = `        

                <div class="form-control-group">
            <h3>Transport No. `+count+`</h3>

            <div class="form-control">
                <label for="volume">Volume</label>

                <button type="button" id="volume-menu`+count+`" class="mdl-button js-custom-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                    Choose the volume
                </button>

                <ul class="mdl-menu mdl-js-menu" for="volume-menu`+count+`" >
                    <li class="mdl-menu__item" data-value="10">10</li>
                    <li class="mdl-menu__item" data-value="20">20</li>
                    <li class="mdl-menu__item" data-value="30">30</li>
                </ul>

            </div>
        </div>


        <br>` 
   $('.main').append(content);
   componentHandler.upgradeDom();
});
})
</script>
<title>Page Title</title>
</head>
<body>
<div class="btn btn-success js-add">Add Content</div> 
<div class="main">
    <div class="form-control-group">
        <h3>Transport No. 1</h3>
        <div class="form-control">
            <label for="volume">Volume</label>
            <button type="button" id="volume-menu" class="mdl-button js-custom-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                Choose the volume
            </button>
            <ul class="mdl-menu mdl-js-menu" for="volume-menu" >
                <li class="mdl-menu__item" data-value="10">10</li>
                <li class="mdl-menu__item" data-value="20">20</li>
                <li class="mdl-menu__item" data-value="30">30</li>
            </ul>
        </div>
    </div>
    <br>
    </div>
</body>
</html>

Upvotes: 0

Saeed
Saeed

Reputation: 5488

There is a button called Choose User that when clicked, it gives a drop down list, showing the values and the user selects a value, the button name changes to that value selected.

Add this part of code

$(document.body).on("click", "li.mdl-menu__item", function() {
  $(this).parent().prev().text($(this).text());
  $(this).parent().toggleClass('hidden');
});

the click event is not working on the second generated dynamically content. That, is I am unable to click the button Choose User when I add another category.

This type of event definition solve this problem and you used it. Your code works well and I did not face this issue.

$(document.body).on("click", "button.js-user-select", function() {
  $(this).next().toggleClass('hidden');
});

I think this helps you

$(document.body).on("click", "button.js-user-select", function() {
  $(this).next().toggleClass('hidden');
});

$(document.body).on("click", "li.mdl-menu__item", function() {
  $(this).parent().prev().text($(this).text());
  $(this).parent().toggleClass('hidden');
});

var count = 1;

$(".add-other").click(function() {
  count++;
  var content =
    `<div class="form-control-grp">
                <h3>Category ` +
    count +
    `</h3>

                <div class="form-control">
                    <label for="volume">Type of User</label>

                    <button type="button" id="user-list" class="mdl-button js-user-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                        Choose user
                    </button>

                    <ul class="mdl-menu mdl-js-user hidden" for="user-list">
                        <li class="mdl-menu__item" data-value="10">User Specialist</li>
                        <li class="mdl-menu__item" data-value="20">User Moderator</li>
                       
                    </ul>

                    <input type="hidden" id="user" name="user">
                </div>
    </div>`;

  $(".main").append(content);
});
.hidden {
  display: none
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="submit" class="add-other">Add Category </button>

<div class="main">

  <div class="form-control-grp">
    <h3>Category 1</h3>

    <div class="form-control">
      <label for="volume">Type of User</label>

      <button type="button" id="user-list" class="mdl-button js-user-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                        Choose user
                    </button>

      <ul class="mdl-menu mdl-js-user hidden" for="user-list">
        <li class="mdl-menu__item" data-value="10">User Specialist</li>
        <li class="mdl-menu__item" data-value="20">User Moderator</li>

      </ul>

      <input type="hidden" id="user" name="user">
    </div>
  </div>


Update

1- Add this for updating dom

componentHandler.upgradeDom();

2- Add this for button text

$(document).on("click", "li.mdl-menu__item", function() {
  $(this).parent().parent().prev().text($(this).text());
});

3- make id dynamic with ${count} instead of your usage.

var count = 1;

$(document).on("click", "li.mdl-menu__item", function() {
  $(this).parent().parent().prev().text($(this).text());
});

$('.js-add').click(function() {
  count++;
  var content = `        
                <div class="form-control-group">
            <h3>Content No. ${count}</h3>

            <div class="form-control">
                <label for="volume">Item</label>

                <button type="button" id="volume-menu-${count}" class="mdl-button js-custom-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                    Choose the item
                </button>

                <ul class="mdl-menu mdl-js-menu" for="volume-menu-${count}">
                    <li class="mdl-menu__item" data-value="10">10</li>
                    <li class="mdl-menu__item" data-value="20">20</li>
                    <li class="mdl-menu__item" data-value="30">30</li>
                </ul>

            </div>
        </div>
        
        
        <br>`

  $('.main').append(content);
  componentHandler.upgradeDom();

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>

<title>Page Title</title>
</head>

<body>

  <div class="btn btn-success js-add">
    Add Content
  </div>

  <div class="main">

    <div class="form-control-group">
      <h3>Content No. 1</h3>

      <div class="form-control">
        <label for="volume">Item</label>

        <button type="button" id="volume-menu-1" class="mdl-button js-custom-select mdl-js-button mdl-button--raised mdl-js-ripple-effect">
                    Choose the item
                </button>

        <ul class="mdl-menu mdl-js-menu" for="volume-menu-1">
          <li class="mdl-menu__item" data-value="10">10</li>
          <li class="mdl-menu__item" data-value="20">20</li>
          <li class="mdl-menu__item" data-value="30">30</li>
        </ul>
      </div>
    </div>

    <br>

  </div>

</body>

Upvotes: 2

Related Questions