我读过一些文章,谈论复选框总是返回一个错误的状态,但没有发现任何关于我自己的问题。
所以,这是脚本:
<script type="text/javascript">
function update_contact(id, name) {
alert("idCont : " + id + "\n nameCKB : " + name + "\n state : "
+ $(this).attr('checked'));
var a = location.pathname.substring(1).split('/')
$.ajax({
url : '@Url.Action("update_contact")',
type : 'POST',
data : {
name : name,
isChecked : $(this).is(':checked'),
idOpp : a[2],
idCont : id
},
success : function(result) {
}
});
};
</script>
这是复选框的代码:
@If mail = False Then
@<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed')" />
Else
@<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed')" checked="checked" />
End If
这是服务器生成的代码:
<input name="mailed" id="mailed" class="mailed" onclick="update_contact(1 , 'mailed')" type="checkbox">
一开始,我使用了一个Html帮助器。它就像那样回归:
<input id="mailed" name="mailed" onclick="update_contact(1 ,'mailed')" value="true" type="checkbox">
<input name="mailed" value="false" type="hidden">
虽然这是由于第二次输入,它总是返回一个错误的状态。
答案 0 :(得分:1)
试试这个(工作小提琴:http://jsfiddle.net/Ac3kd/):
<script type="text/javascript">
function update_contact(id, name) {
var source = $('#'+name);
alert("idCont : " + id + "\n nameCKB : " + name + "\n state : " + source.attr('checked'));
var a = location.pathname.substring(1).split('/')
$.ajax({
url: '@Url.Action("update_contact")',
type: 'POST',
data: {
name: name,
isChecked: source.is(':checked'),
idOpp: a[2],
idCont: id
},
success: function (result) {}
});
};
</script>
答案 1 :(得分:1)
问题可能是this
不是您认为的那样。尝试将对单击的复选框的引用显式传递给您的函数:
@If mail = False Then
@<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed', this)" />
Else
@<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed', this)" checked="checked" />
End If
然后:
function update_contact(id, name, cb) {
alert("idCont: " + id + "\n nameCKB: " + name + "\n state: " + cb.checked);
// you could say $(cb).attr("checked"), but cb.checked is more efficient
// and easier to read
var a = location.pathname.substring(1).split('/')
$.ajax({
url: '@Url.Action("update_contact")',
type: 'POST',
data: {
name: name,
isChecked: cb.checked,
idOpp: a[2],
idCont: id
},
success: function (result) {}
});
};
或者使用jQuery分配点击处理程序,它会正确设置this
。您可以将@item.idContact.toString()
放在value
属性中,然后在处理程序中使用this.value
访问它:
@If mail = False Then
@<input type="checkbox" name="mailed" id="mailed" class="mailed" value="@item.idContact.toString()" />
Else
@<input type="checkbox" name="mailed" id="mailed" class="mailed" value="@item.idContact.toString()" checked="checked" />
End If
然后:
$(document).ready(function() {
$("#mailed").click(function() {
alert("idCont: " + this.value + "\n nameCKB: " + this.name + "\n state: " + this.checked);
// you could say $(this).attr("checked"), but this.checked is more efficient
// and easier to read
var a = location.pathname.substring(1).split('/')
$.ajax({
url: '@Url.Action("update_contact")',
type: 'POST',
data: {
name: this.name,
isChecked: this.checked,
idOpp: a[2],
idCont: this.value
},
success: function (result) {}
});
});
});
(注意:我实际上并不知道VB / razor语法,我只是猜测那部分。)
答案 2 :(得分:1)
Mamoo是正确的:$ .ajax是一个jQuery对象,因此$(this)
不会指向调用update_contact函数的元素。我没有像mamoo那样创建两个变量(source
ans a
),而是在var data
位之前创建$.ajax
:
function update_contact(id,name)
{
var data = {name: name,
isChecked: $(this).is(':checked'),
idOpp: location.pathname.substring(1).split('/')[2],
idCont: id};
$.ajax({
url: '@Url.Action("update_contact")',
type: 'POST',
data: data,
success: function (result) {}
});
}
修改强>
让$(this)
工作,而不是传递名称和id参数 - 这意味着您已经在某处选中了复选框元素,并且您正在以类似于此的方式调用该函数:
update_contact($(elem).attr('id'),$(elem).attr('name'));
只需使用更短,更清洁,更强大的功能:
update_contact.call($(elem));
或者将内联onclick="update_contact()"
更改为onclick="update_contact.call(this)"
。就这样,没有$符号或括号......