• 0

[JS] Simple function not working unless I do alert() first


Question

The following code divides 'invites' by 'accepts' and then rounds it to 2 decimal places, always keeping 2 decimal places even if the answer is 8.00

This is the code I am using:

function live_ratio()
{
	// Check that the invites, accepts, and ratio spans have loaded
	while(!document.getElementById("live_invites").innerHTML || !document.getElementById("live_accepts").innerHTML || !document.getElementById("live_ratio").innerHTML)
	{
		//alert('blah');
		document.getElementById("live_ratio").innerHTML = (Math.round(document.getElementById("live_invites").innerHTML / document.getElementById("live_accepts").innerHTML * 100) / 100).toFixed(2);
	}
}

For some reason, it doesn't work how it is now, it just doesn't invoke the document.getElementById("live_ratio").innerHTML line, and doesn't update the span. However, if I uncomment the alert() above, it works perfectly! :blink: Any ideas? Also, it has to be in the while() statement because the 3 id's it checks have loaded, are loaded via AJAX.

Thanks all!

13 answers to this question

Recommended Posts

  • 0

someone at work was having the same problem a couple of weeks ago. remember that ajax is asynchronous and other executions will continue to be processed before the ajax stuff comes back. the alert is stopping execution of those 'other' tasks and the ajax finishes before you click ok. im not 100% sure that's your problem but it's eerily similar to what a saw a couple weeks ago.

  • 0

The function posted above though is nothing to do with the AJAX function I have, and I am not even calling the function from my AJAX function, I'm just doing a standalone live_ratio(); call.

...And either way, if that was the case, surely it would continue to loop through the while() until my spans had loaded?

  • 0

i created a page, added those three elements to the page, and added your function. i called the function without an echo and it worked fine. could you post some of the structure relating to those inputs and anything populating them?

edit: by inputs i mean live_invites, live_accepts, and live_ratio

  • 0

Odd, I've just done what you've just done and uploaded only what was necessary and it still doesn't work:

<html>
<head>
<script>
// Check that the invites, accepts, and ratio spans have loaded
while(!document.getElementById("live_invites").innerHTML || !document.getElementById("live_accepts").innerHTML || !document.getElementById("live_ratio").innerHTML)
{
	//alert('fg');
	document.getElementById("live_ratio").innerHTML = (Math.round(document.getElementById("live_invites").innerHTML / document.getElementById("live_accepts").innerHTML * 100) / 100).toFixed(2);
}
</script>
</head>
<body>
<span id="live_invites">245</span>:<span id="live_accepts">24</span> = 1:<span id="live_ratio"></span>
</body>
</html>

  • 0

That's because when you use it in the HEAD, the document hasn't been fully created yet. As a result, document.getElementById('ANYTHING') is pretty much guaranteed to fail. If you wrap it in a function and call it onload, it should work better:

<html>
  <head>
	<script>
	  function foo ()
	  {
		// Check that the invites, accepts, and ratio spans have
		// loaded
		while (!document.getElementById("live_invites").innerHTML
			  || !document.getElementById("live_accepts").innerHTML
			  || !document.getElementById("live_ratio").innerHTML)
		  {
			//alert('fg');
			document.getElementById("live_ratio").innerHTML =
			  (Math.round(document.getElementById("live_invites").innerHTML
						  / document.getElementById("live_accepts").innerHTML
						  * 100) / 100).toFixed(2);
		  }
	  }
	</script>
  </head>
  <body onload="foo()">
	<span id="live_invites">245</span>:<span id="live_accepts">24</span> =
	1:<span id="live_ratio"></span>
  </body>
</html>

  • 0

Adding to that, JavaScript runs in a separate thread so if you have an alert() call first in your while-loop, it'll probably have enough time to first render the document and populate the DOM object. That's why the line beneath it gets called a little later and gets executed properly since only then the document object is valid.

So a good lesson here: use the onload event to trigger something as soon as the page is loaded. Or if you want to do it even better, use the Prototype JS framework and observe the "dom:loaded" event! :p

  • 0

Thanks for all of your help everyone, it is really appreciated! :D

