- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 Javascript/jQuery 函数,它将自动将键盘快捷键绑定(bind)到我的网页。我想到的方法如下:
非常基本的算法,至少我是这么认为的...问题即将到来...
例如,我可以输入以下内容:
<a href="javascript:void(0)" class="some_other_class ctrl+s">Save</a>
<a href="javascript:void(0)" class="ctrl+shift+s">Save As</a>
上述代码将生成以下键盘快捷键:Ctrl+S 和 Ctrl+Shift+< kbd>S
当按下这些键时,相关 html 元素的 click
事件将被触发...
如上所述,这里的算法非常简单,但是,像往常一样,在尝试编写它时就会出现问题。
我不知道如何知道自动绑定(bind)事件时要监听哪个键码 (e.which
)。
例如:
使用上面的 HTML 和下面的 jQuery,我们可以得到到目前为止(忽略正则表达式之类的东西):
function keyboardShortcuts(){
// Loop through all elements with a class containing 'key-'
$("[class*='key-']").each(function(){
// Using a regular expression here, separate the class into individual keys
// whilst ignoring other classes and the 'key-' prefix
var keys = $(this).attr('class').match(/REGEX HERE/);
// THIS IS WHERE THE CODE GETS A LITTLE MESSY
// I AM VERY UNSURE ABOUT THE FOLLOWING
// Define all special characters and set them to false
var ctrl = false, alt = false, shift = false;
// First test for special characters
// Test for ctrl key
if(keys.indexOf('ctrl')!=-1){
ctrl = true;
// Remove ctrl from the keys array
keys.splice(keys.indexOf('ctrl'),1)
}
// Test for alt key
if(keys.indexOf('alt')!=-1){
alt = true;
// Remove alt from the keys array
keys.splice(keys.indexOf('alt'),1)
}
// Test for shift key
if(keys.indexOf('shift')!=-1){
shift = true;
// Remove shift from the keys array
keys.splice(keys.indexOf('shift'),1)
}
// Determine special characters to test for
if(ctrl&&alt&&shift){
// Bind the keypress event to the document
$(document).keypress(function(e) {
if((e.ctrlKey||e.metaKey)&&e.altKey&&shiftKey) {
var continue = true;
// Test for other characters in keys array
for(var i=0;i<keys.length;i++){
// THIS IS WHAT I AM REALLY UNSURE ABOUT
if(keys.indexOf(charCodeAt(e.which))==-1){
// Correct key was not pressed so do not continue
continue = false;
}
}
if(continue){
e.preventDefault();
// Proceed to triggering the click event
// No more help needed from here...
}
}
return true;
});
}else if(ctrl&&alt){
}else if(ctrl&&shift){
}else if(shift&&alt){
}else if(ctrl){
}else if(alt){
}else if(shift){
}
});
}
正如你从上面看到的,代码相当冗长,但我根本看不到另一种编写它的方式......除了可能在这里和那里对数组进行一些整理之外,但即便如此,嵌套的 if声明几乎是必要的,不是吗?
排除代码相当困惑并且可能可以写得更好一点/更好的事实(如果您确实对此有看法,请提供),我的实际问题是引用以下行:
keys.indexOf(charCodeAt(e.which))==-1
这是从所有浏览器的字符代码中检索字符的可靠方法吗?如果不行的话有没有更好的办法?
任何人对代码的其余部分有任何意见,请发帖,希望得到一些反馈。
最佳答案
当我开始做这件事时,我并不打算重写整个事情。但我做到了,你可以看到它在 this jsfiddle 上工作。 .
该技术是找到所有目标元素并构建每个元素映射到的键组合的列表。我们将它们存储在数组 keybindings
中,每次有人按下某个键时,我们都会在整个列表中查找匹配项。如果找到一个,我们就会触发该元素上的单击事件。
我使用了 keydown
而不是 keypress
因为你实际上用它获取了修饰符信息。我还改进了类字符串解析,但我确信它可以变得更干净一些。
这是 JS 代码。
var keybindings = [];
$('[class*="key-"]').each(function (idx, val) {
var keyspec = {
which: 0,
altKey: false,
shiftKey: false,
ctrlKey: false,
element: val
};
var keystring = $(val).attr('class').toLowerCase();
var match = /key-\S+/.exec(keystring);
var parts = match.toString().split('-');
keyspec.which = parts[ parts.length-1 ].toUpperCase().charCodeAt(0);
for (var jdx in parts) {
if (parts[jdx] == 'alt') keyspec.altKey = true;
else if (parts[jdx] == 'shift') keyspec.shiftKey = true;
else if (parts[jdx] == 'ctrl') keyspec.ctrlKey = true;
}
keybindings.push( keyspec );
});
$(document).keydown( function(evt) {
$.each(keybindings, function(idx, oneBind) {
if (evt.which == oneBind.which
&& evt.altKey == oneBind.altKey
&& evt.shiftKey == oneBind.shiftKey
&& evt.ctrlKey == oneBind.ctrlKey)
$(oneBind.element).click();
});
});
当然,现在我想到可能已经有一个用于此目的的 jquery 插件,我们可以使用它。
关于javascript - 使用 charCodeAt() 从 KeyCode 中检索字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14591264/
我有以下内容; function rot13(str) { var result = str.split(""); result.map(function(val) { return v
我知道我可以使用 apply 方法,但我无法理解如何使用它,即括号中的内容。我尝试阅读有关它的文章,甚至观看了一些 YT 视频,但最终还是感到困惑。 我在这里尝试做的是使用 charCodeAt 将以
这怎么可能: var string1 = "🌀", string2 = "🌀🌂"; //comparing the charCode console.log(string1.charCodeAt
为什么代码: ','.charCodeAt(0); 生成 44,即使逗号的字符代码是 188(均由 this table 和在 keyup 中获取 event.keyCode 时 处理程序)。 最佳答
我有这段代码,用于检查右键单击+粘贴输入,然后将每个粘贴字符的字符代码传递到函数中。但是字符代码似乎不正确。我已将“fds”粘贴到输入中,它显示第一个字符的字符代码是102,但“f”的字符代码是70。
我需要一些建议来使用 charCodeAt() 方法。 我的代码如下: doParity() { var str = ["abcd", "efgh", "ijkl"]; var arr = str[0
这个问题以前曾通过不同的方式提出过,但与这个不同。我想通过使用 ES5 或 ES6 编写一个函数来实现,该函数使用系统 A = 1、B = 2、C = 3 等计算得分最高的单词。 该字符串将只包含一个
我试图在数组的特定索引上使用 str.charCodeAt() 。这是不起作用的代码: function rot13(str) { str = str.split(""); for (i =
我的目标是创建一个方法,它接受两个带有特殊字符的字符串并正确地比较它们。我正在努力理解字符编码的逻辑。 所以,我的字符串看起来像: Häzel - This Girl Is Watching Me
这一行,当保存在本地 html 文件中时,警告 229: alert("基".charCodeAt(0)) 但是当警报被复制到 JSFiddle 时,它提供 22522。 为什么会有差异? 最佳答
拿这段代码: var charCode = unkownVariable.charCodeAt(0); charCode 的最大长度是多少?我所有的测试结果都是 2 个字符(2 位数字)。会更长吗?
我正在尝试查找键码(如果这正是我需要的)并将字符更改为递增的键码(这只是为了编码挑战),但它不起作用 function LetterChanges(str) { var newString = "";
Here描述了如何使用 Firebug/FF Web 控制台检查 innerHTML 属性是否可配置和可枚举。如何检查 charCodeAt 函数是否相同? Object.getOwnProperty
对于下面的代码,由于“0”,它显然只会在“man”一词中记录“m”。如何记录所有三个字母? var userChoice = prompt("let me encode something!"); v
我使用以下函数将字符串编码为 base64: encode: function(input) { var output = ""; var chr1, chr2, chr3;
在 JavaScript 中,.charCodeAt() 在您传递给函数的字符串中的某个点返回一个 Unicode 值。如果我只有一个字符,我可以使用下面的代码在 Java 中获取 Unicode 值
这可能是非常明显和简单的东西,以至于我尝试搜索它都失败了,但是:使用 glib 你可以获取 Unicode 的用户输入,类似于我可以粘贴此 亜 的方式这里。我希望能够将其转换为等效的十六进制字符串,例
尝试在 Safari 3 中调用 String.charCodeAt('9') 时,javascript 调试面板出现此错误。 TypeError: Result of expression 'Str
我不确定 0xFF 在这里做什么...它只是为了确保二进制代码是 8 位长还是与有符号/无符号编码有关? ty. var nBytes = data.length, ui8Data = new Uin
我有一个使用非常特定字体的 Unicode 字符。 我需要取那个字符的代码,加上 8,然后把它转换回一个字符串。 这是有效的python代码: char = "" char == chr(ord(
我是一名优秀的程序员,十分优秀!