Vue中使用jquery

前端填坑之旅發表於2019-05-15

在vue專案中,需要實現某些特定的功能時,使用mvvm模式不易實現。因此引入jquery包來完成需求

jquery中的觸發事件可以自己定義在mounted中,如果需要使用vue中data的資料,直接使用this.msg是無法使用的,需要另外定義const _this = this,

儲存this.之後便可以在事件中使用_this.msg資料了。

 

需求:在品牌處可以輸入,並且會有模糊搜尋的下拉框,也可下拉選擇,在輸入完畢後檢驗值是否在下拉框中存在,聚焦時藍色邊框,change時如果不存在則紅框顯示,存在的話就綠框提示,(就是帶輸入建議的輸入框)

問題: 使用element-ui中的el-autocomplete元件,開始通過失焦事件來驗證,但是如果選擇了下拉框某個值時(選中後會將下拉框的值賦給上面的輸入框),失焦事件觸發會在賦值之前,因此拿失焦時輸入框的值來進行判斷時錯誤的,在先改變輸入框的值後再去選擇下拉框,change事件有同樣的bug,沒辦法只能自己引入jquery來完成

 

點選輸入框後,通過placeholder判斷是否是品牌下的的輸入框,因為每個輸入框都有這個類,如果是的話則增加一個類名,如果第一次點選的位置和第二次滑鼠點選的位置都是品牌下的輸入框,則執行相應的邏輯判斷,

在邏輯執行完後就刪除其他處同樣的類名inputList

const _this = this 
$('body').delegate('.el-input__inner', 'focus', function(e) { // 因為是動態生成的,所以選擇這種方式來監聽事件 if (e.target.placeholder === '請輸入品牌') { // 當聚焦在品牌輸入框時觸發 $(this).addClass('inputList') // 加上一個類名inputList if ($('.inputList').length === 2) { // 判斷下一次點選的位置,當從第一個輸入框改值後下一個聚焦位置還是品牌下的輸入框時 if (!$('.inputList').not(this).val()) { $('.inputList').not(this).css('border', '1px solid #67c23a') } else { let num = 0 for (let j = 0; j < _this.goodsBrands.length; j++) { if ($('.inputList').not(this).val() === _this.goodsBrands[j].value) { num += 1 break } } if (num === 0) { _this.$message.error('輸入的品牌不在品牌列表中') $('.inputList').not(this).css('border', '1px solid #F56C6C') } else { $('.inputList').not(this).css('border', '1px solid #67c23a') } } } $('.el-input__inner').not(this).removeClass('inputList') // 邏輯執行完之後刪除當前聚焦位置以外的inputList類,這樣就保持.inputList長度最多為2 } })
此處是為了模擬出輸入框的change事件,因為在聚焦時會新增inputList這個類名。所以這裡可以判斷是否是自己想要的位置,如果是的話給一個標誌位getindex,當點選到品牌下的輸入框時,如果第二次的點選位置不是品牌其他位置的輸入框,則進行邏輯判斷
    $(document).click(function(e) { // focus觸發時也會觸發這個事件,並且觸發在focus事件之後
      if (e.target.classList[1] === 'inputList') { // 判斷是否點選在對應位置
        _this.getIndex = 1  // 用於標誌在聚焦事件觸發後的下一次點選是否同樣會觸發聚焦,如果是則把第二次點選當成第一次重新判斷,等到下一次點選再來判斷
      } else {
        if (_this.getIndex === 1) { 
          if (!$('.inputList').eq(0).val()) {
            $('.inputList').eq(0).css('border', '1px solid #67c23a')
          } else {
            let num = 0
            for (let j = 0; j < _this.goodsBrands.length; j++) {
              if ($('.inputList').eq(0).val() === _this.goodsBrands[j].value) {
                num += 1
                break
              }
            }
            if (num === 0) {
              _this.$message.error('輸入的品牌不在品牌列表中')
              $('.inputList').eq(0).css('border', '1px solid #F56C6C')
            } else {
              $('.inputList').eq(0).css('border', '1px solid #67c23a')
            }
          }
          $('.el-input__inner').removeClass('inputList')
          _this.getIndex = 0 // 每次第二次點選了其他位置時,getIndex重新計數
        }
      }
    })

小白一枚,如果有其他更好的方法,歡迎各位同行指教,多多交流
















相關文章