I am generating circular counters for polls where I draw counter for each answer.
I am using this "plugin": /
Problem:
It is not getting text value from <div>
and not drawing Counter for each div.
Note: For one div is working good
Example:
/
HTML:
<div class="pollAnswerBar">15</div>
<div class="pollAnswerBar">50</div>
<div class="pollAnswerBar">75</div>
JS:
jQuery(document).ready(function() {
function drawCounter(percent) {
jQuery('div.pollAnswerBar').html('<div class="percent"></div><div id="slice"' + (percent > 50 ? ' class="gt50"' : '') + '><div class="pie"></div>' + (percent > 50 ? '<div class="pie fill"></div>' : '') + '</div>');
var deg = 360 / 100 * percent;
jQuery('#slice .pie').css({
'-moz-transform': 'rotate(' + deg + 'deg)',
'-webkit-transform': 'rotate(' + deg + 'deg)',
'-o-transform': 'rotate(' + deg + 'deg)',
'transform': 'rotate(' + deg + 'deg)'
});
jQuery('.percent').html(Math.round(percent) + '%');
}
jQuery('.pollAnswerBar').each(function() {
var percent = jQuery(this).text();
console.log(percent);
drawCounter(percent);
});
});
I am generating circular counters for polls where I draw counter for each answer.
I am using this "plugin": http://blakek.us/labs/jquery/css3-pie-graph-timer/
Problem:
It is not getting text value from <div>
and not drawing Counter for each div.
Note: For one div is working good
Example:
http://jsbin./AHUkoBA/3/edit
http://jsfiddle/mgcq9/
HTML:
<div class="pollAnswerBar">15</div>
<div class="pollAnswerBar">50</div>
<div class="pollAnswerBar">75</div>
JS:
jQuery(document).ready(function() {
function drawCounter(percent) {
jQuery('div.pollAnswerBar').html('<div class="percent"></div><div id="slice"' + (percent > 50 ? ' class="gt50"' : '') + '><div class="pie"></div>' + (percent > 50 ? '<div class="pie fill"></div>' : '') + '</div>');
var deg = 360 / 100 * percent;
jQuery('#slice .pie').css({
'-moz-transform': 'rotate(' + deg + 'deg)',
'-webkit-transform': 'rotate(' + deg + 'deg)',
'-o-transform': 'rotate(' + deg + 'deg)',
'transform': 'rotate(' + deg + 'deg)'
});
jQuery('.percent').html(Math.round(percent) + '%');
}
jQuery('.pollAnswerBar').each(function() {
var percent = jQuery(this).text();
console.log(percent);
drawCounter(percent);
});
});
Share
Improve this question
asked Oct 28, 2013 at 9:10
Ing. Michal HudakIng. Michal Hudak
5,63212 gold badges62 silver badges95 bronze badges
0
3 Answers
Reset to default 4Here is working fiddle: http://jsfiddle/fKPb6/
You were modifying all elements rather than specifying each one individually.
Here is working code.
JS:
jQuery(document).ready(function () {
function drawCounter(percent, element) {
jQuery(element).html('<div class="percent"></div><div id="slice"' + (percent > 50 ? ' class="gt50"' : '') + '><div class="pie"></div>' + (percent > 50 ? '<div class="pie fill"></div>' : '') + '</div>');
var deg = 360 * (percent / 100);
jQuery('#slice .pie', element).css({
'-moz-transform': 'rotate(' + deg + 'deg)',
'-webkit-transform': 'rotate(' + deg + 'deg)',
'-o-transform': 'rotate(' + deg + 'deg)',
'transform': 'rotate(' + deg + 'deg)'
});
jQuery('.percent', element).html(Math.round(percent) + '%');
}
jQuery('.pollAnswerBar').each(function (index, element) {
var percent = jQuery(element).text();
console.log(percent);
drawCounter(percent, element);
});
});
By limiting the selection to the scope of the individual element e.g. jQuery('.percent', element)
you are targeting the correct element rather than all .percent
elements.
You can pass the event handler like this:
// Pass the event handler here
jQuery('.pollAnswerBar').each(drawCounter);
and call the function like:
// Declare the event handler with params passed from .each()
function drawCounter(i, elm) {
var percent = $(elm).text();
jQuery(elm).html('<div class="percent"></div><div id="slice"' + (percent > 50 ? ' class="gt50"' : '') + '><div class="pie"></div>' + (percent > 50 ? '<div class="pie fill"></div>' : '') + '</div>');
var deg = 360 * (percent / 100);
jQuery('#slice .pie', elm).css({
'-moz-transform': 'rotate(' + deg + 'deg)',
'-webkit-transform': 'rotate(' + deg + 'deg)',
'-o-transform': 'rotate(' + deg + 'deg)',
'transform': 'rotate(' + deg + 'deg)'
});
jQuery('.percent', elm).html(Math.round(percent) + '%');
}
Demo: Fiddle
Or only using the this
keyword without any parameters being passed like:
// Pass the event handler here
jQuery('.pollAnswerBar').each(drawCounter);
// Declare the event handler using `this`
function drawCounter() {
var percent = $(this).text();
jQuery(this).html('<div class="percent"></div><div id="slice"' + (percent > 50 ? ' class="gt50"' : '') + '><div class="pie"></div>' + (percent > 50 ? '<div class="pie fill"></div>' : '') + '</div>');
var deg = 360 * (percent / 100);
jQuery('#slice .pie', this).css({
'-moz-transform': 'rotate(' + deg + 'deg)',
'-webkit-transform': 'rotate(' + deg + 'deg)',
'-o-transform': 'rotate(' + deg + 'deg)',
'transform': 'rotate(' + deg + 'deg)'
});
jQuery('.percent', this).html(Math.round(percent) + '%');
}
Demo: Fiddle
You don't need to specify each() function here Try this:
function myfun(){
var percent = jQuery(this).text();
console.log(percent);
drawCounter(percent);
});
jQuery('.pollAnswerBar').myfun();