From 2273a6ed43626e65cfa5908557da24827f5cef59 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 4 Nov 2016 09:41:44 -0400 Subject: [PATCH] Allow multiple key bindings to be specified in an array --- modules/lib/d3.keybinding.js | 49 +++++++++++++++++++--------------- test/spec/lib/d3.keybinding.js | 10 +++++++ 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/modules/lib/d3.keybinding.js b/modules/lib/d3.keybinding.js index c152f6d97..cc98ab242 100644 --- a/modules/lib/d3.keybinding.js +++ b/modules/lib/d3.keybinding.js @@ -58,33 +58,37 @@ export function d3keybinding(namespace) { return keybinding; }; - keybinding.on = function(code, callback, capture) { - var binding = { - event: { - keyCode: 0, - shiftKey: false, - ctrlKey: false, - altKey: false, - metaKey: false - }, - capture: capture, - callback: callback - }; + keybinding.on = function(codes, callback, capture) { + var arr = [].concat(codes); + for (var i = 0; i < arr.length; i++) { + var code = arr[i]; + var binding = { + event: { + keyCode: 0, + shiftKey: false, + ctrlKey: false, + altKey: false, + metaKey: false + }, + capture: capture, + callback: callback + }; - code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g); + code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g); - for (var i = 0; i < code.length; i++) { - // Normalise matching errors - if (code[i] === '++') code[i] = '+'; + for (var j = 0; j < code.length; j++) { + // Normalise matching errors + if (code[j] === '++') code[i] = '+'; - if (code[i] in d3keybinding.modifierCodes) { - binding.event[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[i]]]] = true; - } else if (code[i] in d3keybinding.keyCodes) { - binding.event.keyCode = d3keybinding.keyCodes[code[i]]; + if (code[j] in d3keybinding.modifierCodes) { + binding.event[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true; + } else if (code[j] in d3keybinding.keyCodes) { + binding.event.keyCode = d3keybinding.keyCodes[code[j]]; + } } - } - bindings.push(binding); + bindings.push(binding); + } return keybinding; }; @@ -92,6 +96,7 @@ export function d3keybinding(namespace) { return keybinding; } + d3keybinding.modifierCodes = { // Shift key, ⇧ '⇧': 16, shift: 16, diff --git a/test/spec/lib/d3.keybinding.js b/test/spec/lib/d3.keybinding.js index 79a43a225..62f45118b 100644 --- a/test/spec/lib/d3.keybinding.js +++ b/test/spec/lib/d3.keybinding.js @@ -38,6 +38,16 @@ describe('d3.keybinding', function() { expect(spy).to.have.been.calledOnce; }); + it('adds multiple bindings given an array of keys', function () { + d3.select(document).call(keybinding.on(['A','B'], spy)); + + happen.keydown(document, {keyCode: 65}); + expect(spy).to.have.been.calledOnce; + + happen.keydown(document, {keyCode: 66}); + expect(spy).to.have.been.calledTwice; + }); + it('does not dispatch when focus is in input elements by default', function () { d3.select(document).call(keybinding.on('A', spy));