整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          好煩,怎么輸入拼音的過程也會觸發input事件!!!



          在前面

          input輸入框大家應該都很熟悉了吧,不知道大家有沒有遇到過這樣的一種情況:如上圖,在中文輸入過程中,輸入的拼音也會觸發input框的input事件,有些時候我們并不希望在中文輸入的過程中拼音觸發input事件。

          在日常開發中,輸入框是一個常見的組件,但是在拼音輸入過程中,每次輸入都會觸發input事件,這可能會導致不必要的操作。本文將介紹一種解決該問題的Vue指令,使得在拼音輸入過程中不會觸發input事件,從而優化輸入框體驗。

          效果展示

          實現原理

          1、compositionstart和compositionend事件

          我們需要了解compositionstart和compositionend兩個事件。當用戶開始輸入拼音時,會觸發compositionstart事件,此時輸入框的值并沒有真正改變。隨著輸入的進行,最終會觸發compositionend事件,此時輸入框的值才會真正改變。我們可以通過監聽這兩個事件,來控制何時觸發input事件。

          具體實現方式是,在監聽到compositionstart事件時,將輸入框的值存儲下來,然后在監聽到compositionend事件時,再將輸入框的值與之前存儲的值進行比較,如果不同,則觸發自定義的input事件,并將新值作為參數傳遞給監聽器。

          2、代碼實現

          (1)輸入框

          html復制代碼<div class="input-text-title">正常情況</div>
          <div class="input-text-content">{{ inputText }}</div>
          <input
              placeholder="請輸入"
              class="input-text"
              @input="doInput"
              id="inputContent"
          />

          簡單定義一個輸入框,監聽其input事件,inputText保存實時輸入內容并展示到頁面上。

          (2)監聽compositionstart和compositionend事件

          javascript復制代碼const inputContent = document.getElementById("inputContent");
          inputContent.addEventListener("compositionstart", () => {
              this.isComposing = true;
              this.inputComplate(inputContent.value);
          });
          inputContent.addEventListener("compositionend", () => {
              this.isComposing = false;
              if (inputContent.value !== this.inputText) {
                  this.inputComplate(inputContent.value);
              }
          });

          首先,我們通過getElementById方法獲取到id為"inputContent"的輸入框元素,并將其賦值給inputContent常量。

          然后,我們給inputContent元素添加compositionstart事件的監聽器。在事件觸發時,會執行回調函數。在回調函數中,我們將isComposing變量設置為true,表示正在進行拼音輸入,然后調用inputComplate方法處理輸入框的值,并將輸入框的值作為參數傳遞給inputComplate方法。

          接下來,我們給inputContent元素添加compositionend事件的監聽器。在事件觸發時,同樣會執行回調函數。在回調函數中,我們將isComposing變量設置為false,表示拼音輸入結束,然后同樣調用inputComplate方法處理輸入框的值,并將輸入框的值作為參數傳遞給inputComplate方法。

          通過監聽這兩個事件,并在事件觸發時調用相應的處理方法,我們可以實現在拼音輸入過程中控制input事件的觸發時機,從而達到不觸發input事件的效果。

          (3)input事件判斷是否正在輸入拼音

          javascript復制代碼inputComplate(value) {
              this.inputText = value;
          },
          doInput(event) {
              if (this.isComposing) return;
              const value = event.target.value;
              this.inputComplate(value);
          },

          輸入框input事件綁定的是doInput方法,這個方法在這里只是用于過渡一下,在這里我們需要判斷當前是否正在輸入拼音,如果是在輸入拼音的話我們就直接返回,不進行后續操作,如果不是的話則調用inputComplate進行后續處理,真正的處理邏輯應該是在inputComplate方法中。

          這樣我們就簡單的完成了一個忽略拼音輸入過程中的input事件的功能

          本文到此結束

          且慢,雖然上面這樣操作之后可以得到一個可以忽略拼音輸入過程中的input事件的輸入框;但是,如果我們有很多個輸入框需要加上這個功能呢?這樣的話我們每寫一個input框,想要加上這個功能的話不還得加一堆亂七八糟的代碼來處理,這明顯很不合理。

          (4)封裝成一個vue指令

          javascript復制代碼export default {
              bind(el, binding) {
                  let isComposing = false;
                  let value = "";
                  
                  el.addEventListener("compositionstart", () => {
                      isComposing = true;
                      value = el.value;
                  });
          
                  el.addEventListener("compositionend", () => {
                      isComposing = false;
                      if (value !== el.value) {
                          binding.value(el.value);
                      }
                  });
          
                  // 添加自定義的input事件監聽器
                  el.addEventListener("input", (event) => {
                      if (isComposing) {
                          return;
                      }
                      const value = event.target.value;
                      // 處理輸入框的值
                      binding.value(value);
                  });
              },
          };
          html復制代碼<input
              placeholder="輸入試試"
              class="input-text"
              v-JIgnorePinyin="doInput1"
          />

          在bind鉤子函數中,我們首先定義了兩個變量isComposing和value,分別用于記錄是否正在進行拼音輸入和輸入框的值。

          然后,我們給輸入框元素el添加compositionstart事件的監聽器。在事件觸發時,將isComposing設置為true,表示正在進行拼音輸入,并將輸入框的值賦給value。

          接下來,我們給輸入框元素el添加compositionend事件的監聽器。在事件觸發時,將isComposing設置為false,表示拼音輸入結束。然后,我們比較value和輸入框的當前值el.value是否相等,如果不相等,則說明輸入框的值已經發生了變化,此時我們調用binding.value方法,將當前輸入框的值el.value作為參數傳遞給綁定該指令的處理函數。

          最后,我們給輸入框元素el添加input事件的監聽器。在事件觸發時,首先判斷isComposing的值,如果為true,則直接返回,不做任何處理。如果isComposing的值為false,說明拼音輸入已經完成,此時我們獲取輸入框的值event.target.value,并將其作為參數調用binding.value方法,從而處理輸入框的值。

          通過定義這個自定義指令,我們可以在Vue組件中使用它來監聽拼音輸入過程中的事件,并執行相應的處理邏輯,從而實現更加靈活的輸入框交互。

          這樣的話后面需要加功能只需要一個指令即可搞定。

          組件庫

          組件文檔

          目前該組件也已經收錄到我的組件庫,組件文檔地址如下: jyeontu.xyz/jvuewheel/#…

          組件內容

          組件庫中還有許多好玩有趣的組件,如:

          • 懸浮按鈕
          • 評論組件
          • 詞云
          • 瀑布流照片容器
          • 視頻動態封面
          • 3D輪播圖
          • web桌寵
          • 貢獻度面板
          • 拖拽上傳
          • 自動補全輸入框
          • 圖片滑塊驗證
          等等……

          組件庫源碼

          組件庫已開源到gitee,有興趣的也可以到這里看看:gitee.com/zheng_yongt…

          覺得有幫助的可以點個star~

          有什么問題或錯誤可以指出,歡迎pr~

          有什么想要實現的組件或想法可以聯系我~

          作者:JYeontu

          鏈接:https://juejin.cn/post/7330439494666223642

          未休息,感覺沒啥可寫的,就水一篇文章吧,說一說前端 html 頁面中 input 元素中在沒有值的情況下,添加提示的文字,當要輸入文字的時候,提示的文字消失。

          關于 html input 輸入框的提示文字,有兩種方法可以實現,一種為 input 元素的 placeholder 屬性,一種為 js 方法。

          input 元素的 placeholder 屬性

          placeholder:屬性提供可描述輸入字段預期值的提示信息

          語法:

          <input placeholder="提示的文字">
          

          例:input 添加提示的文字

          代碼:

          <input type="text" placeholder="這里是提示的文字">
          

          運行結果:

          當input輸入框,輸出文字時,提示的文字信息會消失

          js 方法添加 input 元素提示文字

          示例代碼:

          <input type="text" onfocus="javascript:if(this.value=='請輸入內容')this.value='';">
          

          運行結果:

          注:

          1、js 方法添加的提示文字不同于 使用 placeholder 屬性添加的效果

          2、placeholder 屬性添加的提示文字,只有輸入內容時文字才會消失

          3、js 方式添加的提示文字,當光標定位到 input 輸入框中時,提示文字就會消失

          TML中input文本輸入框在某些情況下禁止或者限制部分操作是很有必要的,下面為大家分享一下如何在input文本輸入框添加限制條件,驗證內容是否選中或者內容編輯等,此方法僅供才考。

          以圖片形式方便大家手機端閱讀:

          圖片形式

          以文字形式方便大家在PC端驗證:

          1、選中去除文本框文字,離開后顯示原有文字:

          <input name="key" type="text" id="key" value="關鍵詞" size="30"

          onmouseover=this.focus();this.select();

          onclick="if(value==defaultValue){value='';this.style.color='#000'}"

          onBlur="if(!value){value=defaultValue;this.style.color='#999'}" style="color:#999" />

          2、選中后方可編輯:

          <input type="checkbox" name="tpbox" value="1" onclick="if(this.checked) {txtNo.disabled=false}else{txtNo.disabled=true}">你一定要幸福,我會好好的!

          你的姓名:<input type="text" name="txtNo" size="20" value="選中前面的選項方可編輯" disabled>

          3、點擊鏈接后方可編輯:

          <a href="#" onclick="username.readOnly=false;alert('你好,歡迎使用!')">先點擊我哦!</a>

          你的姓名:<input id="username" value="--請輸入--" size="30" readOnly>

          4、輸入框從中間輸入:從中間輸入:

          <input type="text" name="mid"style="text-align:center;">

          5、輸入框變色:輸入框改變變色:

          <input type="text" size="20" style="background-color:#FFFFFF"

          onfocus="style.backgroundColor='#FFFF00'"

          onblur="style.backgroundColor='#FFFFFF'">

          6、輸入框只能輸入數字(用的是正則表達式):你的年齡:

          <input onkeyup="value=value.replace(/[^\d]/g,'') "

          onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">

          7、輸入框只能輸入中文(用的是正則表達式):你的中文名:

          <input onkeyup="value=value.replace(/[ -~]/g,'')" onkeydown="if(event.keyCode==13)event.keyCode=9">

          8、只能輸入英文和數字(用的是正則表達式):

          你 的昵稱:<input onkeyup="value=value.replace(/[\W]/g,'') "

          onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

          onkeydown="if(event.keyCode==13)event.keyCode=9">

          9、輸入框不能編輯,但表單可以獲得輸入框內的值:

          <input type="text" value="afreon" onclick="alert('總和不能編輯!');" onfocus="this.blur()" />

          <input type="text" value="afreon" onclick="alert(this.value);" readonly />

          <input value="不可修改" readonly= "true" type="text"/>//:字體顏色為黑體

          10、輸入框不能編輯,并且表單不能獲得輸入框內的值

          <input value="不可修改" disabled="disabled" type="text"/>//:字體顏色為灰體

          11、輸入框禁止輸入法:

          <input onpaste="return false" style="ime-mode:disabled">


          主站蜘蛛池模板: 天美传媒一区二区三区| 亚洲午夜精品第一区二区8050| 精品亚洲一区二区三区在线观看 | 精品爆乳一区二区三区无码av| 国产午夜精品片一区二区三区| 亚洲一区二区高清| 亚洲AV无码片一区二区三区| 国产成人一区二区三区电影网站| 内射女校花一区二区三区| 玩弄放荡人妻一区二区三区| 91在线一区二区三区| 国产丝袜视频一区二区三区| 国产成人无码AV一区二区| 午夜无码视频一区二区三区| 国产成人AV区一区二区三| 成人一区二区三区视频在线观看| 无码精品人妻一区二区三区人妻斩| 精品一区二区三区色花堂| 亲子乱av一区二区三区| 日产精品久久久一区二区| 精品无码人妻一区二区三区 | 国产美女一区二区三区| 亚洲国产韩国一区二区| 国内精品一区二区三区最新| 天堂一区二区三区在线观看| 亚洲一区二区免费视频| 中文字幕一区二区精品区| 亚洲综合av永久无码精品一区二区 | 国产综合无码一区二区辣椒| 一区二区三区四区在线视频| 亚洲无人区一区二区三区| 亚洲一区二区三区在线网站| 亚洲AV无码一区二区三区鸳鸯影院| 成人国产精品一区二区网站公司| 亚洲av无码一区二区三区在线播放 | 无码人妻精品一区二区三区不卡| 国产精品一区二区香蕉| 国产美女精品一区二区三区| 亚洲字幕AV一区二区三区四区| 无码AV动漫精品一区二区免费| 久久精品免费一区二区三区|