Document Ready + Focus - javascript

I'm trying to learn some JS / Jquery and trying to implementing some functions toghether to learn in how to do it.
My goal is to make a progress bar, that only fires up if while the tab is ative. This function should be thriggered when document ready or after X seconds.
I've already got some of the achievements but it's hard to complete it.
My actual code:
$(document).ready(function(){
$(window).focus(function(){
var progress = $(".loading-progress").progressTimer({
timeLimit: 15,
onFinish: function () {
alert("ok");
},
showHtmlSpan: false,
});
});
});
<div class="loading-progress"></div>
The main problems:
1 - If I open the page, I need to change the tab and come back to focus and start. The point it's to start right away since the tab is focused.
2 - It doesn't stop if change tab. If I change tab, why the code keeps running since I put into the focus windows code?
3 - I have no clue in how to make it wait X seconds or document ready.
Can someone help me trying to figure it out these 3 aspects? Thanks.

Related

How do I stop JavaScript timer when out of view?

Have a slider in website header that uses JavaScript and Jquery to change its tabs every 6 seconds or when the user clicks one of its tabs. I use it in my project in Webflow (a page builder) and the problem I face is that whenever slide changes, currently focused form window loses focus.
I'm no programmer even though I'm learning js now, but if after some investigation I think that the .w--current class is used both for slider and form focus in Webflow's master js file.
Here is my live project:
https://bauserwis-com-pl.webflow.io/
I found some solutions that use IntersectionObserver API to tell if the header is in viewport and stop the setInterval timer, but I struggle with integrating it with my code. Or perhaps is there a different solution? I don't mind slides changing in the background, I only want to stop the form from losing focus.
Thanks in advance.
var tabTimeout;
clearTimeout(tabTimeout);
tabLoop();
// Cycle through all tabs.
function tabLoop() {
tabTimeout = setTimeout(function() {
var $next = $('.tabs-menu').children('.w--current:first').next();
if($next.length) {
$next.click(); // user click resets timeout
} else {
$('.standard-tab:first').click();
}
}, 6000); // 6 second tab loop (change this)
}
// Reset loop if a tab is clicked
$('.standard-tab').click(function() {
clearTimeout(tabTimeout);
tabLoop();
});
});

jQuery does not trigger on Meteor Application after you do a page refresh in the browser

I am trying to implement this codepen into my Meteor app which I run with blaze.
I'm running into a problem where if I click on the Floating Action Button after a page refresh, nothing happens.
If I leave the page then go back it works fine. However every time I Ctrl + R or refresh the browser by hitting the refresh button, the jQuery will not run anymore.
My implementation of the CodePen code is pretty much exactly the same so I've narrowed this issue down to something with Meteor and the way it renders templates.
I've tried a few things so far:
1) Put it in a $(window).load()
2) Put in in a $(document).ready()
3) I've put it outside the Template.onRendered function
Here's the jQuery that's supposed to run when the plus button is clicked, the full code is in the CodePen link as well
$(".action").click(function(){
// $(".content1").addClass("inactive").delay(200).fadeOut(0);
$(this).addClass("active");
$(this).closest("div").find(".content2").fadeIn(0).addClass("active");
});
$(".close").click(function(){
$(".content2").removeClass("active").delay(300).fadeOut(0);
$(".action").removeClass("active");
// $(".content1").fadeIn(0).removeClass("inactive");
});
Ok so I placed that jQuery in the events section and it worked.
Template.TempName.events({
'click .action': function (event, instance) {
alert('hello');
// $(".content1").addClass("inactive").delay(200).fadeOut(0);
$('.action').addClass("active");
// $(this).closest("div").find(".content2").fadeIn(0).addClass("active");
},
});

Debugging Method in Chrome: Identify what line of code is executed after Onload event ended

I have a function in javascript. For example:
function Sample(){
var myid_signature_image = new Image();
myid_signature_image.onload = function () {
alert('Two');
};
alert('One');
}
I put a breakpoint in each line of the function. One is being displayed first, and then Two. Afer the onload event, some javascript function is interfering my code. How will I know what line of code is it using Google Chrome Developer Tools?
Fire up Developer Tools (Ctrl + Shift + I) and under Sources tab, put a breakpoint at the alert('Two'); line. Carry out your html actions thru the browser, in this case onload needs a refresh, and it will halt on the breakpoint. From here, just press F10 (step over next function call) and it will tell you what lines are executed next after your onload event.
Use the timeline of Chrome DevTools.
Filter out the purple (rendering) and green (painting) events as that is not what you are interested in.
You can programmatically add a marker in the timeline by using console.timeStamp("Marker name");. That might help you find the time range:
myid_signature_image.onload = function () {
console.timeStamp("Image loaded");
};
The mark will be rendered in the timeline as a small colored bar, provided the Flame Chart view is not activated. Mouse over it to see the timestamp label. You can also user the search box so as to find the event. See capture below:
Once you found the event corresponding to the javascript executed after the image load event, you can jump to the script line of code from there.

