VueComponents-數字鍵盤

項目地址 點擊查看
項目演示 點擊查看
  1. 首先監聽全部的input,有input聚焦時調起數字鍵盤,經過getBoundingClientRect判斷input位置讓數字鍵盤在input附近,失去焦點後則隱藏數字鍵盤html

    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";
          });
        });
  2. 點擊小鍵盤時阻止默認事件,阻止input失去焦點。git

    BoardNumberKeyDown(e) {
          if (e && e.preventDefault) {
            e.preventDefault();
          } else {
            window.event.returnValue = false;
            return false;
          }
        },
  3. 點擊小鍵盤時,根據事件委託,得出點擊的數字,而後根據selectionStartselectionEnd獲取input中的焦點,將小鍵盤中的數字插入焦點處,最後焦點右移一位。github

    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();
  4. 點擊刪除鍵時,刪除光標處數字,最後光標右移。this

    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();
          }
  5. 在刪除數字和添加數字後要讓input失去焦點在獲取焦點,否則光標會在最後而不是在input的可視區域,這樣子會看不到輸入的值,具體能夠查看項目
相關文章
相關標籤/搜索