Hkachhia
Hkachhia

Reputation: 4539

How to call onchange event when dropdown values are same

I am using Jquery chosen plugin and it's working fine. I have used this plugin in my one of the module. My dropdown values are something like that:

<select id="itemcode" onchange="get_data()">
   <option value="1">ITEM001</option>
   <option value="2">ITEM002</option>
   <option value="1">ITEM001</option>
   <option value="3">ITEM003</option>
</select>

It's working fine. But problem is that when user select first option and then try to change third option onchange event does not fire because both options values are same. Is there any way to call onchange event every time if values are same or differ ?

Options values is a unique key of item so it's repeated in dropdown. Dropdown value is duplicate we have allowed to use same item in others module

Upvotes: 0

Views: 2134

Answers (6)

charu joshi
charu joshi

Reputation: 113

i am using jquery instead of java script

<select id="itemcode">
 <option value="1">ITEM001</option>
 <option value="2">ITEM002</option>
 <option value="1">ITEM001</option>
<option value="3">ITEM003</option>
 </select>

jquery

$('#itemcode:option').on("click",function(){
alert(saaas);
})

Upvotes: 0

derp
derp

Reputation: 2308

Ideally you want to change the data coming from the backend so that you don't get duplicate data. However if this is not possible, another approach would be to sanitise the data before putting it in the select. E.g

https://jsfiddle.net/vuks2bpt/

var dataFromBackend = [
    {key:1,
  value: "ITEM0001"
  },
  {key:2,
  value: "ITEM0002"
  },
  {key:1,
  value: "ITEM0001"
  },
  {key:3,
  value: "ITEM0003"
  }
];

function removeDuplicates(array){
    var o = {};
    array.forEach(function(item){
    o[item.key] = item.value;
  });

  return o;  
}

function get_data(){
    console.log('get_data');
}

var sanitised = removeDuplicates(dataFromBackend);

var select = document.createElement('select');
select.id = "itemcode";
select.addEventListener('change', get_data);

Object.keys(sanitised).forEach(function(key){
    var option = document.createElement('option');
    option.value = key;
  option.textContent = sanitised[key];
  select.appendChild(option);
})

document.getElementById('container').appendChild(select);

Upvotes: 0

Teja
Teja

Reputation: 1254

There is no way to fire get_data() with your current data. The solution below is more of a hack. When you populate the options, prepend the value with something unique. Eg.

<select id="itemcode" onchange="get_data()">
<option value="1_1">ITEM001</option>
<option value="2_2">ITEM002</option>
<option value="3_1">ITEM001</option>
<option value="4_3">ITEM003</option>
</select>

Thus your get_data() method will be called everytime. And in your get_data() method, split the value using underscore _ and you can get the actual value there.

function get_data(){
   var actualValue=$(this).val().split("_")[1];
   //do other processing
   ...
}

You can use other characters like $, or anything you like, instead of _

Upvotes: 0

Austin Pocus
Austin Pocus

Reputation: 993

Edit: This doesn't work. Sorry!

You could add a data attribute that differs for each element, for example:

<select id="itemcode" onchange="get_data()">
  <option value="1" data-id="1">ITEM001</option>
  <option value="2" data-id="2">ITEM002</option>
  <option value="1" data-id="3">ITEM001</option>
  <option value="3" data-id="4">ITEM003</option>
</select>

If you're using Rails or another framework to generate the <option> tags, it should be easy to add an incremental id to each element.

Upvotes: 0

Krupesh Kotecha
Krupesh Kotecha

Reputation: 2412

Try this

$('#itemcode').click(function() {
  console.log($(this).val());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="itemcode">
  <option value="1">ITEM001-A</option>
  <option value="2">ITEM002</option>
  <option value="1">ITEM001-B</option>
  <option value="3">ITEM003</option>
</select>

Upvotes: 0

Vicky Kumar
Vicky Kumar

Reputation: 1408

I saw your implementation and it is working fine in code pen here is the link no need to change anything

<select id="itemcode" onchange="get_data()">
<option value="1">ITEM001</option>
<option value="2">ITEM002</option>
<option value="1">ITEM001</option>
<option value="3">ITEM003</option>
</select>

var get_data =function(){
alert("saas")
}

http://codepen.io/vkvicky-vasudev/pen/dXXVzN

Upvotes: 1

Related Questions