|
|
| Line 1: |
Line 1: |
| /* SK navigation – keyboard controls (WASD + arrows + Q/E for Up/Down) */ | | // DEBUG: SK user JS test |
|
| |
|
| mw.loader.using('mediawiki.util', function () {
| | alert('SunKeeper user JS loaded.'); |
| 'use strict';
| |
|
| |
|
| function isTypingTarget(el) {
| | document.addEventListener('keydown', function (e) { |
| if (!el) return false;
| | alert('Key pressed: ' + e.key); |
| var tag = (el.tagName || '').toLowerCase();
| |
| if (tag === 'input' || tag === 'textarea' || tag === 'select') return true;
| |
| if (el.isContentEditable) return true;
| |
| return false;
| |
| }
| |
| | |
| function getNavLink(selector) {
| |
| var btn = document.querySelector(selector);
| |
| if (!btn) return null;
| |
| var a = btn.querySelector('a');
| |
| return a || null;
| |
| }
| |
| | |
| function navigate(selector) {
| |
| var link = getNavLink(selector);
| |
| if (link && link.href) {
| |
| window.location.href = link.href;
| |
| return true;
| |
| }
| |
| return false;
| |
| }
| |
| | |
| document.addEventListener('keydown', function (e) {
| |
| if (isTypingTarget(e.target)) return;
| |
| | |
| var key = e.key;
| |
| if (!key) return;
| |
| | |
| if (key.length === 1) {
| |
| key = key.toLowerCase();
| |
| }
| |
| | |
| var handled = false;
| |
| | |
| switch (key) {
| |
| case 'w':
| |
| case 'ArrowUp':
| |
| handled = navigate('.nav-link-north');
| |
| break;
| |
| | |
| case 's':
| |
| case 'ArrowDown':
| |
| handled = navigate('.nav-link-south');
| |
| break;
| |
| | |
| case 'a':
| |
| case 'ArrowLeft':
| |
| handled = navigate('.nav-link-west');
| |
| break;
| |
| | |
| case 'd':
| |
| case 'ArrowRight':
| |
| handled = navigate('.nav-link-east');
| |
| break;
| |
| | |
| case 'q':
| |
| case 'PageUp':
| |
| handled = navigate('.nav-link-up');
| |
| break;
| |
| | |
| case 'e':
| |
| case 'PageDown':
| |
| handled = navigate('.nav-link-down');
| |
| break;
| |
| }
| |
| | |
| if (handled) {
| |
| e.preventDefault();
| |
| }
| |
| });
| |
| }); | | }); |