Stop auto tab switching in javascript on click

I found this article helpful for what I was needing to do, which was have a slideshow of sorts with a tab and tab_container using JavaScript. The code works great:
Automatic tab switch in javascript or jquery
However, what I want it to do is if you let the page run, it keeps rotating between the tabs. But if a tab is manually clicked on (example, they want to read the content on that tab) it stops the auto-rotation of the tabs for the duration of while they are on that webpage. If the page is refreshed, or they go back to the page, it starts the tab rotation again.
I'm not sure the Javascript code that I can add to the above example to make the auto-rotation stop.
Thanks in advance for the help!
You can use clearInterval to stop the setInterval function from running. setInterval returns an ID and you can pass that ID to clearInterval to stop it, e.g.
var intervalID = setInterval(function() {
....
clearInterval(intervalID);
So just make the code
var intervalID = setInterval(function() {
....
tabs.on('click', 'a', function(e) {
clearInterval(intervalID);
$(this).trigger('slides.swap');
e.preventDefault();
});
I'd also change the setInterval function from triggering a click to just straight-up triggering slides.swap, so that you know the difference between a triggered click and a user's click:
$('a:eq('+idx+')').trigger('slides.swap');
Here's the updated Fiddle from that question.

How to reset jquery dialog timeout for next dialog?

I have an add-to-bag button used throughout our site and we want a dynamic popup to appear to acknowledge what was just added, and then it goes away. I'm finding that if you click another add button, it has the previous dialog's timeout attached. To fix this so the next dialog has its own 10,000 setTimeout rather than whatever is left over from the last one I have come up with the following code (that doesn't do the trick).
$(document).ready(function ()
{
// Create object for future dialog box - so it's available to the close method
var addToBagDialogVar = $('<div id="addToBagDialogBox"></div>');
var autoCloseTimeout = 10000;
var dialogTimer;
$(".addToBagPU").click(function (e)
{
var result = "";
$.get(this.href, function (data) { SetData(addToBagDialogVar, data); });
return false;
});
// Start listening for the close link click
$(document).on("click", "#bagPUCloseLink", function (event)
{
event.preventDefault();
CloseDialog(addToBagDialogVar);
});
function SetData(addToBagDialogVar, data)
{
result = data;
var regex = data.match("{{(.*)}}");
var bagCount = regex[1];
addToBagDialogVar.html(result).dialog({
open: function ()
{
clearTimeout(dialogTimer);
$(".ui-dialog-titlebar-close").hide();
SetBagCount(bagCount),
dialogTimer = setTimeout(function () { CloseDialog(addToBagDialogVar); }, autoCloseTimeout);
},
show: { effect: "fadeIn", duration: 800 },
close: function () { clearTimeout(dialogTimer); },
width: 320
});
}
function CloseDialog(closeThisDialog)
{
closeThisDialog.dialog("close");
closeThisDialog.dialog("destroy").remove();
}
});
The dialog is loaded with dynamic content from an external .Net page with product data and has a close link inside that page, which is why the dialog is loaded into addToBagDialogVar so it's available to CloseDialog.
All of that works just fine. It's just the reset of the timer that doesn't appear to be happening. If I go down a page of products and add each one to my bag, the 3rd or 4th dialog is only up for a second or so because they have all been using the first dialogs setTimeout.
I've read and read and tried too many different ways to remember and now my brain is mush.
I propose an alternate explanation for the behavior you're observing. When you click the first "add to cart", a timer is started. As you go down the page clicking "add to cart", a new timer is started each time. There's no overlap, just a bunch of separate timers running normally (although incidentally, each new dialog box blows away the timer ID you've previously created; I'll come back to this).
When your first dialog's timer expires, the dialog closes itself via the HTML ID, meaning it closes itself with something like a jquery $('div#addToBagDialogBox').closeOrSomethingLikeThat(), that is, every dialog inside a div with an id of addToBagDialogBox. The first timer expiration is closing all of your dialogs, because they all use that same HTML ID. The other timers are running perfectly, but when they expire there's nothing left for them to do.
You can fix the early-close problem by assigning a unique HTML ID to each dialog you create. And you'll want to manage your timer IDs on a per-dialog basis as well, such that each dialog has its own timer ID.
Edit: Just for nerdy grins, think about the details of the scenario you described. Your first timer is running, counting down normally, and you start four other timers while the first dialog is still there. The ID of the fifth timer is in your variable dialogTimer. So when the first dialog's timer expires, the close processing occurs, and you call clearTimeout with the ID of the fifth dialog's timer. So your first dialog's timer expired, the dialog closed all the other dialogs, and the cleanup cancelled the fifth timer. There are three other timers still running, their IDs lost forever. They finally expire and their shutdown functions run, but they're totally without effect, their companion dialogs long gone. Sorry, bona fide nerd here.

Categories

Resources