I'm now able to change the options dynamically using jQuery. The code below will change the breed options depending on the species selected:
<div class="pet-group">
<div class="form-group">
<select class="species">
<option value="1">Dog</option>
<option value="2">Cat</option>
</select>
</div>
<div class="form-group">
<select class="breed">
</select>
</div>
</div>
<script>
$(document).on("change", ".species", function(){
var elem = $(this),
speciesid = elem.val();
$.get("http://localhost/Vet/get_breeds/"+speciesid, function( result ) {
elem.closest('.form-group').find('.breed').html(result.breed_opts);
}, "json" );
});
</script>
But when a specific pet has been selected, I want the fields to be filled-in with data of the existing pet.
<div class="pet-group">
<div class="form-group">
<select class="pet">
<option value="1">Akamaru</option> <!-- e.g., Akamaru is a dog with Pug as the breed type -->
<option value="2">Nina</option> <!-- e.g., Nina is a dog with Great Pyrenees as the breed type -->
</select>
</div>
<div class="form-group">
<select class="species">
<option value="1">Dog</option>
<option value="2">Cat</option>
</select>
</div>
<div class="form-group">
<select class="breed">
</select>
</div>
</div>
<script>
$(".pet").change(function(){
var elem = $(this),
petid = elem.val();
$.get("http://localhost/Vet/get_pet_details/"+petid, function( result ) {
elem.closest('.pet-group').find('.species').val(result.species_id).trigger('change');
elem.closest('.pet-group').find('.breed').val(result.breed_id).trigger('change');
});
});
</script>
It does change the species field properly and dynamically loads the breed options but it doesn't select the right breed.
What should I so that the right breed will be selected?
When a specific pet has been selected, $.get("http://localhost/Vet/get_pet_details/"...) callback performs in this order:
Step 1: setting value of select.species:
elem.closest('.pet-group').find('.species').val(result.species_id)
Step 2: setting value of select.breed:
elem.closest('.pet-group').find('.breed').val(result.breed_id)
Step 3: call asynchronously event handler of select.species because of
elem.closest('.pet-group').find('.species').trigger("change");
Ajax gets new result.breed_opts, and fills the select.breed. Old value set in step 2 is erased.
So we can do this approach in your first script body:
<script>
$(document).on("change", ".species", function(){
var elem = $(this),
speciesid = elem.val();
$.get("http://localhost/Vet/get_breeds/"+speciesid, function( result ) {
var objbreed = elem.closest('.pet-group').find('.breed');
var oldbreedid = objbreed.val();
objbreed.html(result.breed_opts);
if(oldbreedid) {
objbreed.val(oldbreedid);
}
}, "json" );
});
</script>
After renewing html of select.breed, we restore the previously selected value, ie, that of step 2.
Related
I am trying to POST the value selected in a dropdown list using AJAX call. But the POST variable remains blank when the value is selected from the dropdown.
I have used the ECHO method to check whether it is returning the POST value. But it is empty.
Here is the code for reference:
Javascript (Jquery and Ajax):
<script>
$(document).ready(function(){
$("#booking_date").change(function(){ //listen when the option change
var optionValue = $("#booking_date").val(); //get the new value
$.ajax({
url: "doctordetails.php", //php file which recive the new value and save it to the database
data: { optionValue: optionValue }, //send the new value
type: "POST" , //use POST method
success: function(data) {
console.log(optionValue);
}
});
});
});
</script>
HTML:
<div class="row">
<div class="col-6">
<div class="form-group">
<input class="form-control" type="text" id="booking_date" name="booking_date" data-lang="en" data-min-year="2017" data-max-year="2020" data-disabled-days="10/17/2017,11/18/2017">
</div>
</div>
<div class="col-6">
<div class="form-group">
<select class="form-control">
<option value="">Select slot</option>>
<?php
require_once("dblogin.php");
?>
<option value="<?php echo $_POST[" optionValue "]; ?>">
<?php echo $_POST["optionValue"]; ?>
</option>
</select>
</div>
</div>
</div>
Expected result:
$_POST should return the selected value from booking_date and the $_POST value will be used in a SQL Query.
If this is dropdown list, then id must be on select box. You set id booking_date on textbox other than select box. write as:
<select id="booking_date" class="form-control">
</select>
If you want to value from select(dropdown) so you have to set id on <select> rather than textbox <input>
<select id="booking_date" class="form-control">
<option value="">Select slot</option>>
<?php require_once("dblogin.php"); ?>
<option value="<?php echo $_POST["optionValue"]; ?>">
<?php echo $_POST["optionValue"]; ?>
</option>
</select>
On Script:
<script>
$(document).ready(function(){
$("#booking_date").change(function(){ //listen when the option change
var optionValue = $(this).val(); //get the new value
$.ajax({
url: "doctordetails.php", //php file which recive the new value and save it to the database
data: { getValue: optionValue }, //send the new value
type: "POST" , //use POST method
success: function(data) {
console.log(data);
}
});
});
});
</script>
Bellow shown code does these things
when i select Scholership Programs from select list the div element with class="mystaff_hide mystaff_opt1" will be shown
and then i select Family Income now div with class="mystaff_hide mystaff_opt2" will be shown. Now both are there on my window.
Up to this the code works fine
What i want is after submission of my form i want both of them are must be there on my window
<div class="row">
<div class="col-md-6 col-sm-6 pull-left">
<div class="form-group">
<legend>Options to Search</legend>
<select class="form-control firstdropdown" name="sel_options" id="mystuff">
<option>Select Options</option>
<option value="opt1">Scholership Programs</option>
<option value="opt2">Family Income</option>
</select>
</div>
</div>
</div>
<div class="col-md-6 col-sm-6 mystaff_hide mystaff_opt1">
<div class="form-group">
<label for="LS_name">Scholarship</label>
<select class="form-control" name="LS_name[]" id="LS_name" multiple="multiple">
<option value="opt1">Scholership1</option>
<option value="opt2">Scholership2</option>
</select>
</div>
</div>
<div class="col-md-6 col-sm-6 mystaff_hide mystaff_opt2">
<div class="form-group">
<label for="Family Income">Family Income</label>
<select multiple class="form-control" name="FamilyIncome[]" id="FamilyIncome">
<option value="opt1">Family Income1</option>
<option value="opt2">Family Income2</option>
</select>
</div>
</div>
This is my script
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/multi-select/0.9.12/js/jquery.multi-select.min.js"></script>
<script>
$( document ).ready(function() {
$('.mystaff_hide').addClass('collapse');
$('#mystuff').change(function(){
var selector = '.mystaff_' + $(this).val();
$(selector).collapse('show');
});
});
</script>
After lot of search i got this code which is shows only recent related selected option's div
<?php if(isset($_POST['sel_options']) &&
!empty(isset($_POST['sel_options']))){
?>
<script>
var selected_option = "<?php echo $_POST['sel_options']; ?>";
var selector = '.mystaff_' + selected_option;
//show only element connected to selected option
$(selector).collapse('show');
</script>
<?php } ?>
Take a look at localStorage or sessionstorage to store information about the state of webpage and read them after reload to restore the UI state
Example:
Localstorage
// Store
localStorage.setItem("lastname", "Smith");
// Retrieve
document.getElementById("result").innerHTML = localStorage.getItem("lastname");
Sessionstorage
if (sessionStorage.clickcount) {
sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1;
} else {
sessionStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "You have clicked the button " +
sessionStorage.clickcount + " time(s) in this session.";
Or you may want to use AJAX
AJAX is the art of exchanging data with a server, and updating parts of a web page - without reloading the whole page.
As you are using jquery, you may want to look at using Ajax in jquery.
// this is the id of the form
$("#idForm").submit(function(e) {
var url = "path/to/your/script.php"; // the script where you handle the form input.
$.ajax({
type: "POST",
url: url,
data: $("#idForm").serialize(), // serializes the form's elements.
success: function(data)
{
alert(data); // show response from the php script.
}
});
e.preventDefault(); // avoid to execute the actual submit of the form.
});
hello i want to display data of business3's data according to business2's and business2's data according to business1's dropdown list but on change() of business1 i got data in response but I didn't get second on change() in dropdown list.
<!-- ajax code for first business starts here -->
<script>
$(document).on('change', 'select.Business1', function(){
var business1 = $('select.Business1 option:selected').val();
alert(business1);
var value = $(this).val();
$.ajax({
type:"POST",
data: { business1:business1 },
url: '<?php echo site_url('client_area/select_business_sub_cat'); ?>',
success : function (data){
$('#business2').empty();
$('#business2').append(data);
}
});
});
</script>
<!-- ajax code for first business ends here -->
// This script is not working. i can't find second change event.
<!-- ajax code for second business starts here -->
<script>
$(document).on('change','#business2',function(){
alert('Change Happened');
});
</script>
<!-- ajax code for second business ends here -->
I have tried with live() method also so alert called on first dropdown selection and then the ajax request calls so second drop down fills (Alternate for second script) ,
<script>
$(document).live('change', '#business2', function() {
alert('Change Happened');
});
</script>
Model function
public function select_business_sub_cat()
{
$business1 = $this->input->post('business1');
$result_sub_cat1 = $this->db->query("select category.id,subcategory.* From category LEFT JOIN subcategory ON category.id = subcategory.category_id where category.id = '$business1'");
$row_cat1 = $result_sub_cat1->result();
$data = array(
'id' => $row_cat1['0']->id,
'name' => $row_cat1['0']->name
);
echo "<option value='" . $row_cat1['0']->id . "'>" . $row_cat1['0']->name . "</option>";
// return $this->output->set_output($data);
}
View --
<div class="form-group">
<label>Business 1</label>
<select name="txtBusiness1" id="" style="height: 30px;width: 100%;" class="Business1">
<option value=""> Select Business </option>
<?php
$result_cat1 = $this->db->query("select * from category");
$row_cat1 = $result_cat1->result();
?>
<?php foreach($row_cat1 as $item){ ?>
<option value="<?php echo $item->id; ?>"><?php echo $item->name; ?></option>
<?php } ?>
</select>
</div>
<div class="form-group">
<label>Business 2</label>
<select name="txtBusiness2" id="business2" style="height: 30px;width: 100%;" class="Business2">
<option value=""> Select Business2 </option>
</select>
</div>
<div class="form-group">
<label>Business 3</label>
<select name="txtBusiness4" id="business3" style="height: 30px;width: 100%;" class="Business3">
<option value=""> Select Business3 </option>
<?php echo $abc; ?>
</select>
</div>
Maybe that's because by calling $('#business2').html(data); you remove the event handlers, from jQuery documentation: http://api.jquery.com/html
When .html() is used to set an element's content, any content that was
in that element is completely replaced by the new content.
Additionally, jQuery removes other constructs such as data and event
handlers from child elements before replacing those elements with the
new content.
One option would be to use empty and append like this
$('#business2').empty();
$('#business2').append(data);
instead of $('#business2').html(data);
The Script which is not working for you !!!
<script>
$(document.body).on('change','#business2',function(){
alert('Change Happened');
});
</script>
Try this in place of the above script :
$(document).on("change", "#business2", function(){
alert('Change Happened');
});
I am new in SE 4.20. I am having a problem of creating a form element onchange of this form element.
For explanation,
I have a form. I am able to return some select option value on change of this form element. But now I want to add a form element on change of this element.
You want to add a form element, like a text box, if the user changes the select box? Maybe something like:
$("#selectBoxId").change(function (){
$("#formId").append("<input type='text' name='additionalFormElement' />");
});
Here is the html:
<div class="form-elements">
<div id="typeName-wrapper" class="form-wrapper">
<div id="typeName-label" class="form-label">
<label for="typeName" class="required">Type</label>
</div>
<div id="typeName-element" class="form-element">
<select name="typeName" id="typeName">
<option value="Grant">Grant</option>
<option value="Cooperative Agreements">Cooperative Agreements</option>
<option value="Publication">Publication</option>
</select>
</div>
</div>
<div id="resourceName-wrapper" class="form-wrapper">
<div id="resourceName-label" class="form-label">
<label for="resourceName" class="required">Name</label>
</div>
<div id="resourceName-element" class="form-element">
<select name="resourceName" id="resourceName">
<option value="ABC">ABC</option>
<option value="XYZ">XYZ</option>
</select>
</div>
</div>
Here are the mootool js:
$('typeName').addEvent('change', function(event) {
var typeName = $('typeName').value;
var base_path = "<?php echo $this->baseUrl();?>/";
var url = 'http://xxxxxxx.com/test/resource/getresourcebytype';
var request= new Request.JSON({
url: url,
method: 'GET',
data: {"typeName":typeName},
onSuccess: function( response )
{
console.log(response);
//clear the select box
var name = $('resourceName');
while (name.firstChild) {
name.removeChild(name.firstChild);
}
//now add new option
for (var i = 0; i < response.length; i++){
console.log(response[i]);
new Element('option', {'value': response[i].value, 'text':response[i].label}).inject(name);
}
}, onFailure: function(){
console.log('failed');
}
});
request.send();
});
How do I automatically populate the second dropdown based on the selection made in the first one. Say if I choose a contry in the first dropdown, then I want to display a list of cities from that country in the second dropdown. Is there a way to do this with jQuery?
You have to use AJAX
$("#select1").change(function() {
var optionId = $(this).val();
$.post('ajax/getData.php',
{id: optionId},
function(data) {
$("#div2").html(data);
},
"json"
);
});
Here is example HTML:
<div id="div1">
<select id="select1">
<option value="1">aaaaa</option>
....
</select>
</div>
<div id="div2">
</div>