将“this”传递给$ .trim()函数

时间:2011-08-18 17:27:39

标签: jquery this

Jquery in Action具有以下代码:

$('#someField').val($.trim($('#someField').val()));

但是,当我按如下方式重写时,代码不起作用。

$('#someField').val($.trim($(this));

任何人都可以帮助我理解为什么这不起作用吗?

6 个答案:

答案 0 :(得分:2)

有两个原因:

  • trim接受一个字符串,而不是一个jQuery对象。你至少需要$(this).val()

  • 选择器未封装函数,因此this实际上并未设置为您选择的对象。 this无论如何都是它。

最好的解决方案是:

var $obj = $('#someField');
$obj.val($.trim($obj.val()); // trim object's value

答案 1 :(得分:0)

当您执行该代码时,this会引用您所在职能的所有者。

$(this),永远不会解析为$('#someField').val()将会发送的文字。

答案 2 :(得分:0)

$('#someField').val()检索某个字段的文本,因此修剪在处理字符串时起作用。

$(this)只是一个jQuery对象(this引用它所调用的上下文),因此trim没有任何意义。

答案 3 :(得分:0)

$.trim期望接收一个字符串作为参数。 $(this)不是字符串。

答案 4 :(得分:0)

您需要使用另一个函数才能更改this关键字。例如:

$('div').slideToggle(1000, function() { // notice the function keyword
    // Now the this keyword has changed, notice the indentation due to the function
    $(this).css('border', '1px solid black'); // Here's how we use this
});

当然,前一个例子中this更改为我们动画的对象的事实是jQuery为我们做的事情,它不是自动的。虽然这样的事情有可能奏效:

$('#someField').val(function() { $.trim($(this).val()); } );

jQuery选择不允许您将函数作为参数传递给.val()方法,因为它通常不会以这种方式使用,因此您尝试的方法不起作用。

编辑:

现在我考虑一下,不难实现:

var _val = $.fn.val;
$.fn.val = function(a) {
    return (!a || typeof a === 'string') ?
        _val.call(a) :
        _val.call(this, a.call( this.val() ));
}

Duck Punching by Paul Irish (read it!)

答案 5 :(得分:-1)

点击$ .trim时,this不再是#someField元素,而是DOMWindow。这是因为$位于DOMWindow而不是#someField元素