{"id":47479,"date":"2019-12-24T03:01:28","date_gmt":"2019-12-23T17:01:28","guid":{"rendered":"http:\/\/www.rjmprogramming.com.au\/ITblog\/?p=47479"},"modified":"2019-12-23T18:21:25","modified_gmt":"2019-12-23T08:21:25","slug":"user-controlled-dynamic-javascript-youtube-embedded-api-ajax-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/user-controlled-dynamic-javascript-youtube-embedded-api-ajax-tutorial\/","title":{"rendered":"User Controlled Dynamic Javascript YouTube Embedded API Ajax Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"User Controlled Dynamic Javascript YouTube Embedded API Ajax Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version_ajax.jpg\" title=\"User Controlled Dynamic Javascript YouTube Embedded API Ajax Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">User Controlled Dynamic Javascript YouTube Embedded API Ajax Tutorial<\/p><\/div>\n<p>Around here we have our favourite Javascript and PHP function names.  And in that list, the Javascript &#8220;ajaxit([argument1])&#8221; features strongly and commonly.  <strike>After reaching below the sink <\/strike>After talking excitedly to the kitchen taps about my plans <font size=2>&#8230; oddly, receiving no reply <\/font><font size=1>&#8230; probably because it&#8217;s a Monday here <\/font><font size=2>&#8230; we expect &#8230;<\/font> we use that Javascript client Ajax approach that can do for you what you would often call on a serverside language, like PHP, to do?!  <a target=_blank title='?' href='https:\/\/www.youtube.com\/watch?v=uhiCFdWeQfA'>Anyone, anyone?<\/a>  No, <a target=_blank title='?' href='https:\/\/en.wikipedia.org\/wiki\/Barbara_Woodhouse'>Barbara Woodhouse<\/a>, we do not <strike>w<\/strike>release the <a target=_blank title='' href='https:\/\/www.google.com\/search?rlz=1C5CHFA_enAU832AU832&#038;sxsrf=ACYBGNSyRD7B4RSZAg-emjuN_GjL7sFi9A%3A1577070309859&#038;ei=5S4AXpeSNN2F4-EPxbq5oAM&#038;q=tap+dancing+dog&#038;oq=tap+dancing+dog&#038;gs_l=psy-ab.3..35i39j0j0i30j0i8i30.2004.2004..2302...0.2..0.242.242.2-1......0....1..gws-wiz.......0i71.22jPVaEGIkk&#038;ved=0ahUKEwjXmOvc5MrmAhXdwjgGHUVdDjQQ4dUDCAs&#038;uact=5'>tap dancing dogs<\/a> on Mondays &#8230; ever &#8230; any more serious suggestions please?   Yes, <a target=_blank title='' href='https:\/\/en.wikipedia.org\/wiki\/Jesse_James_Garrett'>Jesse James Garrett<\/a> it&#8217;s interesting your blurtings include &#8230;<\/p>\n<blockquote cite=''><p>\nthe asynchronous technology behind emerging services like Google Maps and Google Suggest, as well as the resulting user experience which made it possible to browse without interruption by eliminating the reloading of the whole page\n<\/p><\/blockquote>\n<p> &#8230; though I&#8217;d like you to run a plagorism checker on all &#8220;blurtings&#8221; and &#8220;lerts&#8221; for the next lesson please.<\/p>\n<p>Yes, under certain conditions, <a target=_blank title='Ajax information from Wikipedia ... thanks' href='http:\/\/en.wikipedia.org\/wiki\/Ajax_%28programming%29'>Ajax<\/a> (methodologies) can retrieve information and not have to leave what you are interacting with on the current webpage, to do this.<\/p>\n<p>Can you imagine how we might apply this with our current project?   Yes, patently not everyone is in the mood for &#8220;Disco&#8221;, especially on the first draft way back when, when we allowed sound to happen before a decently &#8220;flagged&#8221; button press to forewarn &#8230; a fairly big &#8220;Internet sin&#8221;, since fixed.  And so, we now add HTML input textbox (ie.type=text) element, with <i>onblur<\/i> event &#8220;ajaxit([argument1])&#8221; logic (passing across the textbox&#8217;s value) as per &#8230;<\/p>\n<p><code><br \/>\nvar zhr=null;<br \/>\nvar url='';<br \/>\nvar zok=0;<br \/>\n<br \/>\nfunction ajaxit(qsel) {<br \/>\n  if (qsel != '') {<br \/>\n   url=\"\/\/www.rjmprogramming.com.au\/HTMLCSS\/legend_via_map.php?url=\" + encodeURIComponent(\"http:\/\/www.youtube.com\/results?search_query=\" + encodeURIComponent(qsel));<br \/>\n   if (!zhr) {<br \/>\n     zhr = getXMLHttpRequest();<br \/>\n   }<br \/>\n<br \/>\n   if (zhr != null) {<br \/>\n    zhr = zhr;<br \/>\n   } else {<br \/>\n    try {<br \/>\n     zhr = new ActiveXObject(\"Msxml2.XMLHTTP\");<br \/>\n    } catch (othermicrosoft) {<br \/>\n     try {<br \/>\n      zhr = new ActiveXObject(\"Microsoft.XMLHTTP\");<br \/>\n     } catch (failed) {<br \/>\n      zhr = false;<br \/>\n     }<br \/>\n    }<br \/>\n   }<br \/>\n<br \/> <br \/>\n   if (zhr) {<br \/>\n     if (url != '') {<br \/>\n     zok=0;<br \/>\n     zhr.open(\"GET\", url, true);<br \/>\n     zhr.onreadystatechange = showStuff;<br \/>\n     zhr.send(null);<br \/>\n     url='';<br \/>\n     }<br \/>\n   } else {<br \/>\n     zok = 1; \/\/alert(\"Sorry ... no XMLHttpRequest possible\");<br \/>\n   }<br \/>\n  }<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; to add new concepts into the mix of option (sub)elements offered off that aforesaid mentioned (multiple selection mode) dropdown (of YouTube videos).  As an optional &#8220;off default workflow&#8221; piece of functionality we show it prominently (above the fold) now, as well as &#8220;below the fold&#8221; where the dropdown is positioned on the webpage of <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html---GETME\" title=\"disco_version.html\">the Ajax changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html---GETME\" title=\"disco_version.html\">disco_version.html<\/a>&#8216;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html\" title=\"Click picture\">live run<\/a>.<\/p>\n<p>Adding to yesterday&#8217;s <a title='User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial' href='#ucdjyteapiot'>User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial<\/a> &#8230;<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/user-controlled-dynamic-javascript-youtube-embedded-api-ajax-tutorial\/'>User Controlled Dynamic Javascript YouTube Embedded API Ajax Tutorial<\/a>.<\/p-->\n<hr>\n<p id='ucdjyteapiot'>Previous relevant <a target=_blank title='User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/user-controlled-dynamic-javascript-youtube-embedded-api-ordered-tutorial\/'>User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.jpg\" title=\"User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial<\/p><\/div>\n<p>We think that whenever you &#8230;<\/p>\n<ul>\n<li>deprive many people of &#8220;order&#8221; in their lives &#8230; they&#8217;ll crave for (and maybe seek out) &#8220;order&#8221; &#8230; and when you &#8230;<\/li>\n<li>deprive many people of &#8220;randomosity&#8221; in their lives &#8230; they&#8217;ll crave for (and maybe seek out) &#8220;randomosity&#8221;<\/li>\n<\/ul>\n<p> &#8230; and so we see a mix of both in a web application as an advantage.  Today, for the first time we can remember, extending onto yesterday&#8217;s <a title='User Controlled Dynamic Javascript YouTube Embedded API Tutorial' href='#ucdjyteapit'>User Controlled Dynamic Javascript YouTube Embedded API Tutorial<\/a> functionality, definitely lacking some &#8220;order&#8221; we feel, we&#8217;ve allowed a &#8230;<\/p>\n<ul>\n<li>select &#8220;dropdown&#8221; element &#8230;<\/li>\n<li>multiple mode &#8230; have its &#8230;<\/li>\n<li>button press &#8220;finish of selections&#8221; event logic &#8230;<br \/>\n<code><br \/>\nfunction process(bsin) {<br \/>\n  var jj=0, mbo='', mlist='', mdelim='', vscnt=0;<br \/>\n  var sin=document.getElementById(bsin.id.replace('b','s'));<br \/>\n  for (var i=0; i&lt;sin.options.length; i++) {<br \/>\n    if (sin.options[i].selected) {<br \/>\n      if (sin.options[i].value != '') {<br \/>\n       jj++;<br \/>\n       vscnt++;<br \/>\n       mbo=sin.options[i].value.split('|')[0];<br \/>\n       mlist+=mdelim + sin.options[i].value.split('|')[0];<br \/>\n       mdelim=',';<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n  if (jj == 1) {<br \/>\n    location.href=(document.URL.split('#')[0].replace('mustbeone=','mustxxxbeone=') + '&mustbeone=' + encodeURIComponent(mbo)).replace('.html&','.html?').replace('.htm&','.htm?').replace('.php&','.php?').replace('\/&','\/?');<br \/>\n  } else if (jj &gt; 1) {<br \/>\n    if (oclickcnt == vscnt) { mlist=olist; }<br \/>\n    location.href=(document.URL.split('#')[0].replace('mustbeone=','mustxxxbeone=').replace('videolist=','videoxxxlist=') + '&videolist=' + encodeURIComponent(mlist)).replace('.html&','.html?').replace('.htm&','.htm?').replace('.php&','.php?').replace('\/&','\/?');<br \/>\n  }<br \/>\n  oclickcnt=0;<br \/>\n  occ=[];<br \/>\n  olist='';<br \/>\n  odelim='';<br \/>\n}<br \/>\n<\/code>\n<\/li>\n<li>take into account the order the user clicked select element option elements &#8230;<br \/>\n<code><br \/>\n    var oclickcnt=0;<br \/>\n    var occ=[];<br \/>\n    var olist='';<br \/>\n    var odelim='';<br \/>\n<br \/>\n      function oclick(opto) {<br \/>\n       oclickcnt++;<br \/>\n       olist+=odelim + opto.id.split('|')[0];<br \/>\n       odelim=',';<br \/>\n      }<br \/>\n<\/code><br \/>\n &#8230; option element onclick event Javascript event logic&#8230; so long as &#8230;<\/li>\n<li>these two or more clicks\/touches on option elements (via their onclick event logics) (total in) number (to) the same (total) as the final number of options selected (ie. most &#8220;shift&#8221; key arrangement selections cannot be catered for in this logic, but totally &#8220;ctrl&#8221; (Windows) \/ &#8220;command&#8221; (macOS) key may work)<\/li>\n<\/ul>\n<p> &#8230; allowing for the user to control the video list, and its order.<\/p>\n<p>And on non-mobile platforms, we allow for a natural &#8220;sequencing&#8221; of play, once the first video is played and unmuted.  That way, on non-mobile, <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html--GETME\" title=\"disco_version.html\">your changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html--GETME\" title=\"disco_version.html\">disco_version.html<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html\" title=\"Click picture\">live run<\/a> web application can act like a continuous (radio like) &#8220;stream&#8221; of music.  Even so, on non-mobile, a user can &#8220;pause&#8221; a video, and start another via their own user actions, and the &#8220;stream&#8221; sequencing will change to fit in with the changed arrangements.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/user-controlled-dynamic-javascript-youtube-embedded-api-ordered-tutorial\/'>User Controlled Dynamic Javascript YouTube Embedded API Ordered Tutorial<\/a>.<\/p-->\n<hr>\n<p id='ucdjyteapit'>Previous relevant <a target=_blank title='User Controlled Dynamic Javascript YouTube Embedded API Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/user-controlled-dynamic-javascript-youtube-embedded-api-tutorial\/'>User Controlled Dynamic Javascript YouTube Embedded API Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"User Controlled Dynamic Javascript YouTube Embedded API Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.gif\" title=\"User Controlled Dynamic Javascript YouTube Embedded API Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">User Controlled Dynamic Javascript YouTube Embedded API Tutorial<\/p><\/div>\n<p>The recent <a title='Dynamic Javascript and the YouTube Embedded API Tutorial' href='#djyteapit'>Dynamic Javascript and the YouTube Embedded API Tutorial<\/a> showed the great <a target=_blank title='YouTube IFrame Player API' href='https:\/\/developers.google.com\/youtube\/iframe_api_reference'>YouTube IFrame Player API<\/a> in action, including <font size=1>&#8230; and this dovetails well into today&#8217;s work &#8230;<\/font> no advertisements.<\/p>\n<p>A lot of us will know how great <a target=_blank href='\/\/youtube.com' title='YouTube'>YouTube<\/a> playlists are.  Today, we offer a(n example of) &#8230;<\/p>\n<ul>\n<li>an up to 9 &#8220;Disco Version&#8221; random array of <a target=_blank href='\/\/youtube.com' title='YouTube'>YouTube<\/a> videos that can be played ina session &#8230;<\/li>\n<li>from a possible array of 24 table cell slots (10-24 not shown, but &#8220;duration&#8221;able behind the scenes) &#8230;<\/li>\n<li>the 15 not randomly picked available to the user in a dropdown selection they can, optionally &#8230;\n<ol>\n<li>pick one from,click a &#8220;Shuffle&#8221; button, and a randomized list of 8 others is headedby your selected video &#8230; or &#8230;<\/li>\n<li>pick more than one and the first (up to 9) forms your ordered selection of playable videos<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<p> &#8230; and the progress today leaves you controlling when to play the videos, yourself, clicking <a target=_blank href='\/\/youtube.com' title='YouTube'>YouTube<\/a> play buttons to make that happen.<\/p>\n<p>Enjoy the <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html-GETME\" title=\"disco_version.html-GETME\">&#8220;how we got there&#8221;<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html-GETME\" title=\"disco_version.html-GETME\">disco_version.html<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/disco_version.html\" title=\"Click picture\">upbeat disco selection live run<\/a> link.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/user-controlled-dynamic-javascript-youtube-embedded-api-tutorial\/'>\"User Controlled Dynamic Javascript YouTube Embedded API Tutorial<\/a>.<\/p-->\n<hr>\n<p id='djyteapit'>Previous relevant <a target=_blank title='Dynamic Javascript and the YouTube Embedded API Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/dynamic-javascript-and-the-youtube-embedded-api-tutorial\/'>Dynamic Javascript and the YouTube Embedded API Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/dynamic_js.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Dynamic Javascript and the YouTube Embedded API Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/msgtw.jpg\" title=\"Dynamic Javascript and the YouTube Embedded API Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Dynamic Javascript and the YouTube Embedded API Tutorial<\/p><\/div>\n<p>Webpages without Javascript are generally pretty static and boring.  Javascript is that dynamic client addition to webpage functionality, but perhaps you only think of it as that statically written part of the webpage unable to be reloaded into effect after that initial webpage load.  Well, that is not taking into account Javascript such as &#8230;<\/p>\n<p><code><br \/>\n&lt;script&gt;<br \/>\n      var tag = document.<a target=_blank title='Javascript createElement method information from w3schools' href='https:\/\/www.w3schools.com\/jsref\/met_document_createelement.asp'>createElement<\/a>('script');<br \/>\n      tag.src = \"https:\/\/www.youtube.com\/iframe_api\";<br \/>\n      var firstScriptTag = document.getElementsByTagName('script')[0];<br \/>\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);<br \/>\n&lt;\/script&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; taken from the excellent <a target=_blank title='YouTube IFrame Player API' href='https:\/\/developers.google.com\/youtube\/iframe_api_reference'>YouTube IFrame Player API<\/a> we really like to use around here to embed and control <a target=_blank title='YouTube' href='https:\/\/youtube.com'>YouTube<\/a> videos embedded into an HTML <a target=_blank title='HTML iframe element information from w3schools' href='http:\/\/www.w3schools.com\/tags\/tag_iframe.asp'>iframe<\/a> element.<\/p>\n<p>In today&#8217;s small extension of that we load nine such HTML iframe embedded YouTube videos into a 3&#215;3 grid.  We resisted the previous <a target=_blank title='External Javascript Genericity Follow Up Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/external-javascript-genericity-follow-up-tutorial\/'>Brady Bunch usage<\/a> of such an arrangement (perhaps you&#8217;ll be sad to hear?!) in favour of showing you a &#8220;collage&#8221; of video snippets from one of my favourite films ever, <a target=_blank title='Mr Smith Goes to Washington' href='https:\/\/en.wikipedia.org\/wiki\/Mr._Smith_Goes_to_Washington'>Mr Smith Goes to Washington<\/a>.<\/p>\n<p>We hope the HTML and Javascript <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/dynamic_js.html_GETME\" title=\"dynamic_js.html\">dynamic_js.html<\/a>&#8216;s code will be food for thought, that you can test for yourself at this <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/dynamic_js.html\" title=\"Click picture\">live run<\/a> link.<\/p>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d37921' onclick='var dv=document.getElementById(\"d37921\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/javascript\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d37921' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d47460' onclick='var dv=document.getElementById(\"d47460\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/music\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d47460' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d47470' onclick='var dv=document.getElementById(\"d47470\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/order\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d47470' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d47479' onclick='var dv=document.getElementById(\"d47479\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/ajax\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d47479' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Around here we have our favourite Javascript and PHP function names. And in that list, the Javascript &#8220;ajaxit([argument1])&#8221; features strongly and commonly. After reaching below the sink After talking excitedly to the kitchen taps about my plans &#8230; oddly, receiving &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/user-controlled-dynamic-javascript-youtube-embedded-api-ajax-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,12,14,37],"tags":[69,88,211,2957,2539,367,2091,1683,576,3163,652,861,2273,2076,2362,1110,1866,1895,3167,1891,1369,2017],"class_list":["post-47479","post","type-post","status-publish","format-standard","hentry","category-ajax","category-elearning","category-event-driven-programming","category-tutorials","tag-ajax","tag-api","tag-click","tag-concept","tag-createelement","tag-dropdown","tag-duration","tag-dynamic","tag-html","tag-interaction","tag-javascript","tag-onclick","tag-option","tag-order","tag-play","tag-search","tag-select","tag-sequence","tag-topic","tag-user","tag-video","tag-youtube-api"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/47479"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=47479"}],"version-history":[{"count":5,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/47479\/revisions"}],"predecessor-version":[{"id":47484,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/47479\/revisions\/47484"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=47479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=47479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=47479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}