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
HTML

HTML: Use data-* Attributes to Store Custom Data

- 20.06.26 - ErcanOPAK

📦 Store Extra Data in HTML Elements

Need to store data without showing? data-* attributes store custom data. Access via JavaScript. No hidden input needed.

📝 Basic Data Attributes

<!-- Store IDs and metadata -->
<div class="product" data-id="123" data-category="electronics" data-price="199.99">
  <h3>Product Name</h3>
  <button class="add-to-cart">Add to Cart</button>
</div>

<!-- Store user data -->
<div class="user-profile" data-user-id="42" data-role="admin">
  <h2>John Doe</h2>
</div>

<!-- Store configuration -->
<div class="widget" data-config='{"theme":"dark","position":"fixed"}'></div>

🎯 Access in JavaScript

<script>
// Get data attribute
const product = document.querySelector('.product');
const productId = product.dataset.id;  // '123'
const category = product.dataset.category;  // 'electronics'
const price = parseFloat(product.dataset.price);  // 199.99

// Set data attribute
product.dataset.discount = '0.15';

// Check if attribute exists
if (product.dataset.hasOwnProperty('category')) {
  console.log('Category:', product.dataset.category);
}

// Click handler
document.querySelector('.add-to-cart').addEventListener('click', (e) => {
  const productDiv = e.target.closest('.product');
  const id = productDiv.dataset.id;
  const price = productDiv.dataset.price;
  addToCart(id, price);
});

// JSON data
const config = JSON.parse(document.querySelector('.widget').dataset.config);
console.log(config.theme);  // 'dark'

// Multiple data attributes with dashes
// data-user-id → dataset.userId (camelCase)
<div data-user-id="42"></div>
const userId = div.dataset.userId;  // '42'
</script>

💡 Use Cases

  • Store item IDs for event handlers
  • Pass data to JavaScript without AJAX
  • Server-side rendering with client-side state
  • Configuration for widgets and components
  • Analytics tracking (data-track-* )

“Used hidden input for product ID. Switched to data-id. Cleaner, semantic, accessible via dataset. Data attributes are perfect for storing metadata.”

— Frontend Developer

Related posts:

HTML: Use Lang Attribute for Accessibility and SEO

HTML: Use Autofocus Attribute to Focus Input on Page Load

HTML: Build 2D Games with Canvas

Post Views: 5

Post navigation

CSS: Use Transform for Animations and Layout
JavaScript: Understand Closures for Powerful Functions

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 (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (940)
  • 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 (554)
  • 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 (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (940)
  • 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