From 5f6fb3a3d8c03b386966e22d86a131ca5ac1e549 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 21 Dec 2022 00:06:26 +0100 Subject: [PATCH] Remove most of our jQuery usage. This actually costs us 3 kB of (uncompressed) code in index.html, since we still have the entire dependency on board. But the aim is to get rid of jQuery entirely. --- www/js/remoteglot.js | 255 +++++++++++++++++++++++-------------------- 1 file changed, 135 insertions(+), 120 deletions(-) diff --git a/www/js/remoteglot.js b/www/js/remoteglot.js index 7245407..687b484 100644 --- a/www/js/remoteglot.js +++ b/www/js/remoteglot.js @@ -289,6 +289,7 @@ var request_update = function() { // Aborted because we are switching backends. Abandon and don't retry, // because another one is already started for us. } else { + console.log(err); handle_err(err); } }) @@ -504,20 +505,20 @@ var position_arrow = function(arrow) { return; } - var zoom_factor = $("#board").width() / 400.0; + var zoom_factor = document.getElementById("board").getBoundingClientRect().width / 400.0; var line_width = arrow.line_width * zoom_factor; var arrow_size = arrow.arrow_size * zoom_factor; - var square_width = $(".square-a8").width(); + var square_width = document.querySelector(".square-a8").getBoundingClientRect().width; var pos, from_y, to_y, from_x, to_x; if (board.orientation() === 'black') { - pos = $(".square-h1").position(); + pos = document.querySelector(".square-h1").getBoundingClientRect(); // FIXME: margin? from_y = (arrow.from_row + 0.5)*square_width; to_y = (arrow.to_row + 0.5)*square_width; from_x = (7 - arrow.from_col + 0.5)*square_width; to_x = (7 - arrow.to_col + 0.5)*square_width; } else { - pos = $(".square-a8").position(); + pos = document.querySelector(".square-a8").getBoundingClientRect(); // FIXME: margin? from_y = (7 - arrow.from_row + 0.5)*square_width; to_y = (7 - arrow.to_row + 0.5)*square_width; from_x = (arrow.from_col + 0.5)*square_width; @@ -527,8 +528,8 @@ var position_arrow = function(arrow) { var SVG_NS = "http://www.w3.org/2000/svg"; var XHTML_NS = "http://www.w3.org/1999/xhtml"; var svg = document.createElementNS(SVG_NS, "svg"); - svg.setAttribute("width", /** @type{number} */ ($("#board").width())); - svg.setAttribute("height", /** @type{number} */ ($("#board").height())); + svg.setAttribute("width", /** @type{number} */ (document.getElementById("board").getBoundingClientRect().width)); + svg.setAttribute("height", /** @type{number} */ (document.getElementById("board").getBoundingClientRect().height)); svg.setAttribute("style", "position: absolute"); svg.setAttribute("position", "absolute"); svg.setAttribute("version", "1.1"); @@ -571,7 +572,9 @@ var position_arrow = function(arrow) { head.setAttribute("fill", arrow.fg_color); svg.appendChild(head); - $(svg).css({ top: pos.top, left: pos.left, 'pointer-events': 'none' }); + svg.style.top = pos.top; + svg.style.left = pos.left; + svg.style.pointerEvents = 'none'; document.body.appendChild(svg); arrow.svg = svg; } @@ -792,21 +795,21 @@ var print_pv = function(line_num, splicepos, opt_limit, opt_showlast) { * Based on the global "highlight_from" and "highlight_to" variables. */ var update_board_highlight = function() { - $("#board").find('.square-55d63').removeClass('nonuglyhighlight'); + document.getElementById("board").querySelector('.square-55d63').classList.remove('nonuglyhighlight'); if ((current_display_line === null || current_display_line_is_history) && highlight_from !== undefined && highlight_to !== undefined) { - $("#board").find('.square-' + highlight_from).addClass('nonuglyhighlight'); - $("#board").find('.square-' + highlight_to).addClass('nonuglyhighlight'); + document.getElementById("board").querySelector('.square-' + highlight_from).classList.add('nonuglyhighlight'); + document.getElementById("board").querySelector('.square-' + highlight_to).classList.add('nonuglyhighlight'); } } var update_history = function() { if (display_lines[0] === null || display_lines[0].pv.length == 0) { - $("#history").html("No history"); + document.getElementById("history").innerHTML = "No history"; } else if (truncate_display_history) { - $("#history").html(print_pv(0, null, 8, true)); + document.getElementById("history").innerHTML = print_pv(0, null, 8, true); } else { - $("#history").html( + document.getElementById("history").html( '(collapse) ' + print_pv(0, null)); } @@ -833,8 +836,8 @@ var update_refutation_lines = function() { // Truncate so that only the history and PV is left. display_lines = [ display_lines[0], display_lines[1] ]; } - var tbl = $("#refutationlines"); - tbl.empty(); + var tbl = document.getElementById("refutationlines"); + tbl.replaceChildren(); if (display_lines.length < 2) { return; @@ -867,55 +870,55 @@ var update_refutation_lines = function() { var move_td = document.createElement("td"); tr.appendChild(move_td); - $(move_td).addClass("move"); + move_td.classList.add("move"); var scores = base_scores.concat([{ first_move: start_display_move_num, score: line['score'] }]); if (line['pv'].length == 0) { // Not found, so just make a one-move PV. var move = "" + line['move'] + ""; - $(move_td).html(move); + move_td.innerHTML = move; var score_td = document.createElement("td"); - $(score_td).addClass("score"); - $(score_td).text("—"); + score_td.classList.add("score"); + score_td.textContent = "—"; tr.appendChild(score_td); var depth_td = document.createElement("td"); tr.appendChild(depth_td); - $(depth_td).addClass("depth"); - $(depth_td).text("—"); + depth_td.classList.add("depth"); + depth_td.textContent = "—"; var pv_td = document.createElement("td"); tr.appendChild(pv_td); - $(pv_td).addClass("pv"); - $(pv_td).html(add_pv(base_fen, base_line.concat([ line['move'] ]), move_num, toplay, scores, start_display_move_num)); + pv_td.classList.add("pv"); + pv_td.innerHTML = add_pv(base_fen, base_line.concat([ line['move'] ]), move_num, toplay, scores, start_display_move_num); tbl.append(tr); continue; } var move = "" + line['move'] + ""; - $(move_td).html(move); + move_td.innerHTML = move; var score_td = document.createElement("td"); tr.appendChild(score_td); - $(score_td).addClass("score"); - $(score_td).text(format_short_score(line['score'])); + score_td.classList.add("score"); + score_td.textContent = format_short_score(line['score']); var depth_td = document.createElement("td"); tr.appendChild(depth_td); - $(depth_td).addClass("depth"); + depth_td.classList.add("depth"); if (line['depth'] && line['depth'] >= 0) { - $(depth_td).text("d" + line['depth']); + depth_td.textContent = "d" + line['depth']; } else { - $(depth_td).text("—"); + depth_td.textContent = "—"; } var pv_td = document.createElement("td"); tr.appendChild(pv_td); - $(pv_td).addClass("pv"); - $(pv_td).html(add_pv(base_fen, base_line.concat(line['pv']), move_num, toplay, scores, start_display_move_num, 10)); + pv_td.classList.add("pv"); + pv_td.innerHTML = add_pv(base_fen, base_line.concat(line['pv']), move_num, toplay, scores, start_display_move_num, 10); tbl.append(tr); } @@ -950,7 +953,7 @@ var chess_from = function(fen, moves, last_move) { } var update_game_list = function(games) { - $("#games").text(""); + document.getElementById("games").textContent = ""; if (games === null) { return; } @@ -1098,33 +1101,33 @@ var update_board = function() { // when e.g. viewing history, so if any of these changed during the game, // use the current one still. if (current_data['using_lomonosov']) { - $("#lomonosov").show(); + document.getElementById("lomonosov").style.display = null; } else { - $("#lomonosov").hide(); + document.getElementById("lomonosov").style.display = 'none'; } // Credits: The engine name/version. if (current_data['engine'] && current_data['engine']['name'] !== null) { - $("#engineid").text(current_data['engine']['name']); + document.getElementById("engineid").textContent = current_data['engine']['name']; } // Credits: The engine URL. if (current_data['engine'] && current_data['engine']['url']) { - $("#engineid").attr("href", current_data['engine']['url']); + document.getElementById("engineid").setAttribute("href", current_data['engine']['url']); } else { - $("#engineid").removeAttr("href"); + document.getElementById("engineid").removeAttribute("href"); } // Credits: Engine details. if (current_data['engine'] && current_data['engine']['details']) { - $("#enginedetails").text(" (" + current_data['engine']['details'] + ")"); + document.getElementById("enginedetails").textContent = " (" + current_data['engine']['details'] + ")"; } else { - $("#enginedetails").text(""); + document.getElementById("enginedetails").textContent = ""; } // Credits: Move source, possibly with URL. if (current_data['move_source'] && current_data['move_source_url']) { - $("#movesource").text("Moves provided by "); + document.getElementById("movesource").textContent = "Moves provided by "; var movesource_a = document.createElement("a"); movesource_a.setAttribute("href", current_data['move_source_url']); var movesource_text = document.createTextNode(current_data['move_source']); @@ -1133,9 +1136,9 @@ var update_board = function() { document.getElementById("movesource").appendChild(movesource_a); document.getElementById("movesource").appendChild(movesource_period); } else if (current_data['move_source']) { - $("#movesource").text("Moves provided by " + current_data['move_source'] + "."); + document.getElementById("movesource").textContent = "Moves provided by " + current_data['move_source'] + "."; } else { - $("#movesource").text(""); + document.getElementById("movesource").textContent = ""; } var last_move; @@ -1167,7 +1170,7 @@ var update_board = function() { } else { last_move = null; } - $("#headline").text(headline); + document.getElementById("headline").textContent = headline; // The contains a very brief headline. var title_elems = []; @@ -1206,13 +1209,13 @@ var update_board = function() { update_board_highlight(); if (data['failed']) { - $("#score").text("No analysis for this move"); - $("#pvtitle").text("PV:"); - $("#pv").empty(); - $("#searchstats").html(" "); - $("#refutationlines").empty(); - $("#whiteclock").empty(); - $("#blackclock").empty(); + document.getElementById("score").textContent = "No analysis for this move"; + document.getElementById("pvtitle").textContent = "PV:"; + document.getElementById("pv").replaceChildren(); + document.getElementById("searchstats").innerHTML = " "; + document.getElementById("refutationlines").replaceChildren(); + document.getElementById("whiteclock").replaceChildren(); + document.getElementById("blackclock").replaceChildren(); refutation_lines = []; update_refutation_lines(); clear_arrows(); @@ -1235,19 +1238,19 @@ var update_board = function() { } } if (score) { - $("#score").text(format_long_score(score)); + document.getElementById("score").textContent = format_long_score(score); } else { - $("#score").text("No score for this line"); + document.getElementById("score").textContent = "No score for this line"; } } else if (data['score']) { - $("#score").text(format_long_score(data['score'])); + document.getElementById("score").textContent = format_long_score(data['score']); } // The search stats. if (data['searchstats']) { - $("#searchstats").html(data['searchstats']); + document.getElementById("searchstats").innerHTML = data['searchstats']; } else if (data['tablebase'] == 1) { - $("#searchstats").text("Tablebase result"); + document.getElementById("searchstats").textContent = "Tablebase result"; } else if (data['nodes'] && data['nps'] && data['depth']) { var stats = thousands(data['nodes']) + ' nodes, ' + thousands(data['nps']) + ' nodes/sec, depth ' + data['depth'] + ' ply'; if (data['seldepth']) { @@ -1261,9 +1264,9 @@ var update_board = function() { } } - $("#searchstats").text(stats); + document.getElementById("searchstats").textContent = stats; } else { - $("#searchstats").text(""); + document.getElementById("searchstats").textContent = ""; } // Update the board itself. @@ -1271,10 +1274,10 @@ var update_board = function() { update_displayed_line(); // Print the PV. - $("#pvtitle").text("PV:"); + document.getElementById("pvtitle").textContent = "PV:"; var scores = [{ first_move: -1, score: data['score'] }]; - $("#pv").html(add_pv(data['position']['fen'], data['pv'], data['position']['move_num'], data['position']['toplay'], scores, 0)); + document.getElementById("pv").innerHTML = add_pv(data['position']['fen'], data['pv'], data['position']['move_num'], data['position']['toplay'], scores, 0); // Update the PV arrow. clear_arrows(); @@ -1379,7 +1382,7 @@ var update_sparkline = function(data) { // #scoresparkcontainer) on Chrome for mobile seems to start off // at something very small, and then suddenly snap back into place. // Figure out why. - var max_moves = Math.floor($("#scoresparkcontainer").width() / 5) - 5; + var max_moves = Math.floor(document.getElementById("scoresparkcontainer").getBoundingClientRect().width / 5) - 5; if (last_move_num - first_move_num > max_moves) { first_move_num = last_move_num - max_moves; } @@ -1403,7 +1406,7 @@ var update_sparkline = function(data) { // FIXME: at some widths, calling sparkline() seems to push // #scorecontainer under the board. $('#scorespark').unbind('sparklineClick'); - $("#scorespark").sparkline(scores, { + $('#scorespark').sparkline(scores, { type: 'bar', zeroColor: 'gray', chartRangeMin: min_score, @@ -1423,10 +1426,10 @@ var update_sparkline = function(data) { } }); } else { - $("#scorespark").text(""); + document.getElementById("scorespark").textContent = ""; } } else { - $("#scorespark").text(""); + document.getElementById("scorespark").textContent = ""; } } @@ -1449,7 +1452,7 @@ var update_num_viewers = function(num_viewers) { text += " | 50-move rule: " + counter; } } - $("#numviewers").text(text); + document.getElementById("numviewers").textContent = text; } var update_clock = function() { @@ -1461,24 +1464,24 @@ var update_clock = function() { if (data['position']) { var result = data['position']['result']; if (result === '1-0') { - $("#whiteclock").text("1"); - $("#blackclock").text("0"); - $("#whiteclock").removeClass("running-clock"); - $("#blackclock").removeClass("running-clock"); + document.getElementById("whiteclock").textContent = "1"; + document.getElementById("blackclock").textContent = "0"; + document.getElementById("whiteclock").classList.remove("running-clock"); + document.getElementById("blackclock").classList.remove("running-clock"); return; } if (result === '1/2-1/2') { - $("#whiteclock").text("1/2"); - $("#blackclock").text("1/2"); - $("#whiteclock").removeClass("running-clock"); - $("#blackclock").removeClass("running-clock"); + document.getElementById("whiteclock").textContent = "1/2"; + document.getElementById("blackclock").textContent = "1/2"; + document.getElementById("whiteclock").classList.remove("running-clock"); + document.getElementById("blackclock").classList.remove("running-clock"); return; } if (result === '0-1') { - $("#whiteclock").text("0"); - $("#blackclock").text("1"); - $("#whiteclock").removeClass("running-clock"); - $("#blackclock").removeClass("running-clock"); + document.getElementById("whiteclock").textContent = "0"; + document.getElementById("blackclock").textContent = "1"; + document.getElementById("whiteclock").classList.remove("running-clock"); + document.getElementById("blackclock").classList.remove("running-clock"); return; } } @@ -1498,15 +1501,15 @@ var update_clock = function() { var color; if (data['position']['white_clock_target']) { color = "white"; - $("#whiteclock").addClass("running-clock"); - $("#blackclock").removeClass("running-clock"); + document.getElementById("whiteclock").classList.add("running-clock"); + document.getElementById("blackclock").classList.remove("running-clock"); } else if (data['position']['black_clock_target']) { color = "black"; - $("#whiteclock").removeClass("running-clock"); - $("#blackclock").addClass("running-clock"); + document.getElementById("whiteclock").classList.remove("running-clock"); + document.getElementById("blackclock").classList.add("running-clock"); } else { - $("#whiteclock").removeClass("running-clock"); - $("#blackclock").removeClass("running-clock"); + document.getElementById("whiteclock").classList.remove("running-clock"); + document.getElementById("blackclock").classList.remove("running-clock"); } var remaining_ms; if (color) { @@ -1520,8 +1523,8 @@ var update_clock = function() { } if (white_clock_ms === null || black_clock_ms === null) { - $("#whiteclock").empty(); - $("#blackclock").empty(); + document.getElementById("whiteclock").replaceChildren(); + document.getElementById("blackclock").replaceChildren(); return; } @@ -1540,8 +1543,8 @@ var update_clock = function() { clock_timer = setTimeout(update_clock, next_update_ms); } - $("#whiteclock").text(format_clock(white_clock_ms, show_seconds)); - $("#blackclock").text(format_clock(black_clock_ms, show_seconds)); + document.getElementById("whiteclock").textContent = format_clock(white_clock_ms, show_seconds); + document.getElementById("blackclock").textContent = format_clock(black_clock_ms, show_seconds); } /** @@ -1762,6 +1765,7 @@ var update_historic_analysis = function() { // Aborted because we are switching backends. Abandon and don't retry, // because another one is already started for us. } else { + console.log(err); handle_err(); } }); @@ -1800,8 +1804,8 @@ var update_imbalance = function(fen) { black_imbalance += '<img src="' + svg_pieces['w' + piece.toUpperCase()] + '" alt="" style="width: 15px;height: 15px;" class="imbalance-inverted-piece">'; } } - $('#whiteimbalance').html(white_imbalance); - $('#blackimbalance').html(black_imbalance); + document.getElementById('whiteimbalance').innerHTML = white_imbalance; + document.getElementById('blackimbalance').innerHTML = black_imbalance; } /** Mark the currently selected move in red. @@ -1810,24 +1814,26 @@ var update_imbalance = function(fen) { */ var update_move_highlight = function() { if (highlighted_move !== null) { - highlighted_move.removeClass('highlight'); + highlighted_move.classList.remove('highlight'); } if (current_display_line) { var display_line_num = find_display_line_matching_num(); if (display_line_num === null) { // Replace the PV with the (complete) line. - $("#pvtitle").text("Exploring:"); + document.getElementById("pvtitle").textContent = "Exploring:"; current_display_line.start_display_move_num = 0; display_lines.push(current_display_line); - $("#pv").html(print_pv(display_lines.length - 1, null)); // FIXME + document.getElementById("pv").innerHTML = print_pv(display_lines.length - 1, null); // FIXME display_line_num = display_lines.length - 1; // Clear out the PV, so it's not selected by anything later. display_lines[1].pv = []; } - highlighted_move = $("#automove" + display_line_num + "-" + (current_display_move - current_display_line.start_display_move_num)); - highlighted_move.addClass('highlight'); + highlighted_move = document.getElementById("automove" + display_line_num + "-" + (current_display_move - current_display_line.start_display_move_num)); + if (highlighted_move !== null) { + highlighted_move.classList.add('highlight'); + } } } @@ -1865,26 +1871,26 @@ var find_display_line_matching_num = function() { */ var update_displayed_line = function() { if (current_display_line === null) { - $("#linenav").hide(); - $("#linemsg").show(); + document.getElementById("linenav").style.display = 'none'; + document.getElementById("linemsg").style.display = 'revert'; display_fen = base_fen; set_board_position(base_fen); update_imbalance(base_fen); return; } - $("#linenav").show(); - $("#linemsg").hide(); + document.getElementById("linenav").style.display = 'revert'; + document.getElementById("linemsg").style.display = 'none'; if (current_display_move <= 0) { - $("#prevmove").html("Previous"); + document.getElementById("prevmove").innerHTML = "Previous"; } else { - $("#prevmove").html("<a href=\"javascript:prev_move();\">Previous</a></span>"); + document.getElementById("prevmove").innerHTML = "<a href=\"javascript:prev_move();\">Previous</a></span>"; } if (current_display_move == current_display_line.pv.length - 1) { - $("#nextmove").html("Next"); + document.getElementById("nextmove").innerHTML = "Next"; } else { - $("#nextmove").html("<a href=\"javascript:next_move();\">Next</a></span>"); + document.getElementById("nextmove").innerHTML = "<a href=\"javascript:next_move();\">Next</a></span>"; } var hiddenboard = chess_from(current_display_line.start_fen, current_display_line.pv, current_display_move); @@ -1913,8 +1919,8 @@ var set_board_position = function(new_fen) { var set_sound = function(param_enable_sound) { enable_sound = param_enable_sound; if (enable_sound) { - $("#soundon").html("<strong>On</strong>"); - $("#soundoff").html("<a href=\"javascript:set_sound(false)\">Off</a>"); + document.getElementById("soundon").innerHTML = "<strong>On</strong>"; + document.getElementById("soundoff").innerHTML = "<a href=\"javascript:set_sound(false)\">Off</a>"; // Seemingly at least Firefox prefers MP3 over Opus; tell it otherwise, // and also preload the file since the user has selected audio. @@ -1924,8 +1930,8 @@ var set_sound = function(param_enable_sound) { ding.load(); } } else { - $("#soundon").html("<a href=\"javascript:set_sound(true)\">On</a>"); - $("#soundoff").html("<strong>Off</strong>"); + document.getElementById("soundon").innerHTML = "<a href=\"javascript:set_sound(true)\">On</a>"; + document.getElementById("soundoff").innerHTML = "<strong>Off</strong>"; } if (supports_html5_storage()) { localStorage['enable_sound'] = enable_sound ? 1 : 0; @@ -1945,7 +1951,7 @@ var explore_hash = function(fen) { clearTimeout(current_hash_display_timer); current_hash_display_timer = null; } - $("#refutationlines").empty(); + document.getElementById("refutationlines").replaceChildren(); current_hash_xhr = new AbortController(); const signal = current_analysis_xhr.signal; @@ -1981,15 +1987,19 @@ var onDragStart = function(source, piece, position, orientation) { recommended_move = get_best_move(pseudogame, source, null, pseudogame.turn() === 'b'); if (recommended_move) { - var squareEl = $('#board .square-' + recommended_move.to); - squareEl.addClass('highlight1-32417'); + var squareEl = document.querySelector('#board .square-' + recommended_move.to); + squareEl.classList.add('highlight1-32417'); } return true; } var mousedownSquare = function(e) { + if (!e.target || !e.target.matches('.square-55d63')) { + return; + } + reverse_dragging_from = null; - var square = $(this).attr('data-square'); + var square = e.target.getAttribute('data-square'); var pseudogame = new Chess(display_fen); if (pseudogame.game_over() === true) { @@ -2005,25 +2015,30 @@ var mousedownSquare = function(e) { reverse_dragging_from = square; recommended_move = get_best_move(pseudogame, null, square, pseudogame.turn() === 'b'); if (recommended_move) { - var squareEl = $('#board .square-' + recommended_move.from); - squareEl.addClass('highlight1-32417'); - squareEl = $('#board .square-' + recommended_move.to); - squareEl.addClass('highlight1-32417'); + var squareEl = document.querySelector('#board .square-' + recommended_move.from); + squareEl.classList.add('highlight1-32417'); + squareEl = document.querySelector('#board .square-' + recommended_move.to); + squareEl.classList.add('highlight1-32417'); } } } var mouseupSquare = function(e) { + if (!e.target || !e.target.matches('.square-55d63')) { + return; + } if (reverse_dragging_from === null) { return; } - var source = $(this).attr('data-square'); + var source = e.target.getAttribute('data-square'); var target = reverse_dragging_from; reverse_dragging_from = null; if (onDrop(source, target) !== 'snapback') { onSnapEnd(source, target); } - $("#board").find('.square-55d63').removeClass('highlight1-32417'); + document.getElementById("board").querySelectorAll('.square-55d63.highlight1-32417').forEach((square) => { + square.classList.remove('highlight1-32417'); + }); } var get_best_move = function(game, source, target, invert) { @@ -2378,17 +2393,17 @@ var init = function() { onDrop: onDrop, onSnapEnd: onSnapEnd }); - $("#board").on('mousedown', '.square-55d63', mousedownSquare); - $("#board").on('mouseup', '.square-55d63', mouseupSquare); + document.getElementById("board").addEventListener('mousedown', mousedownSquare); + document.getElementById("board").addEventListener('mouseup', mouseupSquare); request_update(); - $(window).resize(function() { + window.addEventListener('resize', function() { board.resize(); update_sparkline(displayed_analysis_data || current_analysis_data); update_board_highlight(); redraw_arrows(); }); - $(window).keyup(function(event) { + window.addEventListener('keyup', function(event) { if (event.which == 39) { // Left arrow. next_move(); } else if (event.which == 37) { // Right arrow. @@ -2405,6 +2420,6 @@ var init = function() { window.addEventListener('hashchange', possibly_switch_game_from_hash, false); possibly_switch_game_from_hash(); }; -$(document).ready(init); +document.addEventListener('DOMContentLoaded', init); })(); -- 2.39.2