項目地址 點擊查看
項目演示 點擊查看html
- 首先監聽全部的input,有input聚焦時調起數字鍵盤,經過
getBoundingClientRect
判斷input位置讓數字鍵盤在input附近,失去焦點後則隱藏數字鍵盤
let inputElement = document.getElementsByTagName("input");
[...inputElement].forEach(ipele => {
ipele.addEventListener("focus", function(e) {
$this.inputTarget = e.target;
let scrollTop =
window.pageYOffset ||
document.documentElement.scrollTop ||
document.body.scrollTop;
let scrollLeft =
window.pageXOffset ||
document.documentElement.scrollLeft ||
document.body.scrollLeft;
$this.NumberkeyBoardStyle =
"top:" +
(e.target.getBoundingClientRect().top +
scrollTop +
e.target.offsetHeight) +
"px;left:" +
(e.target.getBoundingClientRect().left +
scrollLeft +
e.target.offsetWidth) +
"px";
});
ipele.addEventListener("blur", function(e) {
$this.inputTarget = null;
$this.NumberkeyBoardStyle = "display:none";
});
});
複製代碼
- 點擊小鍵盤時阻止默認事件,阻止input失去焦點。
BoardNumberKeyDown(e) {
if (e && e.preventDefault) {
e.preventDefault();
} else {
window.event.returnValue = false;
return false;
}
},
複製代碼
- 點擊小鍵盤時,根據事件委託,得出點擊的數字,而後根據
selectionStart
,selectionEnd
獲取input中的焦點,將小鍵盤中的數字插入焦點處,最後焦點右移一位。
let inputTarget = this.inputTarget;
let Pointstart = inputTarget.selectionStart;
let PointEnd = inputTarget.selectionEnd;
let wordLength = inputTarget.value.length;
if (e.target.className == "numberTD" && e.target.innerText != "←") {
inputTarget.value =
inputTarget.value.slice(0, Pointstart) +
e.target.innerText +
inputTarget.value.slice(PointEnd, wordLength);
//一個小數點和開頭不能有小數點
inputTarget.value = inputTarget.value.replace(/^\./g, "");
inputTarget.value = inputTarget.value
.replace(".", "$#$")
.replace(/\./g, "")
.replace("$#$", ".");
inputTarget.selectionStart = Pointstart + 1;
inputTarget.selectionEnd = Pointstart + 1;
//讓光標顯示在input可視區域
inputTarget.blur();
inputTarget.focus();
複製代碼
- 點擊刪除鍵時,刪除光標處數字,最後光標右移。
if (e.target.className == "numberTD" &&
e.target.innerText == "←" &&
//PointEnd==0時會複製整個input的value
PointEnd != 0
) {
inputTarget.value =
inputTarget.value.slice(0, Pointstart - 1) +
inputTarget.value.slice(PointEnd, wordLength);
inputTarget.selectionStart = Pointstart - 1;
inputTarget.selectionEnd = Pointstart - 1;
//讓光標顯示在input可視區域
inputTarget.blur();
inputTarget.focus();
}
複製代碼
- 在刪除數字和添加數字後要讓input失去焦點在獲取焦點,否則光標會在最後而不是在input的可視區域,這樣子會看不到輸入的值。具體能夠查看項目。