Sujith Nair
Sujith Nair

Reputation: 97

Jquery javascript dropdown in a loop and calculation

I got a a dropdown list populating from a php while loop. There will be more than one select dropdown boxes. When i select any dropdown from the loop, the subsequent textbox should change the value.

<html>
   <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <title></title>
      <script type='text/javascript' src='http://code.jquery.com/jquery-1.10.1.js'></script>
      <script type='text/javascript'>//<![CDATA[
         $(window).load(function(){
         $("#category").change(function () {
         var dept_number = $(this).val();
         var price = $(this).find(':selected').data('price');
         $('#dept-input').val(dept_number);
         $('#price-input').val(price);
         });
         });//]]> 


      </script>
   </head>
   <body>
      <select id="category[]">
         <option value="1" data-price="10">Item 1 second</option>
         <option value="2" data-price="20">Item 2 second</option>
         <option value="3" data-price="30">Item 3 second</option>
      </select>
      <br><br>
      <label>Dept. num:</label>
      <input type="text" id="dept-input[]"></input>
      <br><br>
      <label>Price:</label>
      <input type="text" id="price-input[]"></input>
   </body>
</html>

This script is working with out the loop. How will i change it to work with the loop.. Thank you in advance

<script type='text/javascript' src='http://code.jquery.com/jquery-1.10.1.js'></script>

<script type='text/javascript'>//<![CDATA[
$(window).load(function(){
$(document).ready(function(){
    $("select").on('change',function () {
        var dept_number = $(this).val();
        var price = $(this).find(':selected').data('price');
        $(this).siblings('.deptip').val(dept_number);
        $(this).siblings('.priceip').val(price);
        $(this).siblings('.total1').val(price * $(this).siblings('.total').data('value'));
    });
});
});//]]> 

</script>
<div class="base"> <!--Keep each group in base container-->
<table border="1"><tr>
    <td><select id="category0">
       <option value="1" data-price="10">Item 1 second</option>
       <option value="2" data-price="20">Item 2 second</option>
       <option value="3" data-price="30">Item 3 second</option>
    </select></td>
    <td><label>Dept. num:</label>
    <input type="text" class="deptip" id="dept-input"/><!--give them a class--></td>
    <td><label>Price:</label>
    <input type="text" class="priceip" id="price-input"/> <!--a class here too--></td>
    <td><label>Total:</label><input data-value="50" type="text" readonly class="total"/></td>
	<td><label>Total1:</label><input data-value="50" type="text" readonly class="total1"/></td>

</tr></table>
</div>

<div class="base"> <!--Keep each group in base container-->
<table border="1"><tr>
    <td><select id="category1">
       <option value="1" data-price="10">Item 1 second</option>
       <option value="2" data-price="20">Item 2 second</option>
       <option value="3" data-price="30">Item 3 second</option>
    </select></td>
    <td><label>Dept. num:</label>
    <input type="text" class="deptip" id="dept-input"/><!--give them a class--></td>
    <td><label>Price:</label>
    <input type="text" class="priceip" id="price-input"/> <!--a class here too--></td>
    <td><label>Total:</label><input data-value="50" type="text" readonly class="total"/></td>
	<td><label>Total1:</label><input data-value="50" type="text" readonly class="total1"/></td>

</tr></table>
</div>

<div class="base"> <!--Keep each group in base container-->
<table border="1"><tr>
    <td><select id="category2">
       <option value="1" data-price="10">Item 1 second</option>
       <option value="2" data-price="20">Item 2 second</option>
       <option value="3" data-price="30">Item 3 second</option>
    </select></td>
    <td><label>Dept. num:</label>
    <input type="text" class="deptip" id="dept-input"/><!--give them a class--></td>
    <td><label>Price:</label>
    <input type="text" class="priceip" id="price-input"/> <!--a class here too--></td>
    <td><label>Total:</label><input data-value="50" type="text" readonly class="total"/></td>
	<td><label>Total1:</label><input data-value="50" type="text" readonly class="total1"/></td>

</tr></table>
</div>

Upvotes: 2

Views: 1781

Answers (2)

Guruprasad J Rao
Guruprasad J Rao

Reputation: 29683

DEMO

  • Categorize your multiple selects into some parent div container and assign class to input elements in each container

For ex:

