Tag Archives: CSS

HTML Oninvalid Event Form Validation Pattern setCustomValidity Tutorial

The recent HTML Oninvalid Event Form Validation Primer Tutorial taught us that … in the client (ie. HTML and Javascript and CSS) side of the web application wooooorrrrrlllllddd it is best to involve a form … as much as anything to get to involve … oninvalid event for a textbox or other user interaction HTML element … and today we do not involve with this … required attribute … opening the door, that way, to involving a textbox’s combination of … pattern attribute … <input type=”text” onblur=”document.getElementById(‘fsub’).click();” name=”integerlist” id=”integerlist” pattern=”[0-9,]*” value=”” placeholder=”Please enter a comma separated positive integer list” title=”Please enter a comma separated positive integer list”></input> setCustomValidity graphics … to inform of errors within an … oninvalid event Javascript function (set up at document.body.onload event Javascript function below) … function onl() { if ((” + location.hash) != ”) { document.getElementById(‘integerlist’).title=’Regarding your invalid entry of ‘ + decodeURIComponent(” + location.hash).replace(‘#’,”) + ‘, ‘ + (” + document.getElementById(‘integerlist’).placeholder).substring(0,1).toLowerCase() + (document.getElementById(‘integerlist’).placeholder + ‘ ‘).substring(1); } document.getElementById(‘integerlist’).value = location.search.split(‘integerlist=’)[1] ? decodeURIComponent(location.search.split(‘integerlist=’)[1].split(‘&’)[0]) : ”; document.getElementById(‘integerlist’).title = location.search.split(‘integerlist=’)[1] ? (‘Thanks for entering the valid “‘ + decodeURIComponent(location.search.split(‘integerlist=’)[1].split(‘&’)[0]) + ‘”‘).replace(‘Thanks for entering the valid “”‘, document.getElementById(‘integerlist’).placeholder) : document.getElementById(‘integerlist’).placeholder; document.getElementById(‘integerlist’).oninvalid = function(event) { retval=event.target.value; if (event.target.title.indexOf(‘, ‘) != -1) { event.target.title=document.event.target.placeholder; } event.target.setCustomValidity(‘Regarding your invalid entry of “‘ + retval + ‘”, ‘ + (” + event.target.title).substring(0,1).toLowerCase() + (event.target.title + ‘ ‘).substring(1)); event.target.title=(‘Regarding your invalid entry of “‘ + retval + ‘”, ‘ + (” + event.target.title).substring(0,1).toLowerCase() + (event.target.title + ‘ ‘).substring(1)); event.target.value=”; setTimeout(postonl, 5000); }; } function postonl() { document.getElementById(‘integerlist’).setCustomValidity(”); } … (for that textbox) … fired at the form onsubmit event (at which you should return false when there is an unacceptable error in the programmer’s eyes) … the purpose of today’s “proof of concept” pattern_test.html live run web application being to validate a textbox asking for “a comma separated list of positive integers” web application (that involves validation), and you can try below … Previous relevant HTML Oninvalid Event Form Validation Primer Tutorial is shown below. It’s good that there are such a variety of approaches with clientside HTML and Javascript and/or among serverside (eg. PHP, Perl, Python) components to your webpages that involve forms (because for yours truly it can seem soul destroying the way data can be in real life, asking for information off the user). You can leave it to the end of the client validation possibilities by using logic off the HTML form onsubmit event. Generally you’re leaving it to the very last opportunity if you leave it to the serverside languages. But, today, at the clientside (and read more about validation off HTML Worded Validation via Client Input or Regular Expression Tutorial below if you like), we’re exploring an earlier (only just) intervention than that of onsubmit, using the oninvalid event, as explained by W3schools … The oninvalid event occurs when a submittable <input> element is invalid. For example, … Continue reading →

Posted in eLearning, Event-Driven Programming, Tutorials | Tagged , , , , , , , , , , , | Leave a comment

CSS Countdown Table Tutorial

What the user is lacking working the web application of yesterday’s CSS Countdown Emoji Tutorial is a … means by which to spread horizontally … to supplement the pre-existant … means by which to spread vertically With pre-existant div elements nested, perhaps, by details elements can probably be arranged horizontally via some fancy CSS, but we’d prefer to use the more traditional … table … nesting a … single tr row element … nesting … one or more td cells nesting “pre-existant div elements nested, perhaps, by details elements” Just as with the details elements, the td cells will need to be sized as applicable (ie. if they nest img data via … <style> div:not(.nested)::after { content: var(–tooltip-string); } </style> ). For the user to implement this table functionality, they just need to prefix their textbox entry by a space character … // Inform users … placeholder=”Enter comma separated list (we’ + “‘” + ‘ll CSS countdown via counter & var) of sets of Title:ImageURL (two :: means do not use details/summary and space appended Title uses ~ else emojis used and space prefixed Title causes display in a table of one row of cells)” // … at form onsubmit (before recall) … if ((cbits[0] + ‘x’).substring(0,1) == ‘ ‘) { formo.innerHTML+='<input type=hidden name=table value=”y”></input>’; cbits[0]=cbits[0].substring(1); } // … on recall … var dotb=(location.search.split(‘table=’)[1] ? true : false); var dotbprefix=”, dotbsuffix=”; if (dotb) { dotbprefix='<td>’; dotbsuffix='</td>’; } // … later within recall … outval=dotbprefix.replace(‘>’, ‘ id=td’ + detcnt + ‘>’) + dodsprefix.replace(‘<details’, ‘<details id=det’ + detcnt).replace(‘>’, ‘ style=”background:linear-gradient(rgba(255,255,255,0.8),rgba(255,255,255,0.8)),url(‘ + dimgh(dwiurl) + ‘);background-repeat:no-repeat;background-position:0px 60px;”>’) + ‘<div class=nested style=”–tooltip-string:url(‘ + dwiurl.split(‘#’)[0] + ‘);”>’ + decodeURIComponent(inval).replace(/\+/g,’ ‘) + ‘</div>’ + dodsmiddle + dodssuffix + dotbsuffix; if (outval.indexOf(‘</td>’) != -1) { return ‘<table><tr>’ + outval + ‘</tr></table>’; } // as details element gets its height td gets that and width … if (document.getElementById(deto.id.replace(‘det’, ‘td’))) { document.getElementById(deto.id.replace(‘det’, ‘td’)).style.height=bigh; document.getElementById(deto.id.replace(‘det’, ‘td’)).style.minHeight=bigh; document.getElementById(deto.id.replace(‘det’, ‘td’)).style.width=bigw; } . And so, again, see this in action, via the changed css_count_image.html‘s live run. Previous relevant CSS Countdown Emoji Tutorial is shown below. A synopsis of the CSS highlights of the web application of yesterday’s CSS Countdown Reveal Tutorial are, so far … counter-increment counter-reset var (as in content: var(–tooltip-string);) … and today’s addition is … attr (as in content: attr(data-cnt);) … that “attr” (standing for attribute) causing an interplay to go on from the HTML (design) back to the CSS (styling) and back out to the HTML (design). The “attr” is also a reminder of the huge wooooorrrrlllllddd of Javascript global data attributes that awaits your imagination here, because though “attr” can point at the big attributes like “title” or “class” or “id” it can also point at your tailored global data attributes, turning on the intelligence of your HTML to be that little more like XML (invited into all the swankiest establishments, wooooohooo!) Today, we’re going to, as the default, … Continue reading →

Posted in eLearning, Event-Driven Programming, Tutorials | Tagged , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

CSS Countdown Emoji Tutorial

A synopsis of the CSS highlights of the web application of yesterday’s CSS Countdown Reveal Tutorial are, so far … counter-increment counter-reset var (as in content: var(–tooltip-string);) … and today’s addition is … attr (as in content: attr(data-cnt);) … that “attr” (standing for attribute) causing an interplay to go on from the HTML (design) back to the CSS (styling) and back out to the HTML (design). The “attr” is also a reminder of the huge wooooorrrrlllllddd of Javascript global data attributes that awaits your imagination here, because though “attr” can point at the big attributes like “title” or “class” or “id” it can also point at your tailored global data attributes, turning on the intelligence of your HTML to be that little more like XML (invited into all the swankiest establishments, wooooohooo!) Today, we’re going to, as the default, rewrite that kind of awkward ~[counter]~ div element content into emojis such as 1️⃣ … 2️⃣ … 3️⃣ etcetera etcetera etcetera. We do this by populating those div element user designed and introduced “data-cnt” global data attributes with the String.fromCodePoint() calls needed to be able to display those emojis via the CSS “attr” usage. CSS <style> div::before { counter-increment: the-final-countdown -1; //content: ‘~’ counter(the-final-countdown) ‘~’; content: attr(data-cnt); background: yellow; display: inline-block; width: 5rem; margin-right: 0.5rem; text-align: center; color: blue; } </style> Javascript (new onload function) function eonl() { var divsare=document.getElementsByTagName(‘div’), thiscontn=”, cdatac=”, ijk=0, cd=”;; for (var idivsare=0; idivsare<divsare.length; idivsare++) { thiscontn=” + eval(-idivsare + eval(-1 + divsare.length)); cdatac=”; for (ijk=0; ijk<thiscontn.length; ijk++) { // \000034\0020e3\000030\0020e3 //cdatac+=cd + String.fromCharCode(92) + (‘000’ + ‘000’ + thiscontn.substring(ijk, eval(1 + ijk))).slice(-6) + String.fromCharCode(92) + ‘0020e3’; if (document.URL.indexOf(‘noemoji=’) != -1 || divsare[idivsare].innerHTML.trim() != divsare[idivsare].innerHTML) { cdatac=’~’ + eval(1 + eval(” + thiscontn)) + ‘~’; } else { divsare[idivsare].title=’Click me for Google search’; divsare[idivsare].style.cursor=’pointer’; divsare[idivsare].onclick = function(evt){ window.open(‘//www.google.com/search?q=’ + encodeURIComponent(evt.target.innerHTML), ‘_blank’, ‘top=50,left=50,width=600,height=600′); }; cdatac+=cd + String.fromCodePoint(eval(eval(thiscontn.substring(ijk, eval(1 + ijk))) + 49), 65039, 8419); cd=’ ‘; } } //alert(thiscontn); divsare[idivsare].setAttribute(‘data-cnt’, cdatac); } } To, again, see this in action, see the changed css_count_image.html‘s live run. Previous relevant CSS Countdown Reveal Tutorial is shown below. To improve on yesterday’s CSS Countdown Primer Tutorial we thought it would be good to give the user a chance to see as much above the fold as possible, and then “reveal” the larger images via details/summary element combinations. We started testing all this out with larger images where the details/summary helps a lot, but as you will see with today’s animated GIF presentation even if the user shapes to use a details/summary (one : colon scenario) for a smaller (like thumbnail) image we now map that back to the original (two colon :: scenario) CSS content method where it displays better. To know how to “size” the details element, we need to know the height and width of the image it will “house”, and that can be achieved in “midair”, so to speak, … Continue reading →

Posted in eLearning, Event-Driven Programming, Tutorials | Tagged , , , , , , , , , , , , , , , , , , , , | Leave a comment

CSS Countdown Reveal Tutorial

To improve on yesterday’s CSS Countdown Primer Tutorial we thought it would be good to give the user a chance to see as much above the fold as possible, and then “reveal” the larger images via details/summary element combinations. We started testing all this out with larger images where the details/summary helps a lot, but as you will see with today’s animated GIF presentation even if the user shapes to use a details/summary (one : colon scenario) for a smaller (like thumbnail) image we now map that back to the original (two colon :: scenario) CSS content method where it displays better. To know how to “size” the details element, we need to know the height and width of the image it will “house”, and that can be achieved in “midair”, so to speak, via Javascript code like … function dimgh(selem) { var img = document.createElement(‘img’); img.onload = function() { //alert((” + img.height).replace(‘px’,”) + ‘px’); var hashbits=img.src.split(‘#’); if (hashbits.length > 1) { if (document.getElementById(‘ilist’)) { if (eval((” + img.height).replace(‘px’,”))

Posted in eLearning, Event-Driven Programming, Tutorials | Tagged , , , , , , , , , , , , , , , | Leave a comment

CSS Countdown Primer Tutorial

It’s not normally a talent you associate with CSS, the ability to do any maths, but you can count (or increment/decrement) with it, with styling like … <style> #myspan { counter-reset: the-final-countdown var(–tooltip-string); line-height: 2; } div::before { counter-increment: the-final-countdown -1; content: “~” counter(the-final-countdown) “~”; background: yellow; display: inline-block; width: 20rem; margin-right: 0.5rem; text-align: center; } div::after { content: var(–tooltip-string); } </style> … and did you see above it can work with variables as another Javascript type talent? As a Javascript coder knows, once you have variables to play with, they can represent other useful things. Let’s establish a CSS variable via (HTML like) … <span id=myspan style=”–tooltip-string:12;”></span> … then that “12” gets substituted so that … <style> #myspan { counter-reset: the-final-countdown 12; line-height: 2; } </style> … and more adventurously we can use Javascript such as … function thisdecodeURIComponent(inname, inval) { var outval=decodeURIComponent(inval), dwiurl=”; if (inval != ”) { icnt=eval(inname.replace(‘dw’,”)); dwiurl=(location.search.split(inname.replace(‘dw’, ‘di’) + ‘=’)[1] ? decodeURIComponent(location.search.split(inname.replace(‘dw’, ‘di’) + ‘=’)[1].split(‘&’)[0]) : ”); if (dwiurl != ”) { outval='<div style=”–tooltip-string:url(‘ + dwiurl + ‘);”>’ + inval + ‘</div>’; } else { outval='<div>’ + inval + ‘</div>’; } spanstr=”<span id=myspan style=’–tooltip-string:” + icnt + “;’><h1>CSS counter via var</h1><h3>RJM Programming – February, 2021</h3><h4>Thanks to <a target=_blank title=’https://css-tricks.com/valid-css-content/’ href=’https://css-tricks.com/valid-css-content/’>https://css-tricks.com/valid-css-content/</a></h4></span>”; icnt++; while (inval != ”) { inval=(location.search.split(‘dw’ + icnt + ‘=’)[1] ? decodeURIComponent(location.search.split(‘dw’ + icnt + ‘=’)[1].split(‘&’)[0]) : ”); if (inval != ”) { spanstr=”<span id=myspan style=’–tooltip-string:” + icnt + “;’><h1>CSS counter via var</h1><h3>RJM Programming – February, 2021</h3><h4>Thanks to <a target=_blank title=’https://css-tricks.com/valid-css-content/’ href=’https://css-tricks.com/valid-css-content/’>https://css-tricks.com/valid-css-content/</a></h4></span>”; inname=’dw’ + icnt; dwiurl=(location.search.split(inname.replace(‘dw’, ‘di’) + ‘=’)[1] ? decodeURIComponent(location.search.split(inname.replace(‘dw’, ‘di’) + ‘=’)[1].split(‘&’)[0]) : ”); if (dwiurl != ”) { outval+='<div style=”–tooltip-string:url(‘ + dwiurl + ‘);”>’ + inval + ‘</div>’; } else { outval+='<div>’ + inval + ‘</div>’; } } icnt++; } } return outval; } … to get CSS to display an image via a CSS variable associated with a particular “CSS “counter” instance (if you will). Cute, huh?! Thanks to https://css-tricks.com/valid-css-content/, see how this can work in practice with today’s “proof of concept” css_count_image.html‘s live run … If this was interesting you may be interested in this too.

Posted in eLearning, Tutorials | Tagged , , , , , , , , , | Leave a comment

Javascript document.querySelector One Element Tutorial

Yes, adding a functionality layer on top of the recent Javascript document.querySelectorAll Share and Save Tutorial we turn our attention from document.querySelectorAll to … as well as a full scan of a CSS selection, allow for the honing in onto a particular element the order of which is nominated by the user … begs the question … Is there a document.querySelectorFirst? No. Is there a document.querySelector? Yes (it returns first matched element). Do we use it to achieve today’s blog post aims? Oddly, no. Do we use CSS :nth-of-type([userNumber]) or :nth-child([userNumber]) or :first-of-type CSS pseudo classes? No (it’s a long story). Those CSS pseudo classes only suit predictable nested element arrangements such as with ul/li or ol/li or table/tr/th/td types of HTML data. We settled on a less quirky (but one that tees in nicely with our general principle that an element ID attribute suits Javascript and an element CLASS suits CSS) solution, but a possible one because our style and script can be dynamic and be helped out by each other … CSS Was Becomes img { BORDER-radius:20% border: 1px dotted magenta; } .bodyimg { BORDER-radius:20% border: 1px dotted magenta; } Javascript (in broad brush terms) Was Becomes Use document.querySelectorAll( ‘img’ ) resultant list to further process user requirements. Still use document.querySelectorAll(‘img’) resultant list (and as required only process “All” or the matching order of element) and make sure in a matching element’s “class” attribute bodyimg appears, in order to further process user requirements. And so yet again, with the changed qsall.js external Javascript helping out this changed qsall.htm‘s live run link you can try these functionalities yourself. Previous relevant Javascript document.querySelectorAll Share and Save Tutorial is shown below. On top of yesterday’s Javascript document.querySelectorAll Textarea Placeholder Tutorial today’s progress concerns … sharing (via client email and sms applications) … email sms save (via window.localStorage) … that has user controls, those being three input type=button for creation and one select (dropdown) element for recall, added into the main H1 header element. Along the way, we’ve hived off the following into a new external Javascript qsall.js because we may see some/all of them as worthy of a “tool” that can be called in other web applications, perhaps … user definable Javascript scripting (interfacing) email sms save (via window.localStorage) … in a first draft genericization push. Yet again, using this changed qsall.htm‘s live run link you can try these functionalities yourself. Previous relevant Javascript document.querySelectorAll Textarea Placeholder Tutorial is shown below. Thinking of some great Fred and Ginger types of web application partners we have, at the very least … HTML and Javascript PHP and MySql MySql and phpMyAdmin Ajax and FormData Webpage and Iframe Details and Summary Div and Contenteditable … and today we’ve partnered Textarea and Placeholder because we’ve discovered that Placeholder (on many browsers and platforms) can be multiline by nature. That suits our style, whereby we try … Continue reading →

Posted in eLearning, Event-Driven Programming, Tutorials | Tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Javascript document.querySelectorAll Share and Save Tutorial

On top of yesterday’s Javascript document.querySelectorAll Textarea Placeholder Tutorial today’s progress concerns … sharing (via client email and sms applications) … email sms save (via window.localStorage) … that has user controls, those being three input type=button for creation and one select (dropdown) element for recall, added into the main H1 header element. Along the way, we’ve hived off the following into a new external Javascript qsall.js because we may see some/all of them as worthy of a “tool” that can be called in other web applications, perhaps … user definable Javascript scripting (interfacing) email sms save (via window.localStorage) … in a first draft genericization push. Yet again, using this changed qsall.htm‘s live run link you can try these functionalities yourself. Previous relevant Javascript document.querySelectorAll Textarea Placeholder Tutorial is shown below. Thinking of some great Fred and Ginger types of web application partners we have, at the very least … HTML and Javascript PHP and MySql MySql and phpMyAdmin Ajax and FormData Webpage and Iframe Details and Summary Div and Contenteditable … and today we’ve partnered Textarea and Placeholder because we’ve discovered that Placeholder (on many browsers and platforms) can be multiline by nature. That suits our style, whereby we try not to bombard users with loads of user entries to have to worry about in web applications, where that is at all possible, but rather resort to intelligent user interaction, often based on delimiters, encouraging the one piece (or perhaps two or three pieces) of information to fill in. Today’s progress (added to that of yesterday’s Javascript document.querySelectorAll User Scripting Tutorial) concerns that user interaction design to our “Testing Out document.querySelectorAll” web application is to … replace single line input type=text element with textarea element … and … replace single line advice in a single line placeholder attribute with a multiline placeholder “blurb” which includes an example … and, speaking personally, the relief is incredible, as we have had to grapple with the awkwardness of user entry for days now! We even styled the placeholder thanks to the advice at W3schools, thanks. And then we thought we’d allow the user to set the example bit of the placeholder as a “starter” for their real entry via a “two times click on the textarea” set of (on document onload event) logic as per … function onl(injs) { if (document.getElementById(‘myinput’)) { if (document.getElementById(‘myinput’).outerHTML.indexOf(‘<textarea’) != -1) { var egis=String.fromCharCode(10) + String.fromCharCode(10) + ” Example (2xClick) of Einstein Wikipedia Webpage with rounded magenta images and lightblue heading … ” + String.fromCharCode(10) + String.fromCharCode(10) + “http://www.wikipedia.org/wiki/Einstein” + String.fromCharCode(10) + “` img { ” + String.fromCharCode(10) + ” BORDER-radius:20%; ” + String.fromCharCode(10) + ” border: 1px dotted magenta; ” + String.fromCharCode(10) + ” } `” + String.fromCharCode(10) + ” function fhlb() {” + String.fromCharCode(10) + ” document.getElementById(” + ‘”‘ + “firstHeading” + ‘”‘ + “).style.backgroundColor=” + ‘”‘ + “lightblue” + ‘”‘ + “; ” + String.fromCharCode(10) … Continue reading →

Posted in eLearning, Event-Driven Programming, Tutorials | Tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Javascript document.querySelectorAll Textarea Placeholder Tutorial

Thinking of some great Fred and Ginger types of web application partners we have, at the very least … HTML and Javascript PHP and MySql MySql and phpMyAdmin Ajax and FormData Webpage and Iframe Details and Summary Div and Contenteditable … and today we’ve partnered Textarea and Placeholder because we’ve discovered that Placeholder (on many browsers and platforms) can be multiline by nature. That suits our style, whereby we try not to bombard users with loads of user entries to have to worry about in web applications, where that is at all possible, but rather resort to intelligent user interaction, often based on delimiters, encouraging the one piece (or perhaps two or three pieces) of information to fill in. Today’s progress (added to that of yesterday’s Javascript document.querySelectorAll User Scripting Tutorial) concerns that user interaction design to our “Testing Out document.querySelectorAll” web application is to … replace single line input type=text element with textarea element … and … replace single line advice in a single line placeholder attribute with a multiline placeholder “blurb” which includes an example … and, speaking personally, the relief is incredible, as we have had to grapple with the awkwardness of user entry for days now! We even styled the placeholder thanks to the advice at W3schools, thanks. And then we thought we’d allow the user to set the example bit of the placeholder as a “starter” for their real entry via a “two times click on the textarea” set of (on document onload event) logic as per … function onl(injs) { if (document.getElementById(‘myinput’)) { if (document.getElementById(‘myinput’).outerHTML.indexOf(‘<textarea’) != -1) { var egis=String.fromCharCode(10) + String.fromCharCode(10) + ” Example (2xClick) of Einstein Wikipedia Webpage with rounded magenta images and lightblue heading … ” + String.fromCharCode(10) + String.fromCharCode(10) + “http://www.wikipedia.org/wiki/Einstein” + String.fromCharCode(10) + “` img { ” + String.fromCharCode(10) + ” BORDER-radius:20%; ” + String.fromCharCode(10) + ” border: 1px dotted magenta; ” + String.fromCharCode(10) + ” } `” + String.fromCharCode(10) + ” function fhlb() {” + String.fromCharCode(10) + ” document.getElementById(” + ‘”‘ + “firstHeading” + ‘”‘ + “).style.backgroundColor=” + ‘”‘ + “lightblue” + ‘”‘ + “; ” + String.fromCharCode(10) + ” } ” + String.fromCharCode(10) + ” setTimeout(fhlb, 2000); ” + String.fromCharCode(10); document.getElementById(‘myinput’).placeholder=document.getElementById(‘myinput’).placeholder.replace(/\|\ /g, String.fromCharCode(10)).replace(‘ # or ` separate’, ‘ # or ` or first line feed separate’).replace(‘ # or ` and’, ‘ # or ` or first line feed and’) + egis; document.getElementById(‘myinput’).ondblclick = function(event){ ccnt=0; if (event.target.placeholder.indexOf(‘http’) != -1) { event.target.value=’http’ + event.target.placeholder.split(‘http’)[1]; } }; document.getElementById(‘myinput’).onclick = function(event){ ccnt++; if (ccnt >= 2) { ccnt=0; if (event.target.placeholder.indexOf(‘http’) != -1) { event.target.value=’http’ + event.target.placeholder.split(‘http’)[1]; } } }; } else { document.getElementById(‘myinput’).placeholder=document.getElementById(‘myinput’).placeholder.replace(/\|\ /g, ”); } } if (injs.trim() != ”) { var tag = document.createElement(‘script’); tag.type=’text/javascript’; tag.src=’data:text/javascript;base64,’ + btoa(injs); document.head.appendChild(tag); } } Again, using this changed qsall.htm‘s live run link you can test this out for yourself. Previous relevant Javascript document.querySelectorAll User Scripting Tutorial is shown below. Another user … Continue reading →

Posted in eLearning, Event-Driven Programming, Tutorials | Tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment