2016-10-25 58 views
1

我尝试在几个元素上同时使用EasyAutocomplete$(this)总是未定义,为什么?

$("#city_selector_suggest, $city_two, #city_down").easyAutocomplete({ 
    url: "/templates/rm/js/ecity2.json", 

    getValue: function(element) { 
     return element.cdek_cityname; 
    }, 

    list: { 
     onChooseEvent: function() { 
      var selectedItemValue = $(this).getSelectedItemData().cdek_id; 
      console.log(selectedItemValue); 
     }, 
     match: { 
      enabled: true, 

      method: function(element, phrase) { 
       if(element.indexOf(phrase) === 0) { 
        return true; 
       } else { 
        return false; 
       } 
      } 
     } 
    } 
}); 
+1

我的猜测是他们没有将事件绑定到元素上......'console.log(this)'可能是显示窗口。这些争论会给你什么吗? – epascarello

+0

我可以看到在整个代码中没有这个 – EaBangalore

回答

0

快速测试表明,在EasyAutocomplete事件处理程序中,是this非常规使用,即“不喜欢jQuery不会它”。

我所期待的jQuery插件什么:

  • this事件处理程序指向内部的DOM元素
  • 事件处理程序获取至少一个event参数和可能的额外data说法。

什么EasyAutocomplete作用:

  • this是某种小部件的配置对象的
  • 有事件处理程序

配置对象似乎没有任何参数提供获取小部件或小部件所基于的DOM元素的任何方法。

最接近解决方案的方法是使用.each()并单独绑定小部件,存储对当前元素的引用。

$("#city_selector_suggest, #city_two, #city_down").each(function() { 
    var $self = $(this); 

    $self.easyAutocomplete({ 
     url: "/templates/rm/js/ecity2.json", 
     getValue: function(element) { 
      return element.cdek_cityname; 
     }, 
     list: { 
      onChooseEvent: function() { 
       var selectedItemValue = $self.getSelectedItemData().cdek_id; 
       console.log(selectedItemValue); 
      }, 
      match: { 
       enabled: true, 
       method: function(element, phrase) { 
        return element.indexOf(phrase) === 0; 
       } 
      } 
     } 
    }); 
}); 

不像仅仅调用.easyAutocomplete()那么优雅 - 但并不完全可怕。