Jquery in Action具有以下代码:
$('#someField').val($.trim($('#someField').val()));
但是,当我按如下方式重写时,代码不起作用。
$('#someField').val($.trim($(this));
任何人都可以帮助我理解为什么这不起作用吗?
答案 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() ));
}
答案 5 :(得分:-1)
点击$ .trim时,this
不再是#someField
元素,而是DOMWindow
。这是因为$
位于DOMWindow
而不是#someField
元素