<div class="base"> <!--Keep each group in base container-->
    <select id="category">
       <option value="1" data-price="10">Item 1 second</option>
       <option value="2" data-price="20">Item 2 second</option>
       <option value="3" data-price="30">Item 3 second</option>
    </select>
    <label>Dept. num:</label>
    <input type="text" class="deptip" id="dept-input"/><!--give them a class-->
    <label>Price:</label>
    <input type="text" class="priceip" id="price-input"/> <!--a class here too-->
</div>

<div class="base">
    <select id="category1">
       <option value="1" data-price="10">Item 1 second</option>
       <option value="2" data-price="20">Item 2 second</option>
       <option value="3" data-price="30">Item 3 second</option>
    </select>
    <label>Dept. num:</label>
    <input type="text" class="deptip" id="dept-input"/><!--same goes here-->
    <label>Price:</label>
    <input type="text" class="priceip" id="price-input"/><!--and here too-->
</div>

<div class="base">
    <select id="category2">
       <option value="1" data-price="10">Item 1 second</option>
       <option value="2" data-price="20">Item 2 second</option>
       <option value="3" data-price="30">Item 3 second</option>
    </select>
    <label>Dept. num:</label>
    <input type="text" class="deptip" id="dept-input"/>
    <label>Price:</label>
    <input type="text" class="priceip" id="price-input"/>
</div>
  • Write a common jquery on change event to select element.

For Ex:

$(document).ready(function(){ //Write it in document.ready()
    $("select").on('change',function () {
        var dept_number = $(this).val();
        var price = $(this).find(':selected').data('price');
        $(this).siblings('.deptip').val(dept_number); //find its siblings with classname 
        $(this).siblings('.priceip').val(price);
    });
});

Update

DEMO

Hoping the html will be there for each group

<label>Total:</label><input data-value="50" type="text" readonly class="total"/><br/>
<!-- Added value fetched from php to data-value attribute of input-->

So your modified JS would be as below:

$(document).ready(function(){
    $("select").on('change',function () {
        var dept_number = $(this).val();
        var price = $(this).find(':selected').data('price');
        $(this).siblings('.deptip').val(dept_number);
        $(this).siblings('.priceip').val(price);
        $(this).siblings('.total').val(price * $(this).siblings('.total').data('value'));//Add this line
    });
});

UPDATE 2

DEMO

For your current structure you could change your script as below:

$(document).ready(function(){
    $("select").on('change',function () {
        var dept_number = $(this).val();
        var price = $(this).find(':selected').data('price');
        $(this).closest('table').find('.deptip').val(dept_number);
        $(this).closest('table').find('.priceip').val(price);
        $(this).closest('table').find('.total').val(price * $(this).closest('table').find('.total').data('value'));
    });
});

Basically here we are finding the parent table of the clicked select and then finding required elements within that parent

Upvotes: 4

Tahir Ahmed
Tahir Ahmed

Reputation: 5737

I think the only problem in your code is that the resulting HTML contains [] square brackets inside of the id attribute of some elements. Removing them should fix your problem: Example.

Otherwise, if you cannot modify HTML then, escape the characters when trying to access them in JavaScript: Example.

And for multiple select elements, you can do this.

Snippet:

var categories = $('select[id^=category]');
var deptNumbers = $('input[id^=dept-input]');
var priceNumbers = $('input[id^=price-input]');
categories.each(function(index) {
    $(this).change(function() {
        var dept_number = $(this).val();
        var price = $(this).find(':selected').data('price');
        deptNumbers.eq(index).val(dept_number);
        priceNumbers.eq(index).val(price);
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<select id="category[0]">
    <option value="1" data-price="10">Item 1 second</option>
    <option value="2" data-price="20">Item 2 second</option>
    <option value="3" data-price="30">Item 3 second</option>
</select>
<select id="category[1]">
    <option value="1" data-price="10">Item 1 second</option>
    <option value="2" data-price="20">Item 2 second</option>
    <option value="3" data-price="30">Item 3 second</option>
</select>
<br>
<br>
<label>Dept. num:</label>
<input type="text" id="dept-input[0]"></input>
<br>
<br>
<label>Price:</label>
<input type="text" id="price-input[0]"></input>
<br>
<br>
<label>Dept. num:</label>
<input type="text" id="dept-input[1]"></input>
<br>
<br>
<label>Price:</label>
<input type="text" id="price-input[1]"></input>

Hope this helps.

Upvotes: 1

Related Questions