我有以下CakePHP代码:
<tr class="tr_clone">
<td><?php echo $this->Form->input('items][',array('label'=>false,'options'=>$items,'class'=>'items')); ?> </td><td><?php echo $this->Form->input('price][',array('class'=>'price','label'=>false)) ?></td><td><?php echo $this->Form->input('unit][',array('class'=>'unit','label'=>false)) ?></td>
</tr>
使用jQuery克隆我的.tr_clone
。
在呈现HTML之后以及在克隆.tr_clone
数据一次之后生成以下HTML。
<table>
<tr class="tr_clone">
<td>
<div class="input select">
<select id="InvoiceItems][" class="items" name="data[Invoice][items][]">
<option value="3">Item1</option>
<option value="4">Item2</option>
<option value="5">Item3</option>
</select>
</div>
</td>
<td>
<div class="input text">
<input type="text" id="InvoicePrice][" class="price" name="data[Invoice][price][]">
</div>
</td>
<td>
<div class="input text">
<input type="text" id="InvoiceUnit][" class="unit" name="data[Invoice][unit][]">
</div>
</td>
</tr>
<tr class="tr_clone">
<td>
<div class="input select">
<select id="InvoiceItems][" class="items" name="data[Invoice][items][]">
<option value="3">Item1</option>
<option value="4">Item2</option>
<option value="5">Item3</option>
</select>
</div>
</td>
<td>
<div class="input text">
<input type="text" id="InvoicePrice][" class="price" name="data[Invoice][price][]">
</div>
</td>
<td>
<div class="input text">
<input type="text" id="InvoiceUnit][" class="unit" name="data[Invoice][unit][]">
</div>
</td>
</tr>
</table>
现在,我在focusout
上发生select
事件时发送了一个AJAX请求。成功完成AJAX请求后,我想填充我的.price
字段。
问题在于,当我发送AJAX请求时,我无法在选择ie .price
之后再次关注下一个元素,并用返回值填充它。
以下是我的jQuery代码:
$("table").on('focusout','.items',function(){
var id=$('.items option:selected').val();
$.ajax({
method:'POST',
url:"get_price",
data:{id:id},
success:function(result){
$(this).closest('.tr_clone').find('.price').text(result));
}
});
});
这是fiddle.
提前致谢。
答案 0 :(得分:4)
内部success
回调上下文是ajaxSettings
对象。这意味着此回调函数中的this
将返回$.ajaxSettings
。
如果您想更改success
回调的上下文,例如this
为您提供DOM元素,请指定相应的ajax选项:
$("table").on('focusout','.items',function(){
var id=$('.items option:selected').val();
$.ajax({
context: this, // <- equals to $("table")
method:'POST',
url:"get_price",
data:{id:id},
success:function(result){
$(this).closest('.tr_clone').find('.price').text(result));
}
});
});
答案 1 :(得分:1)
我认为安德烈所得到的是你职能中this
变化的背景
success:function(result){
$(this).closest('.tr_clone').find('.price').text(result));
}
当你希望它引用你的this
对象时,问题是jQuery
现在引用你的匿名函数。所以我们需要做的是proxy我们想要的背景
$("table").on('focusout','.items',$.proxy(function(){
var id=$('.items option:selected').val();
$.ajax({
context: this, // <- equals to $("table")
method:'POST',
url:"get_price",
data:{id:id},
success:$.proxy(function(result){
$(this).closest('.tr_clone').find('.price').text(result));
}, this)
});
}, this));
现在,您的this
引用应引用正确的jQuery
对象