Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
JavaScript

JavaScript Debounce and Throttle: Control Event Frequency Like a Pro

- 23.08.26 - ErcanOPAK

⚑ Key Takeaways: Debounce delays function execution. Throttle limits execution frequency. Essential for performance optimization.

Events fire too often. Debounce and throttle control them.

πŸ”„ Debounce – Wait and Execute

// βœ… Debounce implementation
function debounce(func, delay = 300) {
    let timeoutId;
    
    return function (...args) {
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => {
            func.apply(this, args);
        }, delay);
    };
}

// βœ… Use case: Search input
const searchInput = document.getElementById('search');
const searchResults = document.getElementById('results');

const handleSearch = debounce((event) => {
    const query = event.target.value;
    console.log('Searching for:', query);
    
    // βœ… API call only after user stops typing
    fetch(`/api/search?q=${query}`)
        .then(res => res.json())
        .then(data => {
            searchResults.innerHTML = data.map(item => 
                `
${item.name}
` ).join(''); }); }, 500); searchInput.addEventListener('input', handleSearch); // βœ… Use case: Save on form const saveForm = debounce(() => { console.log('Saving form...'); // βœ… Only saves when user stops editing saveToDatabase(); }, 1000); document.getElementById('form').addEventListener('change', saveForm);

⏱️ Throttle – Execute at Intervals

// βœ… Throttle implementation
function throttle(func, limit = 300) {
    let inThrottle = false;
    
    return function (...args) {
        if (!inThrottle) {
            func.apply(this, args);
            inThrottle = true;
            setTimeout(() => {
                inThrottle = false;
            }, limit);
        }
    };
}

// βœ… Use case: Scroll events
const handleScroll = throttle(() => {
    const scrollY = window.scrollY;
    console.log('Scrolled to:', scrollY);
    
    // βœ… Update progress bar
    const progress = (scrollY / (document.body.scrollHeight - window.innerHeight)) * 100;
    document.getElementById('progress-bar').style.width = `${progress}%`;
}, 200);

window.addEventListener('scroll', handleScroll);

// βœ… Use case: Resize events
const handleResize = throttle(() => {
    console.log('Window resized:', window.innerWidth, window.innerHeight);
    
    // βœ… Update layout (limited frequency)
    updateLayout();
}, 500);

window.addEventListener('resize', handleResize);

πŸ’‘ Advanced: Immediate Execution

// βœ… Debounce with immediate execution
function debounceImmediate(func, delay = 300) {
    let timeoutId;
    let called = false;
    
    return function (...args) {
        if (!called) {
            func.apply(this, args);
            called = true;
        }
        
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => {
            called = false;
        }, delay);
    };
}

// βœ… Use case: First call immediately
const handleClick = debounceImmediate(() => {
    console.log('Button clicked');
    // βœ… Immediate feedback
    showFeedback();
}, 300);

button.addEventListener('click', handleClick);

πŸ“Š When to Use What

Scenario Solution Example
Search input Debounce Search after typing stops
Scroll events Throttle Progress bar updates
Form save Debounce Auto-save after editing
Resize events Throttle Layout updates
Button clicks Debounce (immediate) Prevent double clicks
API calls Debounce Rate limit requests

Related posts:

Pass model from Razor view to JavaScript

AJAX β€œWorks Once, Then Fails” β€” Cached POST Response

Ajax Forms Submit Twice

Post Views: 6

Post navigation

Step-by-Step: Building a Minimal API with C# 13 Features
C# Collection Expressions: Write Cleaner Code with `[]` Syntax

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (952)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (952)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com