<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=JavaScript</id>
	<title>JavaScript - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=JavaScript"/>
	<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=JavaScript&amp;action=history"/>
	<updated>2026-05-06T10:27:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://entorb.net//wiki/index.php?title=JavaScript&amp;diff=5191&amp;oldid=prev</id>
		<title>Torben: /* ignore Test Coverage for missing else etc */</title>
		<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=JavaScript&amp;diff=5191&amp;oldid=prev"/>
		<updated>2025-03-24T06:00:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;ignore Test Coverage for missing else etc&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Coding]]&lt;br /&gt;
===Basics===&lt;br /&gt;
Load after html loading via defer&lt;br /&gt;
 &amp;lt;script src=&amp;quot;main.js&amp;quot; defer&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Form Elements====&lt;br /&gt;
Function of button click&lt;br /&gt;
 &amp;lt;button id=&amp;quot;submit&amp;quot; onclick=&amp;quot;myFunction()&amp;quot;&amp;gt;Anmelden&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Function on enter&lt;br /&gt;
 &amp;lt;input type=&amp;quot;number&amp;quot; id=&amp;quot;threshold&amp;quot; name=&amp;quot;threshold&amp;quot; min=&amp;quot;50&amp;quot; max=&amp;quot;500&amp;quot; step=&amp;quot;1&amp;quot; value=&amp;quot;300&amp;quot;&amp;gt;&lt;br /&gt;
 var input_threshold = document.getElementById(&amp;quot;threshold&amp;quot;);&lt;br /&gt;
     input_threshold.addEventListener(&amp;quot;keydown&amp;quot;, function (e) {&lt;br /&gt;
       // Enter is pressed&lt;br /&gt;
       if (e.keyCode === 13) {&lt;br /&gt;
         event.preventDefault();&lt;br /&gt;
         myFunction();&lt;br /&gt;
       }&lt;br /&gt;
     }, false); &lt;br /&gt;
&lt;br /&gt;
===Variables===&lt;br /&gt;
Declaration&lt;br /&gt;
 const var = 123; // constant: no change possible&lt;br /&gt;
 let var = 123;   // block-bound, perferred to var&lt;br /&gt;
 var var = 123;   // old style, better use let instead&lt;br /&gt;
&lt;br /&gt;
Clone/Copy Object&lt;br /&gt;
 // from https://www.samanthaming.com/tidbits/70-3-ways-to-clone-objects/&lt;br /&gt;
 const myObject2 = Object.assign({}, myObject);&lt;br /&gt;
&lt;br /&gt;
====Arrays====&lt;br /&gt;
Loop over all elements&lt;br /&gt;
 var rows = table.getRows();&lt;br /&gt;
 for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
     var row = rows[i];&lt;br /&gt;
     ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Loop over array of objects&lt;br /&gt;
 for (let i = 0; i &amp;lt; Object.keys(array).length; i++) {&lt;br /&gt;
   const key = Object.keys(array)[i];&lt;br /&gt;
   const value = array[key];&lt;br /&gt;
 }&lt;br /&gt;
 NOTE: do not use&lt;br /&gt;
 for (const key in array) { ... }&lt;br /&gt;
 as this results in this problem&lt;br /&gt;
 &amp;quot;The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Element in Array&lt;br /&gt;
 if(myArray.indexOf(myItem) &amp;gt; -1) {...}&lt;br /&gt;
&lt;br /&gt;
Last element of array&lt;br /&gt;
 my_data.slice(-1)[0]&lt;br /&gt;
