更改 keyup 上的输入字段以匹配 MAC 地址格式
Change input field on keyup to match MAC address format
我对 JavaScript 或 jQuery 没有太多经验。
我尝试使用 Tampermonkey 自动更正 MAC 地址的输入字段。
站点需要格式为 00:00:00:00:00:00
的 MAC 地址。
所以我为 Tampermonkey 编写了这个脚本,所以它会在我输入时自动添加冒号:
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split('');
var colons = ["2", "5", "8", "11", "14"];
for (var col in colons) {
if (macs[col] == "-") {
macs[col] = ":";
} else if (macs[col] != "") {
} else if (macs[col] != ":") {
var colo = col + 1;
macs[colo] = macs[col];
macs[col] = ":";
}
}
mac = macs.toString();
});
<input id=MAC />
但它不起作用。输入框的ID是MAC
.
我哪里做错了,错了多少?
解决方案
感谢@i-wrestled-a-bear-once 和@freginold 提供我的最佳解决方案
我现在使用的是来自@freginold
的略有改动的版本
var back = true;
function isHex(char) {
// check if char is a hex char
if (!isNaN(parseInt(char))) {
return true;
} else {
switch (char.toLowerCase()) {
case "a":
case "b":
case "c":
case "d":
case "e":
case "f":
return true;
}
return false;
}
}
document.getElementById("MAC").addEventListener('keydown', function() {
var key = event.keyCode || event.charCode;
if( key == 8 || key == 46 ) {
back = false;
}
});
document.getElementById("MAC").addEventListener('keyup', function() {
var key = event.keyCode || event.charCode;
var mac = document.getElementById('MAC').value;
var newMac = mac.replace("-", ""); // remove any dashes
if ((isHex(mac[mac.length - 1]) && (isHex(mac[mac.length - 2])) && (mac.length <= 16) && (back))) {
// if last two chars are numbers, insert a colon
newMac = newMac + ":";
}
back = true;
document.getElementById('MAC').value = newMac; // put new value into input field
});
您可以使用函数 chunk
:(不是我的代码,我只是包含它并修改了您的代码以使用它。)
function chunk(str, n) {
var ret = [];
var i;
var len;
for(i = 0, len = str.length; i < len; i += n) {
ret.push(str.substr(i, n))
}
return ret
};
那么您的代码应该如下所示:
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split(':').join('');
macs = chunk(macs, 2).join(':');
document.getElementById('MAC').value = macs.toString();
});
演示
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split(':').join('');
macs = chunk(macs, 2).join(':');
document.getElementById('MAC').value = macs.toString();
});
function chunk(str, n) {
var ret = [];
var i;
var len;
for(i = 0, len = str.length; i < len; i += n) {
ret.push(str.substr(i, n))
}
return ret
};
<input id=MAC maxlength="17"/>
replace(/[^\d|A-Z]/g, '')
删除任何非字母数字字符
match(/.{1,2}/g)
将字符串分成 2 个块
join(":")
加入块并在它们之间放置一个冒号
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
document.getElementById("MAC").addEventListener('keyup', function() {
// remove non digits, break it into chunks of 2 and join with a colon
this.value =
(this.value.toUpperCase()
.replace(/[^\d|A-Z]/g, '')
.match(/.{1,2}/g) || [])
.join(":")
});
<input id=MAC />
您可以简化它并检查字符串中的最后两个字符是否为十六进制字符(0-9,A-F),如果是,则插入一个:
。如果您(或其他人)输入破折号而不是冒号,您也可以使用 .replace()
删除任何出现的 -
。
这样,如果您根本不输入冒号,您就可以插入冒号,也可以将任何输入的破折号转换为冒号。
这是一个工作示例:
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
function isHex(char) {
if (!isNaN(parseInt(char))) {
return true;
} else {
switch (char.toLowerCase()) {
case "a":
case "b":
case "c":
case "d":
case "e":
case "f":
return true;
break;
}
return false;
}
}
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
if (mac.length < 2) {
return;
}
var newMac = mac.replace("-", "");
if ((isHex(mac[mac.length - 1]) && (isHex(mac[mac.length - 2])))) {
newMac = newMac + ":";
}
document.getElementById('MAC').value = newMac;
});
document.getElementById('MAC').focus(); // autofocus for testing
<input id=MAC />
刚刚尝试了一个简单的逻辑。
var macelem = document.getElementById("MAC");
macelem.addEventListener('keyup', function() {
var mac = macelem.value,index=(mac.match(/\:/g)||[]).length;
if(index < 5 && index*3+2 == mac.length)
{
mac += ":";index++;
}
macelem.value = mac.substr(0,17);
});
<input id="MAC">
这应该可以解决问题,您可以在需要的地方替换或添加“:”。
然后在将字符串添加回输入之前限制字符串的长度,以避免到达长 MAC 地址。
顺便说一句,您在选择冒号 [col] 时遇到了一些问题,无法让您的代码正常工作。
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split('');
var colons = [2, 5, 8, 11, 14];
for (var col in colons) {
if (colons[col] <= macs.length) {
if (macs[colons[col]] !== ":") {
macs.splice(colons[col], 0, ":");
}
}
}
document.getElementById('MAC').value = macs.join('').substring(0,17);
});
<input id=MAC />
我对 JavaScript 或 jQuery 没有太多经验。
我尝试使用 Tampermonkey 自动更正 MAC 地址的输入字段。
站点需要格式为 00:00:00:00:00:00
的 MAC 地址。
所以我为 Tampermonkey 编写了这个脚本,所以它会在我输入时自动添加冒号:
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split('');
var colons = ["2", "5", "8", "11", "14"];
for (var col in colons) {
if (macs[col] == "-") {
macs[col] = ":";
} else if (macs[col] != "") {
} else if (macs[col] != ":") {
var colo = col + 1;
macs[colo] = macs[col];
macs[col] = ":";
}
}
mac = macs.toString();
});
<input id=MAC />
但它不起作用。输入框的ID是MAC
.
我哪里做错了,错了多少?
解决方案
感谢@i-wrestled-a-bear-once 和@freginold 提供我的最佳解决方案
我现在使用的是来自@freginold
的略有改动的版本var back = true;
function isHex(char) {
// check if char is a hex char
if (!isNaN(parseInt(char))) {
return true;
} else {
switch (char.toLowerCase()) {
case "a":
case "b":
case "c":
case "d":
case "e":
case "f":
return true;
}
return false;
}
}
document.getElementById("MAC").addEventListener('keydown', function() {
var key = event.keyCode || event.charCode;
if( key == 8 || key == 46 ) {
back = false;
}
});
document.getElementById("MAC").addEventListener('keyup', function() {
var key = event.keyCode || event.charCode;
var mac = document.getElementById('MAC').value;
var newMac = mac.replace("-", ""); // remove any dashes
if ((isHex(mac[mac.length - 1]) && (isHex(mac[mac.length - 2])) && (mac.length <= 16) && (back))) {
// if last two chars are numbers, insert a colon
newMac = newMac + ":";
}
back = true;
document.getElementById('MAC').value = newMac; // put new value into input field
});
您可以使用函数 chunk
:(不是我的代码,我只是包含它并修改了您的代码以使用它。)
function chunk(str, n) {
var ret = [];
var i;
var len;
for(i = 0, len = str.length; i < len; i += n) {
ret.push(str.substr(i, n))
}
return ret
};
那么您的代码应该如下所示:
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split(':').join('');
macs = chunk(macs, 2).join(':');
document.getElementById('MAC').value = macs.toString();
});
演示
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split(':').join('');
macs = chunk(macs, 2).join(':');
document.getElementById('MAC').value = macs.toString();
});
function chunk(str, n) {
var ret = [];
var i;
var len;
for(i = 0, len = str.length; i < len; i += n) {
ret.push(str.substr(i, n))
}
return ret
};
<input id=MAC maxlength="17"/>
replace(/[^\d|A-Z]/g, '')
删除任何非字母数字字符match(/.{1,2}/g)
将字符串分成 2 个块
join(":")
加入块并在它们之间放置一个冒号
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
document.getElementById("MAC").addEventListener('keyup', function() {
// remove non digits, break it into chunks of 2 and join with a colon
this.value =
(this.value.toUpperCase()
.replace(/[^\d|A-Z]/g, '')
.match(/.{1,2}/g) || [])
.join(":")
});
<input id=MAC />
您可以简化它并检查字符串中的最后两个字符是否为十六进制字符(0-9,A-F),如果是,则插入一个:
。如果您(或其他人)输入破折号而不是冒号,您也可以使用 .replace()
删除任何出现的 -
。
这样,如果您根本不输入冒号,您就可以插入冒号,也可以将任何输入的破折号转换为冒号。
这是一个工作示例:
// ==UserScript==
// @name Name
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds colons to the mac adress of the Mac Field
// @author You
// @match Somesite
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
function isHex(char) {
if (!isNaN(parseInt(char))) {
return true;
} else {
switch (char.toLowerCase()) {
case "a":
case "b":
case "c":
case "d":
case "e":
case "f":
return true;
break;
}
return false;
}
}
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
if (mac.length < 2) {
return;
}
var newMac = mac.replace("-", "");
if ((isHex(mac[mac.length - 1]) && (isHex(mac[mac.length - 2])))) {
newMac = newMac + ":";
}
document.getElementById('MAC').value = newMac;
});
document.getElementById('MAC').focus(); // autofocus for testing
<input id=MAC />
刚刚尝试了一个简单的逻辑。
var macelem = document.getElementById("MAC");
macelem.addEventListener('keyup', function() {
var mac = macelem.value,index=(mac.match(/\:/g)||[]).length;
if(index < 5 && index*3+2 == mac.length)
{
mac += ":";index++;
}
macelem.value = mac.substr(0,17);
});
<input id="MAC">
这应该可以解决问题,您可以在需要的地方替换或添加“:”。 然后在将字符串添加回输入之前限制字符串的长度,以避免到达长 MAC 地址。
顺便说一句,您在选择冒号 [col] 时遇到了一些问题,无法让您的代码正常工作。
document.getElementById("MAC").addEventListener('keyup', function() {
var mac = document.getElementById('MAC').value;
var macs = mac.split('');
var colons = [2, 5, 8, 11, 14];
for (var col in colons) {
if (colons[col] <= macs.length) {
if (macs[colons[col]] !== ":") {
macs.splice(colons[col], 0, ":");
}
}
}
document.getElementById('MAC').value = macs.join('').substring(0,17);
});
<input id=MAC />