Air Fryer Crispy Mini Blooming Onions bring that irresistible crunch and golden glow straight to your table, with tender, sweet layers inside and a warm, savory aroma that fills the kitchen. This easy air fryer onion appetizer delivers the same indulgent bite as a classic blooming onion, yet feels lighter and more comforting.
Growing up, blooming onions were always a festive treat during family gatherings, and now this healthy blooming onion air fryer version keeps that nostalgic flavor alive. With its crisp coating and bold seasoning, this homemade blooming onion without frying is both satisfying and simple. Try it today, share it with friends, and save it for your next cozy snack craving.
Quick Answer
Air Fryer Crispy Mini Blooming Onions are a healthier take on the classic blooming onion appetizer. Fresh onions are sliced into petal shapes, coated in a seasoned batter, and cooked in an air fryer at 380°F (190°C) for 10–12 minutes. This method creates a crispy golden crust while keeping the inside tender, all with minimal oil.
Why This Air Fryer Crispy Mini Blooming Onions Works Every Time
- The air fryer circulates hot air evenly, creating a perfectly crispy exterior without deep frying
- The seasoned coating delivers bold, layered flavor in every bite
- Buttermilk helps tenderize the onions while improving coating adhesion
- Sweet onions caramelize slightly, adding natural sweetness to balance the spices
- Quick cooking time locks in moisture while achieving a golden crust
- Minimal oil keeps it lighter while still satisfying that crunchy craving
What Goes Into This Air Fryer Crispy Mini Blooming Onions
Ingredients
1 cup buttermilk or milk with lemon juice
1 cup flour (or gluten-free flour)
1 tbsp paprika
1 tsp garlic powder
1 tsp onion powder
0.5 tsp cayenne pepper
1 tsp salt
1 tsp pepper
2 medium sweet onions
Cooking spray or oil as needed
Ingredient Breakdown
Buttermilk is essential because it softens the onion layers and helps the flour coating stick evenly. If you use milk with lemon juice, you’ll still achieve a similar tangy effect.
Flour forms the base of the crispy coating. Meanwhile, gluten-free flour works just as well, making this recipe accessible for different dietary needs.
Paprika brings color and depth, while smoked paprika adds a subtle richness that enhances the overall flavor.
Cayenne pepper provides a gentle heat. However, you can adjust it easily depending on your spice tolerance.
Sweet onions, especially varieties like Vidalia, are ideal because they cook down into a soft, slightly sweet interior that contrasts beautifully with the crispy coating.
Optional Add-Ins & Substitutions
- Use gluten-free flour for a gluten-free version
- Reduce cayenne for a milder, kid-friendly option
- Add extra paprika for a smoky flavor boost
- Use minimal oil spray for a lighter version

Let’s Make It! Step-by-Step Guide to Air Fryer Crispy Mini Blooming Onions
Step One – Prepare the Buttermilk Mixture
Combine the buttermilk and let it rest briefly. This allows it to slightly thicken, helping it cling better to the onions. Skipping this step may lead to uneven coating.
Step Two – Cut the Blooming Shape
Trim the onions and carefully slice vertical cuts to create petal-like sections. The base should remain intact so the onion holds its shape during cooking.
Step Three – Mix the Seasoned Coating
Combine flour, paprika, garlic powder, onion powder, cayenne, salt, and pepper. The mixture should smell aromatic and slightly spicy.
Step Four – Coat the Onions Thoroughly
Dip each onion into the buttermilk, then coat it in the flour mixture. Make sure every layer is covered for maximum crispiness.
Step Five – Preheat the Air Fryer
Set the air fryer to 380°F (190°C) and preheat for about 5 minutes. This ensures immediate crisping once cooking begins.
Step Six – Arrange for Proper Airflow
Place the onions in the basket with enough space between them. Proper airflow is key for even crisping.
Step Seven – Add Oil for Crisp Texture
Lightly spray or brush oil over the onions. This helps develop a golden, crunchy crust.
Step Eight – Cook Until Golden
Air fry for 10–12 minutes, shaking halfway through. The coating should turn deep golden brown and crisp.
Step Nine – Serve Immediately
Serve warm with your favorite dipping sauce. The contrast between crispy exterior and soft interior is best enjoyed fresh.
Expert Tips for the Best Air Fryer Crispy Mini Blooming Onions
- Always preheat the air fryer to ensure even cooking
- Avoid overcrowding the basket
- Use light oil spray for better crisping
- Shake halfway through cooking
- Ensure onions are dry before coating
- Use fresh spices for stronger flavor
- Cut evenly for consistent cooking
- Let coating rest briefly before cooking
- Do not overcoat with flour
- Serve immediately for best texture
- Adjust spice levels to taste
- Keep airflow unobstructed
- Test one onion first if unsure
Flavor Variations & Dietary Swaps
- Healthy version: reduce oil and salt
- Kid-friendly: remove cayenne pepper
- Spicy version: increase cayenne or paprika
- Budget option: use standard onions
- Holiday twist: serve with festive dipping sauces
- High-protein pairing: serve with yogurt-based dip
- Make-ahead option: prep onions in advance
Serving Ideas & Pairings
These Air Fryer Crispy Mini Blooming Onions are perfect for parties, casual dinners, or snack time.
Pair them with:
- our crispy chicken tenders
- our homemade ranch dip
- our loaded potato wedges
- our spicy buffalo wings
👉 Quick question: would you dip these in a creamy sauce or a spicy one?