or&lt;br /&gt;
 my_data.slice(-1)[0][&amp;quot;myKey&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
=====Array of Objects=====&lt;br /&gt;
delete some object properties&lt;br /&gt;
 // delete not needed object properties&lt;br /&gt;
 const allowedKeys = new Set([&amp;quot;type&amp;quot;, &amp;quot;name&amp;quot;, &amp;quot;x_date&amp;quot;, &amp;quot;x_url&amp;quot;, ...Object.keys(measures)]);&lt;br /&gt;
 data.forEach((obj) =&amp;gt; {&lt;br /&gt;
   Object.entries(obj).forEach(([key]) =&amp;gt; {&lt;br /&gt;
     if (!allowedKeys.has(key)) {&lt;br /&gt;
       delete obj[key];&lt;br /&gt;
     }&lt;br /&gt;
   });&lt;br /&gt;
   // extract year from x_date and add as property&lt;br /&gt;
   obj.year = parseInt(obj.x_date.substr(0, 4));&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Extract distinct list/set list for property &amp;#039;type&amp;#039; values&lt;br /&gt;
 const act_types = [...new Set(data.map((obj) =&amp;gt; obj.type))].sort();&lt;br /&gt;
&lt;br /&gt;
Sort by object property &amp;quot;measure&amp;quot; DESC&lt;br /&gt;
 data = data.sort((a, b) =&amp;gt; b[measure] - a[measure]);&lt;br /&gt;
&lt;br /&gt;
===Async fetching via JQuery===&lt;br /&gt;
in HTML&lt;br /&gt;
 &amp;lt;script src=&amp;quot;lib/jquery-3.5.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
in JS&lt;br /&gt;
 // array of promises for async fetching&lt;br /&gt;
 const promises = [];&lt;br /&gt;
 &lt;br /&gt;
 // ref dictionary to be fetched: Country Code -&amp;gt; Country Name&lt;br /&gt;
 var mapCountryNames = {};&lt;br /&gt;
 &lt;br /&gt;
 // fetch countries-latest-all.json containing country reference data like code and continent&lt;br /&gt;
 function fetch_mapRefCountryData(mapCountryNames) {&lt;br /&gt;
     const url =&lt;br /&gt;
         &amp;quot;https://entorb.net/COVID-19-coronavirus/data/int/countries-latest-all.json&amp;quot;;&lt;br /&gt;
     return $.getJSON(url, function (data) {&lt;br /&gt;
         console.log(&amp;quot;success: mapCountryNames&amp;quot;);&lt;br /&gt;
     })&lt;br /&gt;
         .done(function (data) {&lt;br /&gt;
             console.log(&amp;quot;done: mapCountryNames&amp;quot;);&lt;br /&gt;
             $.each(data, function (key, val) {&lt;br /&gt;
                 mapCountryNames[data[key].Code] = data[key].Country;&lt;br /&gt;
             });&lt;br /&gt;
         })&lt;br /&gt;
         .fail(function () {&lt;br /&gt;
             console.log(&amp;quot;fail: mapCountryNames&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Start the async fetching &lt;br /&gt;
 promises.push(fetch_mapRefCountryData(mapCountryNames, mapContinentCountries));&lt;br /&gt;
 &lt;br /&gt;
 // Wait for all async promises to be done (all data is fetched), then print message&lt;br /&gt;
 Promise.all(promises).then(function () {&lt;br /&gt;
     console.log(&amp;quot;All data fetched&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Date handling==&lt;br /&gt;
 // calculate date via offset&lt;br /&gt;
 const daysOffset = 7;&lt;br /&gt;
 const s_data_last_date = &amp;quot;2020-04-01&amp;quot;&lt;br /&gt;
 const ts_last_date = Date.parse(s_data_last_date)&lt;br /&gt;
 var minDate = new Date(ts_last_date);&lt;br /&gt;
 minDate.setDate(minDate.getDate() + daysOffset);&lt;br /&gt;
&lt;br /&gt;
==Helper Functions==&lt;br /&gt;
from [https://love2dev.com/blog/javascript-remove-from-array/&lt;br /&gt;
 function arrayRemove(arr, value) {&lt;br /&gt;
   return arr.filter(function (ele) { return ele != value; });&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
from [https://stackoverflow.com/posts/3364546/timeline]&lt;br /&gt;
 function removeAllOptionsFromSelect(select) {&lt;br /&gt;
   var i, L = select.options.length - 1;&lt;br /&gt;
   for (i = L; i &amp;gt;= 0; i--) {&lt;br /&gt;
     select.remove(i);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Formats value &amp;quot;Something_Is_HERE&amp;quot; to &amp;quot;Something is here&amp;quot; like sentence&lt;br /&gt;
 // value: The value to format&lt;br /&gt;
 // separator: the separator string between words&lt;br /&gt;
 function formatValueToSentenceLike(value, separator) {&lt;br /&gt;
   const allLowerCaseValue = value.split(separator).join(&amp;quot; &amp;quot;).toLowerCase();&lt;br /&gt;
   return allLowerCaseValue[0].toUpperCase() + allLowerCaseValue.substr(1);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // modifies array of objects by removing if value == keys&lt;br /&gt;
 function arrayRemoveValueTextPairByValue(arr, key) {&lt;br /&gt;
   for (let i = arr.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
     if (arr[i].value == key) { arr.splice(i, 1); }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Local Storage==&lt;br /&gt;
 // read browser&amp;#039;s local storage for last session data&lt;br /&gt;
 localStorageData = window.localStorage.getItem(&amp;quot;my_data&amp;quot;);&lt;br /&gt;
 if (localStorageData) {&lt;br /&gt;
     var my_data = JSON.parse(localStorageData);&lt;br /&gt;
 } else {&lt;br /&gt;
     var my_data = [];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Export and Import / Download and Upload data to Variable==&lt;br /&gt;
HTML&lt;br /&gt;
 &amp;lt;a id=&amp;quot;downloadAnchor&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
 &amp;lt;button id=&amp;quot;download_data&amp;quot; onclick=&amp;quot;download_data()&amp;quot;&amp;gt;Export&amp;lt;/button&amp;gt; and Import: &amp;lt;input id=&amp;quot;upload_data&amp;quot; type=&amp;quot;file&amp;quot; onchange=&amp;quot;upload_data(this)&amp;quot;&amp;gt;&lt;br /&gt;
JS&lt;br /&gt;
 // download data&lt;br /&gt;
 function download_data() {&lt;br /&gt;
     const dataStr = &amp;quot;data:text/json;charset=utf-8,&amp;quot; + encodeURIComponent(JSON.stringify([settings, data]));&lt;br /&gt;
     let html_dl_anchor = document.getElementById(&amp;quot;downloadAnchor&amp;quot;);&lt;br /&gt;
     html_dl_anchor.setAttribute(&amp;quot;href&amp;quot;, dataStr);&lt;br /&gt;
     html_dl_anchor.setAttribute(&amp;quot;download&amp;quot;, &amp;quot;eta.json&amp;quot;);&lt;br /&gt;
     html_dl_anchor.click();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // upload data&lt;br /&gt;
 function upload_data(input) {&lt;br /&gt;
     // from https://javascript.info/file&lt;br /&gt;
     let file = input.files[0];&lt;br /&gt;
     let reader = new FileReader();&lt;br /&gt;
     reader.readAsText(file);&lt;br /&gt;
     reader.onload = function () {&lt;br /&gt;
         const uploaded_data = JSON.parse(reader.result);&lt;br /&gt;
         settings = uploaded_data[0];&lt;br /&gt;
         data = uploaded_data[1];&lt;br /&gt;
     };&lt;br /&gt;
     reader.onerror = function () {&lt;br /&gt;
         console.log(reader.error);&lt;br /&gt;
     };&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Hide/remove HTML elements==&lt;br /&gt;
HTML&lt;br /&gt;
 &amp;lt; div id=&amp;quot;text_intro&amp;quot; &amp;gt;...&amp;lt; /div &amp;gt;&lt;br /&gt;
JS&lt;br /&gt;
 function hide_intro() {&lt;br /&gt;
     // from https://stackoverflow.com/questions/1070760/javascript-href-vs-onclick-for-callback-function-on-hyperlink&lt;br /&gt;
     const html_text_intro = document.getElementById(&amp;#039;text_intro&amp;#039;);&lt;br /&gt;
     html_text_intro.remove();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Internet Explorer Backward Compatibility==&lt;br /&gt;
====Error: Object doesn&amp;#039;t support property or method &amp;#039;includes&amp;#039;====&lt;br /&gt;
variant 1:&lt;br /&gt;
&lt;br /&gt;
replace:&lt;br /&gt;
 if(myarray.includes(key)) {&lt;br /&gt;
by:&lt;br /&gt;
 if(myarray.indexOf(key) &amp;gt; -1) {&lt;br /&gt;
&lt;br /&gt;
variant 2: polyfile&lt;br /&gt;
 if (!String.prototype.includes) {&lt;br /&gt;
   String.prototype.includes = function(search, start) {&lt;br /&gt;
     &amp;#039;use strict&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
     if (search instanceof RegExp) {&lt;br /&gt;
       throw TypeError(&amp;#039;first argument must not be a RegExp&amp;#039;);&lt;br /&gt;
     } &lt;br /&gt;
     if (start === undefined) { start = 0; }&lt;br /&gt;
     return this.indexOf(search, start) !== -1;&lt;br /&gt;
   };&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Tabulator==&lt;br /&gt;
 // wait for tableBuilt event&lt;br /&gt;
 table.on(&amp;quot;tableBuilt&amp;quot;, function () {&lt;br /&gt;
     myUpdateTableFnc();&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
==eCharts==&lt;br /&gt;
&lt;br /&gt;
==Jest Unittests==&lt;br /&gt;
install jest and jsdom for testing browser features like window.localStorage&lt;br /&gt;
 npm install --save-dev jest jest-environment-jsdom&lt;br /&gt;
in package.json set&lt;br /&gt;
 &amp;quot;scripts&amp;quot;: {&amp;quot;test&amp;quot;: &amp;quot;jest --coverage&amp;quot;,&amp;quot;testc&amp;quot;: &amp;quot;jest --coverage&amp;quot;},&lt;br /&gt;
 &amp;quot;jest&amp;quot;: { &amp;quot;testEnvironment&amp;quot;: &amp;quot;jsdom&amp;quot; }&lt;br /&gt;
run jest&lt;br /&gt;
 npm test&lt;br /&gt;
 npm run testc&lt;br /&gt;
&lt;br /&gt;
In the file I want to test here `helper.js`&lt;br /&gt;
 var module = module || {};&lt;br /&gt;
 module.exports = {&lt;br /&gt;
   zeroPad,&lt;br /&gt;
 ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The testcasefile `helper.test.js`&lt;br /&gt;
 describe(&amp;quot;Testing zeroPad&amp;quot;, () =&amp;gt; {&lt;br /&gt;
  const { zeroPad } = require(&amp;quot;./helper&amp;quot;);&lt;br /&gt;
   test(&amp;quot;1-&amp;gt;01&amp;quot;, () =&amp;gt; {&lt;br /&gt;
     expect(zeroPad(1, 2)).toEqual(&amp;quot;01&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
===test.each===&lt;br /&gt;
To test many cases use&lt;br /&gt;
 describe(&amp;quot;zeroPad()&amp;quot;, () =&amp;gt; {&lt;br /&gt;
   const { zeroPad } = require(&amp;quot;./helper&amp;quot;);&lt;br /&gt;
   const cases = [&lt;br /&gt;
     // arg1, arg2, expectedResult&lt;br /&gt;
     [1, 2, &amp;quot;01&amp;quot;],&lt;br /&gt;
     [6, 3, &amp;quot;006&amp;quot;],&lt;br /&gt;
   ];&lt;br /&gt;
   test.each(cases)(&lt;br /&gt;
     &amp;quot;given &amp;#039;%p&amp;#039;, &amp;#039;%p&amp;#039; it shall return %p&amp;quot;,&lt;br /&gt;
     (arg1, arg2, expectedResult) =&amp;gt; {&lt;br /&gt;
       expect(zeroPad(arg1, arg2)).toEqual(expectedResult);&lt;br /&gt;
     }&lt;br /&gt;
   );&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
===ignore Test Coverage for missing else etc===&lt;br /&gt;
place such a comment before the non-relevant line&lt;br /&gt;
 /* istanbul ignore else */&lt;br /&gt;
 /* istanbul ignore next */&lt;br /&gt;
&lt;br /&gt;
==Translations / i18n==&lt;br /&gt;
 const supportedLanguages = [&amp;#039;de&amp;#039;, &amp;#039;en&amp;#039;, &amp;#039;fr&amp;#039;]&lt;br /&gt;
 const langBrowser = navigator.language.slice(0, 2)&lt;br /&gt;
 const lang = supportedLanguages.includes(langBrowser) ? langBrowser : &amp;#039;en&amp;#039;&lt;br /&gt;
 const messages = await import(`./locales/${lang}.json`).catch(() =&amp;gt; import(&amp;#039;./locales/en.&lt;/div&gt;</summary>
		<author><name>Torben</name></author>
	</entry>
</feed>