I'm trying to understand how to handle some events with javascript, in particular if a specific event is triggered the current function calls another function. At onLoad the javascript creates the first select the data from the first object. Then if I select the voice with value "Iphone" is called another function for create the second menu with some prices. My main problem is that my solution seems quite ugly, and also when i click more than one time on the button it creates every times the same second select.
//global objects
var product = [
{name: "Samsung"},
{name: "Iphone"},
{name: "Alcatel"},
{name: "Sony"}
]
var productPrice = [
{name: "Samsung", price: 190},
{name: "Iphone", price: 290},
{name: "Alcatel", price: 65},
{name: "Sony", price: 330}
]
var main = function() {
var sel = $('<select>').appendTo('#select-1');
$(product).each(function() {
sel.append($("<option>").attr('value', this.name).text(this.name));
});
$('.press').click(function() {
if ($("#select-1 option:selected").text() == "Iphone") {
handleEvent();
}
if ($("#select-1 option:selected").text() != "Iphone") {
$("#risposta").remove();
}
});
}
function handleEvent() {
var sel = $('<select>').appendTo('#select-2');
$(productPrice).each(function() {
sel.append($("<option>").attr('value', this.name).text(this.price));
});
}
$(document).ready(function() {
main();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="select-1">
</div>
<div id="select-2">
</div>
<button class="press">Click</button>
fiddle
Any suggestions?
You question is not 100% clear to me however I gather you want to generate a select
tag on dom
ready event which you have already. When you select the option iPhone
and hit the Click
button you want to generate another select
tag with the new options from your variable.
Is what I have provided below. Its basically your code but with an extra if statement
jsFiddle link : https://jsfiddle.net/qu9zs2h1/2/
Javascript
//global objects
var product = [{
name: "Samsung"
}, {
name: "Iphone"
}, {
name: "Alcatel"
}, {
name: "Sony"
}]
var productPrice = [{
name: "Samsung",
price: 190
}, {
name: "Iphone",
price: 290
}, {
name: "Alcatel",
price: 65
}, {
name: "Sony",
price: 330
}]
var main = function() {
var sel = $('<select>').appendTo('#select-1');
$(product).each(function() {
sel.append($("<option>").attr('value', this.name).text(this.name));
});
$('.press').click(function() {
if ($("#select-1 option:selected").text() == "Iphone") {
handleEvent();
}
if ($("#select-1 option:selected").text() != "Iphone") {
$("#risposta").remove();
}
});
}
function handleEvent() {
// We still run the handleEvent function however, if check to see
// if the second select option has been generated by checking a
// class
if (!$('.prices').length) {
var sel = $('<select class="prices">').appendTo('#select-2');
$(productPrice).each(function() {
sel.append($("<option>").attr('value', this.name).text(this.price));
});
}
}
$(document).ready(function() {
main();
});
Html
<div id="select-1">
</div>
<div id="select-2">
</div>
<button class="press">Click</button>
I had to add the class prices
to your second select
but that is just a class you can rename which is used to see if that element already exists.
Is you generate everything on dom
ready and hide what you want at the start and then simply show
elements when you want, like so
jsFiddle : https://jsfiddle.net/qu9zs2h1/5/
Javascript
//global objects
var product = [{
name: "Samsung"
}, {
name: "Iphone"
}, {
name: "Alcatel"
}, {
name: "Sony"
}]
var productPrice = [{
name: "Samsung",
price: 190
}, {
name: "Iphone",
price: 290
}, {
name: "Alcatel",
price: 65
}, {
name: "Sony",
price: 330
}]
// On document ready run this script
$(function() {
$('.jshidden').removeClass('jshidden').hide();
var $select1 = $('#select-1');
var $select2 = $('#select-2');
var $sel1 = $('<select>').appendTo($select1);
var $sel2 = $('<select>').appendTo($select2);
$(product).each(function() {
$sel1.append($("<option>").attr('value', this.name).text(this.name));
});
$(productPrice).each(function() {
$sel2.append($("<option>").attr('value', this.price).text(this.price));
});
$('.press').click(function() {
if ($select1.find(":selected").text() == "Iphone") {
$select2.show();
}
if ($select1.find(":selected").text() != "Iphone") {
$select2.hide();
}
});
});
Html
<div id="select-1">
</div>
<div id="select-2" class="jshidden">
</div>
<button class="press">Click</button>
P.S. just a little something, anything which is referring to a variable which is a jQuery
element should start with a $
it just helps read the code.
Just a quick update, you can also reduce the .press
code with this code
$('.press').click(function() {
var iPhoneCheck = $select1.find(":selected").text() == "Iphone";
$select2.toggle(iPhoneCheck);
});
jQuery.toggle
takes in a bool value to either display the target or hide the target
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With