Nutrition Facts
Calories: 150
Protein: 3g
Carbs: 20g
Fat: 5g
Sugar: 2g
Fiber: 2g
Best Ways to Store This Air Fryer Crispy Mini Blooming Onions
Store leftovers in the refrigerator for up to 2 days. However, they taste best fresh.
Reheat in the air fryer at 350°F for a few minutes to restore crispiness. Avoid microwaving, as it softens the coating.
Freezing is not recommended because it affects texture.
Everything You Want to Know
How long do Air Fryer Crispy Mini Blooming Onions take to cook?
Air Fryer Crispy Mini Blooming Onions typically take about 10–12 minutes at 380°F (190°C), plus a short preheating time. However, cooking time may vary slightly depending on your air fryer model. For best results, shake the basket halfway through to ensure even crisping and a perfectly golden texture.
Can I make Air Fryer Crispy Mini Blooming Onions with no breading?
Yes, you can make a no-breading version for a lighter option. Simply season the onion petals and air fry them with a light spray of oil. While you won’t get the same crunchy coating, the onions will still turn tender, slightly caramelized, and flavorful, making it a great healthy blooming onion air fryer alternative.
How do I make Texas Roadhouse or Outback-style blooming onions in an air fryer?
To recreate a Texas Roadhouse blooming onion air fryer or Outback blooming onion air fryer style, focus on bold seasoning and a well-coated batter. Use paprika, garlic, and cayenne for depth, and ensure each petal is evenly coated. While air frying won’t fully replicate deep frying, it delivers a crisp, lighter version with similar flavor.
Can I cook Air Fryer Crispy Mini Blooming Onions in a Ninja air fryer?
Yes, Air Fryer Crispy Mini Blooming Onions work perfectly in a Ninja air fryer. The cooking temperature and time remain the same—380°F for about 10–12 minutes. However, because Ninja models often circulate air strongly, check slightly earlier to avoid over-browning.
What’s the best air fryer blooming onion recipe without egg?
The best air fryer blooming onion recipe without egg uses buttermilk or milk with lemon juice as a binding agent. This method helps the flour coating stick well while keeping the texture crispy. It’s an excellent option if you’re avoiding eggs but still want that classic crunchy finish.
More Delicious Ideas
- Try our Homemade Corned Beef and Cabbage
- Explore our Vanilla Bean Crème Brûlée Cupcakes – Easy Recipe
- Enjoy our Chocolate Croissant Breakfast Bake Easy Brunch Dish
- Discover our Low Sugar Carrot Cake with Cream Cheese Frosting
Final Bite
Air Fryer Crispy Mini Blooming Onions deliver that perfect crunch, bold flavor, and satisfying texture without the heaviness of traditional frying. They’re quick, easy, and ideal for any occasion—from casual snacking to entertaining guests.
Would you go for extra spice or keep it classic?
Would you serve these at a party or keep them all to yourself?
👉 Give this recipe a try today, and don’t forget to save it for later, share it with your friends, and drop a comment to let me know how yours turned out!
Best Air Fryer Crispy Mini Blooming Onions Recipe
Total Time: 22 minutes
Yield: 4 onions 1x
Diet: Vegetarian
Description
Air Fryer Crispy Mini Blooming Onions are a lighter take on the classic appetizer, featuring sweet onions coated in a seasoned batter and air fried until golden, crispy, and full of flavor. Perfect for parties, snacking, or serving with your favorite dipping sauce.
Ingredients
Scale
- 1 cup buttermilk or milk with lemon juice
- 1 cup flour or gluten-free flour
- 1 tbsp paprika
- 1 tsp garlic powder
- 1 tsp onion powder
- 0.5 tsp cayenne pepper
- 1 tsp salt
- 1 tsp pepper
- 2 medium sweet onions
- Cooking spray or oil, as needed
Instructions
- In a small bowl, combine the buttermilk or milk with lemon juice and let it sit for 5 minutes.
- Peel the onions, then carefully slice off the tops and bottoms to create a stable base. Make vertical cuts to form petal-like blooms while keeping the base intact.
- In a separate bowl, mix the flour, paprika, garlic powder, onion powder, cayenne pepper, salt, and pepper.
- Dip each onion into the buttermilk mixture, letting any excess drip away, then coat thoroughly in the seasoned flour mixture.
- Preheat the air fryer to 380°F (190°C) for 5 minutes.
- Place the coated onions in the air fryer basket, leaving space between them for proper air circulation.
- Lightly spray the tops of the onions with cooking spray or brush them with oil.
- Cook for 10 to 12 minutes, shaking the basket halfway through, until the onions are golden and crispy.
- Serve warm with your favorite dipping sauce.
Notes
- Use sweet onions such as Vidalia for the best flavor and texture.
- Do not overcrowd the air fryer basket or the onions may not crisp evenly.
- For a gluten-free version, use gluten-free flour.
- Reduce the cayenne pepper for a milder, kid-friendly flavor.
- These onions are best served immediately for maximum crispiness.
- Reheat leftovers in the air fryer to help restore their crispy texture.
- Prep Time: 5 minutes
- Cook Time: 12 minutes
- Category: Appetizers
- Method: Air Fryer
- Cuisine: American
Nutrition
- Serving Size: 1 onion
- Calories: 150 kcal
- Sugar: 2 g
- Sodium: 250 mg
- Fat: 5 g
- Saturated Fat: 1 g
- Unsaturated Fat: 3.5 g
- Trans Fat: 0 g
- Carbohydrates: 20 g
- Fiber: 2 g
- Protein: 3 g
- Cholesterol: 5 mg
const elementHref = anchor.getAttribute( 'href' ); if ( ! elementHref ) { return; }
e.preventDefault(); this.goToSelector( elementHref ); }); }, goToSelector( selector ) { const element = document.querySelector( selector ); if ( ! element ) { return; } element.scrollIntoView( { behavior: 'smooth' } ); } };
document.addEventListener( 'DOMContentLoaded', () => window.TastyRecipes.smoothScroll.init() );
(function(){
var bothEquals = function( d1, d2, D ) {
var ret = 0;
if (d1<=D) {
ret++;
}
if (d2<=D) {
ret++;
}
return ret === 2;
};var frac =function frac(x,D,mixed){var n1=Math.floor(x),d1=1;var n2=n1+1,d2=1;if(x!==n1){while(bothEquals(d1,d2,D)){var m=(n1+n2)/(d1+d2);if(x===m){if(d1+d2<=D){d1+=d2;n1+=n2;d2=D+1}else if(d1>d2){d2=D+1;}else {d1=D+1;}break}else if(x
window.tastyRecipesVulgarFractions = JSON.parse(decodeURIComponent("%7B%22%C2%BC%22%3A%221%2F4%22%2C%22%C2%BD%22%3A%221%2F2%22%2C%22%C2%BE%22%3A%223%2F4%22%2C%22%E2%85%93%22%3A%221%2F3%22%2C%22%E2%85%94%22%3A%222%2F3%22%2C%22%E2%85%95%22%3A%221%2F5%22%2C%22%E2%85%96%22%3A%222%2F5%22%2C%22%E2%85%97%22%3A%223%2F5%22%2C%22%E2%85%98%22%3A%224%2F5%22%2C%22%E2%85%99%22%3A%221%2F6%22%2C%22%E2%85%9A%22%3A%225%2F6%22%2C%22%E2%85%9B%22%3A%221%2F8%22%2C%22%E2%85%9C%22%3A%223%2F8%22%2C%22%E2%85%9D%22%3A%225%2F8%22%2C%22%E2%85%9E%22%3A%227%2F8%22%7D"));
window.tastyRecipesFormatAmount = function(amount, el) { if ( parseFloat( amount ) === parseInt( amount ) ) { return amount; } var roundType = 'frac'; if (typeof el.dataset.amountShouldRound !== 'undefined') { if ('false' !== el.dataset.amountShouldRound) { if ( 'number' === el.dataset.amountShouldRound ) { roundType = 'number'; } else if ('frac' === el.dataset.amountShouldRound) { roundType = 'frac'; } else if ('vulgar' === el.dataset.amountShouldRound) { roundType = 'vulgar'; } else { roundType = 'integer'; } } } if ('number' === roundType) { amount = Number.parseFloat(amount).toPrecision(2); } else if ('integer' === roundType) { amount = Math.round(amount); } else if ('frac' === roundType || 'vulgar' === roundType) { var denom = 8; if (typeof el.dataset.unit !== 'undefined') { var unit = el.dataset.unit; if (['cups','cup','c'].includes(unit)) { denom = 4; if (0.125 === amount) { denom = 8; } if ("0.1667" === Number.parseFloat( amount ).toPrecision(4)) { denom = 6; } } if (['tablespoons','tablespoon','tbsp'].includes(unit)) { denom = 2; } if (['teaspoons','teaspoon','tsp'].includes(unit)) { denom = 8; } } var amountArray = frac.cont( amount, denom, true ); var newAmount = ''; if ( amountArray[1] !== 0 ) { newAmount = amountArray[1] + '/' + amountArray[2]; if ('vulgar' === roundType) { Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) { if (newAmount === window.tastyRecipesVulgarFractions[vulgar]) { newAmount = vulgar; } }); } } if ( newAmount ) { newAmount = ' ' + newAmount; } if ( amountArray[0] ) { newAmount = amountArray[0] + newAmount; } amount = newAmount; } return amount; };
window.tastyRecipesUpdatePrintLink = () => {
const printButton = document.querySelector( '.tasty-recipes-print-button' );
if ( ! printButton ) { return; }
const printURL = new URL( printButton.href ); const searchParams = new URLSearchParams( printURL.search );
const unitButton = document.querySelector( '.tasty-recipes-convert-button-active' ); const scaleButton = document.querySelector( '.tasty-recipes-scale-button-active' );
let unit = ''; let scale = '';
if ( unitButton ) { unit = unitButton.dataset.unitType; searchParams.delete('unit'); searchParams.set( 'unit', unit ); }
if ( scaleButton ) { scale = scaleButton.dataset.amount; searchParams.set( 'scale', scale ); }
const paramString = searchParams.toString(); const newURL = '' === paramString ? printURL.href : printURL.origin + printURL.pathname + '?' + paramString; const printLinks = document.querySelectorAll( '.tasty-recipes-print-link' );
printLinks.forEach( ( el ) => { el.href = newURL; });
const printButtons = document.querySelectorAll( '.tasty-recipes-print-button' ); printButtons.forEach( ( el ) => { el.href = newURL; }); };
document.addEventListener( 'DOMContentLoaded', () => {
if ( ! window.location.href.includes( '/print/' ) ) { return; }
const searchParams = new URLSearchParams( window.location.search );
const unit = searchParams.get( 'unit' ); const scale = searchParams.get( 'scale' );
if ( unit && ( 'metric' === unit || 'usc' === unit ) ) { document.querySelector( '.tasty-recipes-convert-button[data-unit-type="' + unit + '"]' ).click(); }
if ( scale && Number(scale) > 0 ) { document.querySelector( '.tasty-recipes-scale-button[data-amount="' + Number(scale) + '"]' ).click(); } }); }());
(function(){ var buttonClass = 'tasty-recipes-scale-button', buttonActiveClass = 'tasty-recipes-scale-button-active', buttons = document.querySelectorAll('.tasty-recipes-scale-button'); if ( ! buttons ) { return; }
buttons.forEach(function(button){ button.addEventListener('click', function(event){ event.preventDefault(); var recipe = event.target.closest('.tasty-recipes'); if ( ! recipe ) { return; } var otherButtons = recipe.querySelectorAll('.' + buttonClass); otherButtons.forEach(function(bt){ bt.classList.remove(buttonActiveClass); }); button.classList.add(buttonActiveClass);
var scalables = recipe.querySelectorAll('span[data-amount]'); var buttonAmount = parseFloat( button.dataset.amount ); scalables.forEach(function(scalable){ if (typeof scalable.dataset.amountOriginalType === 'undefined' && typeof scalable.dataset.nfOriginal === 'undefined') { if (-1 !== scalable.innerText.indexOf('/')) { scalable.dataset.amountOriginalType = 'frac'; } if (-1 !== scalable.innerText.indexOf('.')) { scalable.dataset.amountOriginalType = 'number'; } Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) { if (-1 !== scalable.innerText.indexOf(vulgar)) { scalable.dataset.amountOriginalType = 'vulgar'; } }); if (typeof scalable.dataset.amountOriginalType !== 'undefined') { scalable.dataset.amountShouldRound = scalable.dataset.amountOriginalType; } } var amount = parseFloat( scalable.dataset.amount ) * buttonAmount; amount = window.tastyRecipesFormatAmount(amount, scalable); if ( typeof scalable.dataset.unit !== 'undefined' ) { if ( ! scalable.classList.contains('nutrifox-quantity') ) { if ( ! scalable.classList.contains('nutrifox-second-quantity') ) { amount += ' ' + scalable.dataset.unit; } } } scalable.innerText = amount; });
var nonNumerics = recipe.querySelectorAll('[data-has-non-numeric-amount]'); nonNumerics.forEach(function(nonNumeric){ var indicator = nonNumeric.querySelector('span[data-non-numeric-label]'); if ( indicator ) { nonNumeric.removeChild(indicator); } if ( 1 !== buttonAmount ) { indicator = document.createElement('span'); indicator.setAttribute('data-non-numeric-label', true); var text = document.createTextNode(' (x' + buttonAmount + ')'); indicator.appendChild(text); nonNumeric.appendChild(indicator); } });
window.tastyRecipesUpdatePrintLink(); }); }); }());
(function(){ document.querySelectorAll('[data-tr-ingredient-checkbox]').forEach(function(el) { var input = el.querySelector('.tr-ingredient-checkbox-container input[type="checkbox"]'); if ( ! input ) { return; } if (input.checked) { el.dataset.trIngredientCheckbox = 'checked'; } el.addEventListener('click', function(event) { if ( 'A' === event.target.nodeName || 'INPUT' === event.target.nodeName || 'LABEL' === event.target.nodeName ) { return; } input.click(); }); input.addEventListener('change', function() { el.dataset.trIngredientCheckbox = input.checked ? 'checked' : ''; }); }); }());
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.staticTooltip = { element: null, tooltipElement: null, deleting: false, init( element ) { if ( this.deleting ) { return; } this.element = element; this.buildElements(); }, destroy() { if ( ! this.tooltipElement || this.deleting ) { return; }
this.deleting = true; this.tooltipElement.classList.remove( 'opened' );
setTimeout( () => { this.tooltipElement.remove(); this.deleting = false; }, 500 ); }, buildElements() { const tooltipElement = document.createElement( 'div' ); tooltipElement.classList.add( 'tasty-recipes-static-tooltip'); tooltipElement.setAttribute( 'id', 'tasty-recipes-tooltip' );
const currentTooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); if ( currentTooltipElement ) { document.body.replaceChild( tooltipElement, currentTooltipElement ); } else { document.body.appendChild( tooltipElement ); }
this.tooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); }, show() { if ( ! this.tooltipElement ) { return; }
const tooltipTop = this.element.getBoundingClientRect().top + window.scrollY - 10 // 10px offset. - this.tooltipElement.getBoundingClientRect().height; const tooltipLeft = this.element.getBoundingClientRect().left - ( this.tooltipElement.getBoundingClientRect().width / 2 ) + ( this.element.getBoundingClientRect().width / 2 ) - 1; const posLeft = Math.max( 10, tooltipLeft ); this.maybeRemoveTail( posLeft !== tooltipLeft );
this.tooltipElement.setAttribute( 'style', 'top:' + tooltipTop + 'px;left:' + posLeft + 'px;' ); this.tooltipElement.classList.add( 'opened' );
}, maybeRemoveTail( removeTail ) { if ( removeTail ) { this.tooltipElement.classList.add( 'tr-hide-tail' ); } else { this.tooltipElement.classList.remove( 'tr-hide-tail' ); } }, changeMessage( message ) { if ( ! this.tooltipElement ) { return; } this.tooltipElement.innerHTML = message; } };
window.TastyRecipes.ajax = { sendPostRequest( url, data, success, failure ) { const xhr = new XMLHttpRequest(); xhr.open( 'POST', url, true ); xhr.send( this.preparePostData( data ) );
xhr.onreadystatechange = () => { if ( 4 !== xhr.readyState ) { return; } if ( xhr.status === 200 ) { success( JSON.parse( xhr.responseText ) ); return; }
failure( xhr ); };
xhr.onerror = () => { failure( xhr ); }; }, preparePostData( data ) { const formData = new FormData();
for ( const key in data ) { formData.append( key, data[key] ); } return formData; }, };
window.TastyRecipes.ratings = { defaultRating: 0, currentRatingPercentage: 100, savingRating: false, init( minRating ) { this.minRating = minRating;
this.formWatchRating(); this.closeTooltipWhenClickOutside(); this.addBodyClassBasedOnSelectedRating(); this.backwardCompFormRatingPosition(); }, formWatchRating() { const ratings = document.querySelectorAll('.tasty-recipes-no-ratings-buttons [data-rating]'); if ( ratings.length <= 0 ) { return; } for ( const rating of ratings ) { rating.addEventListener( 'click', event => { event.preventDefault(); this.defaultRating = event.target.closest( '.checked' ).dataset.rating; this.setCheckedStar( event.target ); this.maybeSendRating( this.defaultRating, event.target ); this.setRatingInForm( this.defaultRating ); } ); } }, closeTooltipWhenClickOutside() { window.addEventListener( 'click', e => { // Bailout (don't remove the tooltip) when the clicked element is a rating star, or it's the tooltip itself. if ( e.target.closest( '.tasty-recipes-rating' ) || e.target.classList.contains( 'tasty-recipes-static-tooltip' ) ) { return; }
window.TastyRecipes.staticTooltip.destroy(); } ); }, setRatingInForm( rating ) { const ratingInput = document.querySelector( '#respond .tasty-recipes-rating[value="' + rating + '"]' ); if ( ! ratingInput ) { return; } ratingInput.click(); }, addBodyClassBasedOnSelectedRating() { const ratingInputs = document.querySelectorAll( 'input.tasty-recipes-rating' ); if ( ! ratingInputs ) { return; } for ( const ratingInput of ratingInputs ) { ratingInput.addEventListener( 'click', currentEvent => { const selectedRating = currentEvent.target.getAttribute( 'value' ); this.handleBodyClassByRating( selectedRating ); this.toggleCommentTextareaRequired( selectedRating ); } ); } }, handleBodyClassByRating( rating ) { if ( rating < this.minRating ) { document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' ); return; } document.body.classList.add( 'tasty-recipes-selected-minimum-rating' ); }, toggleCommentTextareaRequired( rating ) { const commentTextarea = document.getElementById( 'comment' ); if ( ! commentTextarea ) { return; }if ( rating < this.minRating ) { commentTextarea.setAttribute( 'required', '' ); return; }commentTextarea.removeAttribute( 'required' ); }, maybeSendRating( rating, element ) { if ( this.savingRating === rating ) { return; }this.savingRating = rating; window.TastyRecipes.staticTooltip.init( element );const recipeCardElement = element.closest( '.tasty-recipes' ); if ( ! recipeCardElement ) { window.TastyRecipes.staticTooltip.destroy(); return; }window.TastyRecipes.ajax.sendPostRequest( window.trCommon.ajaxurl, { action: 'tasty_recipes_save_rating', rating, nonce: window.trCommon.ratingNonce, post_id: window.trCommon.postId, recipe_id: recipeCardElement.dataset.trId, }, ( response ) => { window.TastyRecipes.staticTooltip.changeMessage( response.data.message ); window.TastyRecipes.staticTooltip.show(); this.updateAverageText( response.data, recipeCardElement ); this.maybeFillCommentForm( response.data );
// Hide the tooltip after 5 seconds. setTimeout( () => { this.maybeResetTooltip( recipeCardElement, response.data, rating ); }, 5000 ); }, () => { this.resetTooltip( recipeCardElement ); } ); }, updateAverageText( data, recipeCardElement ) { if ( ! data.average ) { return; } this.setRatingPercent( data );
if ( ! data.count ) { return; }
const quickLink = document.querySelector( '.tasty-recipes-rating-link' ); if ( quickLink ) { this.setTextInContainer( quickLink, data ); this.setPartialStar( quickLink ); }
const cardStars = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); cardStars.dataset.trDefaultRating = data.average; this.setTextInContainer( recipeCardElement.querySelector( '.tasty-recipes-rating' ), data ); }, setTextInContainer( container, data ) { if ( ! container ) { return; }
if ( data.label ) { const ratingLabelElement = container.querySelector( '.rating-label' ); if ( ratingLabelElement ) { ratingLabelElement.innerHTML = data.label; } return; }
const averageElement = container.querySelector( '.average' ); if ( averageElement ) { averageElement.textContent = data.average; }
const countElement = container.querySelector( '.count' ); if ( countElement ) { countElement.textContent = data.count; } }, setPartialStar( container ) { const highestStar = container.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( highestStar ) { highestStar.dataset.trClip = this.currentRatingPercentage; } }, setRatingPercent( data ) { this.defaultRating = data.average.toFixed( 1 ); const parts = data.average.toFixed( 2 ).toString().split( '.' ); this.currentRatingPercentage = parts[1] ? parts[1] : 100; if ( this.currentRatingPercentage === '00' ) { this.currentRatingPercentage = 100; } }, setCheckedStar( target ) { const cardRatingContainer = target.closest( '.tasty-recipes-ratings-buttons' ); const selectedRatingElement = cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( selectedRatingElement ) { delete selectedRatingElement.dataset.trChecked; }
const thisStar = target.closest( '.tasty-recipes-rating' ); thisStar.dataset.trChecked = 1; thisStar.querySelector( '[data-tr-clip]' ).dataset.trClip = 100; }, maybeFillCommentForm( data ) { if ( ! data.comment || ! data.comment.content ) { return; }
const commentForm = document.querySelector( '#commentform' ); if ( ! commentForm ) { return; }
const commentBox = commentForm.querySelector( '[name=comment]' ); if ( ! commentBox || commentBox.value ) { return; }
// Add comment details for editing. commentBox.innerHTML = data.comment.content; if ( data.comment.name ) { commentForm.querySelector( '[name=author]' ).value = data.comment.name; commentForm.querySelector( '[name=email]' ).value = data.comment.email; } }, maybeResetTooltip( recipeCardElement, data, rating ) { if ( this.savingRating === rating ) { this.resetTooltip( recipeCardElement, data ); } }, resetTooltip( recipeCardElement, data ) { window.TastyRecipes.staticTooltip.destroy(); this.savingRating = false;
// Reset the default rating. const cardRatingContainer = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); if ( cardRatingContainer ) { this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating; cardRatingContainer.dataset.trDefaultRating = this.defaultRating;
this.resetSelectedStar( cardRatingContainer, data ); } }, resetSelectedStar( cardRatingContainer ) { const selectedRatingElement = cardRatingContainer.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( selectedRatingElement ) { selectedRatingElement.querySelector( '[data-tr-clip]' ).dataset.trClip = this.currentRatingPercentage; selectedRatingElement.parentNode.dataset.trChecked = 1; }
const previousSelectedElement= cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( previousSelectedElement ) { const currentSelectedRating = previousSelectedElement.querySelector('[data-rating]'); if ( currentSelectedRating !== selectedRatingElement ) { delete previousSelectedElement.dataset.trChecked; } } }, backwardCompFormRatingPosition() { const ratingsButtons = document.querySelector( '#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons' ); if ( ! ratingsButtons ) { return; } const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons); if ( ! ratingsButtonsStyles.display.includes( 'flex' ) ) { ratingsButtons.style.direction = 'rtl'; }
if ( typeof tastyRecipesRating !== 'undefined' ) { // Select the rating that was previously selected in admin. ratingsButtons.querySelector( '.tasty-recipes-rating[value="' + tastyRecipesRating + '"]' ).checked = true; }
const ratingSpans = ratingsButtons.querySelectorAll( '.tasty-recipes-rating' ); for (const ratingSpan of ratingSpans) { ratingSpan.addEventListener( 'click', event => { if ( ratingSpan === event.target ) { return; } ratingSpan.previousElementSibling.click(); } ); } } };
(function(callback) { if (document.readyState !== "loading") { callback(); } else { window.addEventListener( 'load', callback ); } })(() => { window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 ); });