Ok it is now working great in my application, but it occassionally comes up with 'Infinity' or 'NaN' (presumably if AJAX hasn't populated the spans yet). I've managed to catch them, but for some reason I can't get it to re-call the function. It re-calls the function if I put an alert in, but again, doesn't if I don't.

This is the code I have:

// Calculate invite:accept LiveChat ratio
function live_ratio()
{
	document.getElementById("live_ratio").innerHTML = (Math.round(document.getElementById("live_invites").innerHTML / document.getElementById("live_accepts").innerHTML * 100) / 100).toFixed(2);
	while(document.getElementById("live_ratio").innerHTML == "Infinity" || document.getElementById("live_ratio").innerHTML == "NaN")
	{
		//alert('invoked');
		live_ratio();
	}
}

  • 0

No I'm not using any frameworks and would rather not implement one just to acheive this. I now have the following code:

// Calculate invite:accept LiveChat ratio
function live_ratio()
{

	//alert('invoked');

	if(document.getElementById("live_invites").innerHTML && document.getElementById("live_accepts").innerHTML)
	{
		document.getElementById("live_ratio").innerHTML = 'loaded';
	}
	else
	{
		live_ratio();
	}
}

It is refusing to call itself if the spans don't have content loaded yet. It just keeps live_ratio blank. However, if I uncomment the alert() line, it works. Why on Earth isn't the code above working?

I have ?6.08 in my PayPal account to anyone who can get it working:pp

Edit:> I've managed to get it working (fingers crossed), changed live_ratio(); to setTimeout("live_ratio()", 1); (taken from http://javascript.about.com/library/blrecursive.htm). Seems to be working, just double checking now.:DD

Edited by -Alex-
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I just looked on my computer and there are settings and log files for utilities I have never even turned on!
    • O&O ShutUp10 3.1.1104 by Razvan Serea O&O ShutUp10 offers a simple yet effective way to take control of your Windows privacy. It provides access to almost 50 privacy-related tweaks, most of them hidden or not easily accessible to the average computer users. Using a very simple interface, you decide how Windows 10/11 should respect your privacy by deciding which unwanted functions should be deactivated. Using ShutUp10 you can easily disable Windows Defender, turn off telemetry, disable peer-to-peer updates, turn off Wi-Fi Sense, disable automatic Windows updates, turn off and reset Cortana and more. ShutUp10 allows you to create a System Restore point before you apply any changes, so that you can revert your system at any time if you run into problems. O&O ShutUp10 is entirely free and does not have to be installed – it can be simply run directly and immediately on your PC. And it will not install or download retrospectively unwanted or unnecessary software, like so many other programs do these days! O&O ShutUp10 Free and Premium The latest version brings O&O ShutUp10 Premium, expanding the app’s long-standing privacy controls with automatic enforcement of user-defined settings. Instead of manually rechecking options after every Windows update, users can set their preferred privacy configuration once—or apply recommended settings in a single click—and the tool continuously monitors them in the background. If Windows 10 or 11 re-enables disabled features or introduces new data collection paths, Premium restores the chosen settings automatically without user intervention. The free version remains available and fully functional for manual adjustments, offering the same core privacy controls for Windows. However, the Premium tier is aimed at users who want long-term, hands-off protection, adding automatic reapplication after updates, ongoing monitoring, and optional notifications to ensure privacy settings remain consistent over time. O&O ShutUp10 3.1.1104 changelog: Added “Show Differences” button in the overview panel “Don’t show again” option for the restore point prompt Ctrl+F keyboard shortcut for search/filter functionality Detection and linking of system-wide and user-specific setting associations Automatic search while typing PREM: Option to preserve notification counters and timestamps across application restarts PREM: Reset blocked settings button in the Settings dialog PREM: Informational message when no settings are blocked PREM: Update check can also be triggered from the menu PREM: Notification deduplication and activity log summary feature Improved L005 “Disable Windows Location Service”: Version-specific split (up to Windows 11 23H2) and new variant for Windows 11 24H2+ L001 (Disable Location): Added Night Light warning to the description in all languages Search now detects setting IDs even when ID display is disabled and offers to enable it Detection and removal of Copilot/AI desktop apps in RecallTerminator Optimized High DPI support PREM: Reset button is now only enabled when blocked items exist – setting IDs are shown in the confirmation dialog PREM: Updated tray icons with higher-resolution versions PREM: Activity Log timestamps now use localized date and time formats PREM: Tray icon status now uses OK/Warning indicators and localized tooltips PREM: Recall folder detection switched to service-based detection PREM: Copilot uninstallation now provides UI feedback and improved verification Fixed Description text was not displayed correctly for the last item and disappeared when clicking the scrollbar Crash when clicking a search result heading or the […] button PREM: Installation path is now correctly preserved during upgrades PREM: Tray icon was not reliably removed when exiting the application PREM: Main window was not displayed correctly in single-instance mode PREM: Incorrect display of the & symbol in tray icon tooltips on Windows 10 PREM: Fixed notification flooding after sleep/standby PREM: Dashboard was not refreshed after applying recommended settings during onboarding PREM: Progress bar was not reset after deleting Recall folders PREM: Fixed service startup failures PREM: Fixed incorrect drift detection when Automatic Protection was disabled PREM: Notifications now correctly count all deviating settings when protection is enabled PREM: Registration Wizard was shown after sleep/standby despite a valid license Download: O&O ShutUp10 3.1.1104 | 76.4 MB (Freeware) Download: O&O ShutUp10 32-bit | ARM64 View: O&O ShutUp10 Home Page | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Fascinating...W h i t e P o w e r is now also asterisks out.  
    • In the past few days I have noticed two odd moderation activities. First, when I posted the term 'White Nationist Christian' it was asterisk's out. When I changed it to **** it was allowed! Second, in the Politics is a ###business thread I was allowed to post that the GOP is a party of p e d ophiles but I was censored  when I posted the GOP are a party of p e d ophile protectors. Wtf Neowin. Please explain.
  • Recent Achievements

    • One Month Later
      Vincian earned a badge
      One Month Later
    • First Post
      Jocimo earned a badge
      First Post
    • Week One Done
      suprememobiles48 earned a badge
      Week One Done
    • One Month Later
      Windows Guy earned a badge
      One Month Later
    • One Month Later
      Prasann earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      547
    2. 2
      +Edouard
      166
    3. 3
      PsYcHoKiLLa
      86
    4. 4
      Steven P.
      66
    5. 5
      neufuse
      65
  • Tell a friend

    Love Neowin? Tell a friend!