Convert HTML to Word

Demo: download button here for laptop and desktop Background There is an issue with Barrister Admission Bundle I have wanted to solve for some time. I wanted to make a website where users (pupil-barristers) could enter all required information at once, and then download a Word document. The Word document would have all the information in the right place. But it also needs to be modifiable (as users probably have their own style preferences)....

April 23, 2024

Promise(), not promise

Quick test: what do these code snippets do? const a = new Promise(function (a) { a }) const b = new Promise(function (b) { b("success") }) const c = new Promise(function (a, b) { b("failure") }) const d = Promise.resolve("success") const e = Promise.reject("failure") const f = new Promise(function (a, b) { a("success") b("failure") }) const g = new Promise(function (a, b) { b("failure") a("success") }) const h = new Promise(function (a, b) { throw new Error() }) const i = new Promise(function (a, b) { a() }) const j = new Promise(function (a, b) { b() }) const k = (number) => { return new Promise(function (a, b) { a(number * 2) }) } Check by opening the console in your browser and test with e....

April 3, 2024

object.property v. object[property]

I recently came across a situation where I was fetching information from a RESTful API. After some intermediate steps, I ended up with an array of objects, all of which have the same set of attribtues (e.g. including an id). I wanted to have a way of printing a list of ids of the objects, e.g. let attribute = id array.map(object => <li> object.attribute </li>) But this didn’t work. It took me a while before I realised what I needed is instead:...

March 31, 2024

Why both capture and bubble events in Javascript dom?

Historical accident The answer seems to be historical accident, not intentional design. Back in the old days, Netscape advocated event capturing, while Microsoft promoted event bubbling. Both are part of the W3C Document Object Model Events standard (2000). – Arun P Johny If this is correct, the events of the browser wars in the 1990s are still shaping Javavscript into the 2020s! In a way, this is unsurprising: backwards compatibility is important, which means features are often in a way that seem inelegant in hindsight....

March 30, 2024

Anonymous functions have no reference in memory

I ran into a small bug today. Following a tutorial, I added an anonymous function as the second argument to my window.addEventListener, i.e. window.addEventListener("popstate", () => console.log("hello world")) I then struggled to remove it with window.removeEventListener("popstate", () => console.log("hello world")) At first I tried to solve it with studying in detail the documentation for window.removeEventListener. But soon I changed track: how can I find out what Event Listeners there are in my DOM (or in my window object)?...

March 25, 2024

In Array.sort()’s compareFn, the order of a and b doesn't matter

MDN documentation on Array.prototype.sort() says of the the optional CompareFn, A function that determines the order of the elements. The function is called with the following arguments: a The first element for comparison. Will never be undefined. b The second element for comparison. Will never be undefined. It should return a number where: A negative value indicates that a should come before b. A positive value indicates that a should come after b....

March 24, 2024

Promises always return promises

I was trying to make a Promise object return an ordinary value (e.g. a number or a string), but failed. And then I realised that Promises are never intended to return values other than Promises. Otherwise how can one “chain” them with .thens? I can do what I wanted to do with this instead. // declare a variable without initialising it let newValue // declare and initialise a promise const myPromise = new Promise((resolve, reject) => { resolve("foo"); }); // assign the value of the resolved promise to the variable myPromise....

March 22, 2024