在函数中使用“this”关键字输入错误:“Not a function”

时间:2016-12-03 14:20:42

标签: javascript jquery this

我创建了以下功能。

function showAllSelectOpts(select)
{
  selectLength = select.children().length;
  select.attr('size',selectLength);
  select.css('height','auto');
  select.focusout(function(){
      select.attr('size','1');
  });
}

当直接在像这个showAllSelectOpts(mySelect);这样的select元素上调用它时它可以正常工作,但是当在另一个函数中调用时,如下所示使用关键字“this”,它会返回错误。 类型错误:select.children不是函数

$('select').on('focus',function(){
  showAllSelectOpts(this);
})  

这是范围问题还是什么,我该如何解决?

5 个答案:

答案 0 :(得分:4)

在事件处理程序中,this是对DOM元素的引用,而不是jQuery对象。但是你的showAllSelectOpts期望它的参数是一个jQuery对象。

更改调用以使用$()包装DOM元素:

showAllSelectOpts($(this));

... 更新showAllSelectOpts本身就是这样做的:

function showAllSelectOpts(select)
{
  select = $(select);                      // ***
  selectLength = select.children().length;
  select.attr('size',selectLength);
  select.css('height','auto');
  select.focusout(function(){
      select.attr('size','1');
  });
}

旁注:作为A.Wolff points out,您的函数会在每次调用选项时附加 focusout处理程序。您只需要一个

我会完全删除处理程序的那一部分,并用一个focusout替换它:

function showAllSelectOpts(select)
{
  var selectLength = select.children().length;
  select.attr('size',selectLength);
  select.css('height','auto');
}
$('select')
  .on('focus',function(){
    showAllSelectOpts($(this));
  })
  .on('focusout', function(){
    $(this).attr('size', '1');
  });

另请注意,我在var中为selectLength添加了showAllSelectOpts(实际上,您可以完全删除变量);如果没有一个,代码就会成为The Horror of Implicit Globals 的牺牲品(这是我贫血的小博客上的帖子)。请务必声明您的变量。

答案 1 :(得分:1)

jQuery事件监听器回调将this设置为触发事件的HTMLElement。

在你的回调中,你期待一个jQuery对象,但你有HTMLElement。

您可以将HTMLElement传递给jQuery构造函数并将其传递给showAllSelectOpts函数

$('select').on('focus',function(){
  showAllSelectOpts($(this));
}) 

答案 2 :(得分:0)

试试这个:

var myselect  = $('select');

$('select').on('focus',function(){
  showAllSelectOpts(myselect);
})  

更好的方法可能是:

$('select').on('focus',function(event){
  showAllSelectOpts($(event.target));
})  

为什么您的代码无效?

$('select').on('focus',function(){
  //Here `this` is bound with the dom html element, not the $('select') object.
  showAllSelectOpts(this);
})  

答案 3 :(得分:0)

试试这个 -

$('select').on('focus',function()    { 
showAllSelectOpts($(this)); }) 

答案 4 :(得分:0)

以前的答案解决了这个问题。我只是在这里添加创建它作为扩展,因为private void button1_Click(object sender, EventArgs e) { if (dbcontext != null) dbcontext.Dispose(); dbcontext = new mcshonsey_FinalProject.UserShowDBEntities(); dbcontext.UserTables .OrderBy(entry => entry.UserID) .Load(); if (string.IsNullOrEmpty(textBox1.Text) || string.IsNullOrEmpty(textBox2.Text)) { MessageBox.Show("You must enter a password or username", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); textBox1.Focus(); } /*else { ShowSelectForm ssf = new ShowSelectForm(this, sort); Hide(); ssf.Show(); }*/ var user = from use in dbcontext.UserTables where use.UserName == textBox1.Text && use.Password == textBox2.Text select use; if (Enumerable.Count(user) > 0) { ShowSelectForm ssf = new ShowSelectForm(this, sort); Hide(); ssf.Show(); } else { MessageBox.Show("Incorrect username and/or password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); textBox1.Focus(); } } 指的是一个方法调用的原型。

$(this)