I Have To Click Twice To Get Jquery Click Function To Fire
Here is the Fiddle. I have a problem; it seems almost random. Whenever I click a div to trigger an animation, I have to click twice to get the animation to fire. A little side note
Solution 1:
Your code requires you to click twice because on the first click your clicks
data hasn't been set yet so your else
clause of your if statement happens first
//"clicks" will be undefined the first time throughvar clicks = $(this).data('clicks');
if (clicks) {
$("#two").animate({marginLeft: $(window).width()-900 +'px'}, 745, 'linear');
} else {
//so this part gets executed first
$("#two").animate({marginLeft: 0 +'px'}, 700, 'linear');
}
You can either set a data-* attribute or use .data() to set it
$("#three").data('clicks',true);
$("#two").data('clicks',true);
$("#one").data('clicks',true);
Or
<three id="three" data-clicks="1">
Solution 2:
The problem is when the element is first clicked the value of data-clicks
attribute is undefined
. You can set this value in HTML by adding data-clicks="true"
or you can also set the value in Javascript as
$('#one, #two, #three').data('clicks', true);
I've also optimised your code to make it dry.
$(document).ready(function() {
// To animate the other elements than the clicked onefunctionanimateOthers(clickedElement, otherElement) {
otherElement.animate({
marginLeft: 0 + 'px'
}, 100, 'linear');
clickedElement.animate({
marginLeft: $(window).width() - 900 + 'px'
}, 745, 'linear');
}
// To animate the element that is clickedfunctionanimate(clicks, first, otherElements) {
var leftMargin = ($(window).width() - 900) + 'px';
var left = '0px',
duration = 800;
if (clicks) {
// Update the marginLeft and duration to animate
left = leftMargin;
duration = 745;
}
// Animate the clicked element
first.animate({
marginLeft: left
}, duration, 'linear');
// For other elements
otherElements.forEach(function(v) {
if ($('#' + v).css('marginLeft') == leftMargin) {
animateOthers(first, $('#' + v));
}
});
// Update the data-clicks value by negating it
first.data("clicks", !clicks);
}
// Array of all the elementsvar elements = ['one', 'two', 'three'];
// Bind click event on the elements on the array
$('#' + elements.join(',#')).on('click', function() {
var clicks = $(this).data('clicks');
var clickedElement = $(this).attr('id'),
otherElements = elements.slice();
otherElements.splice(elements.indexOf(clickedElement), 1);
// otherElements is the array of the elements other than the clickedanimate(clicks, $(this), otherElements);
});
});
footer {
margin: 0;
padding: 0;
float: left;
width: 100%;
height: 115px;
background-color: #4a4a4a;
overflow: visible !important;
-webkit-user-select: none;
/* Chrome/Safari */
-moz-user-select: none;
/* Firefox */
-ms-user-select: none;
/* IE10+ *//* Rules below not implemented in browsers yet */
-o-user-select: none;
user-select: none;
}
one {
margin: 0;
padding: 0;
float: left;
width: 200px;
background-color: pink;
height: 115px;
margin-left: 0px;
display: block;
}
one,
two,
three {
text-align: center;
color: white;
font-family: "Raleway", Arial, Helvetica, Trebuchet MS, Tahoma, sans-serif;
font-weight: bold;
font-size: 16px;
line-height: 115px;
}
one:hover {
background: black;
margin: 0;
padding: 0;
height: 115px;
float: left;
transition: all 0.3s ease-out;
cursor: pointer;
}
two:hover {
background: black;
margin: 0;
padding: 0;
height: 115px;
float: left;
transition: all 0.3s ease-out;
cursor: pointer;
}
three:hover {
background: black;
margin: 0;
padding: 0;
height: 115px;
float: left;
transition: all 0.3s ease-out;
cursor: pointer;
}
two {
margin: 0;
padding: 0;
float: left;
width: 200px;
background-color: gray;
height: 115px;
margin-left: 0px;
display: block;
}
three {
margin: 0;
padding: 0;
float: left;
width: 200px;
background-color: black;
height: 115px;
margin-left: 0px;
display: block;
}
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script><footer><oneid="one"data-clicks="true"><punselectable="on"></p></one><twoid="two"data-clicks="true"><punselectable="on"></p></two><three-info></three-info><threeid="three"data-clicks="true"><punselectable="on"></p></three></footer>
Post a Comment for "I Have To Click Twice To Get Jquery Click Function To Fire"