我正在使用jquery发出ajax请求,以确定在单击特定单选按钮时是否应该打开div。我希望打开的div直接显示在所选的单选按钮下。我有以下似乎很有效:
<script language="javascript">
$(document).ready(function(){
$(".option_select").click(function() {
$(this).next().after($('#show_pop'));
$.ajax({
dataType: 'jsonp',
url: "/jrequest",
data: {
Action: "Do",
Option: po,
},
success: function (response) {
if (response['SomeResponse']) {
$('#show_pop').slideDown("slow");
} else {
$('#show_pop').hide();
}
},
error: function (xmlhttp) {
console.log(xmlhttp);
}
});
}
});
});
</script>
<input type="radio" name="Option1" class="option_select" value="Option1" /> Option 1
<input type="radio" name="Option2" class="option_select" value="Option2" /> Option 2
<input type="radio" name="Option3" class="option_select" value="Option3" /> Option 3
我不明白为什么我不能把“后”作为ajax“成功”的一部分?例如,如果我移动线
$(this).next().after($('#show_pop'));
到这里:
....
success: function (response) {
if (response['SomeResponse']) {
$(this).next().after($('#show_pop')); // This line does not seem to work here
$('#show_pop').slideDown("slow");
} else {
$('#show_pop').hide();
}
},
....
然后我的div只是在我的表单上面打开,而不是在每个选项下面。有人可以解释原因吗?
TIA!
答案 0 :(得分:4)
this
不是jQuery对象,而是调用中使用的ajax设置($.ajaxSettings
与此$.ajax
的调用合并。)
有多种解决方案:
this
与其他语言一样,JS允许您重新分配this
变量,该变量具有特殊含义,具体取决于范围。其他变量名称可能没有这样的限制,可以在较低的范围内自由使用。
$(".option_select").click(function() {
var $this = $(this);
/* snip */
success: function () {
$this.next();
}
Function.bind
或$.proxy
Function.bind
允许您设置稍后调用的函数的上下文。这类似于.call
和.apply
,但它不会立即调用该函数。由.bind
takes precedence over one set by .call
/.apply
设置的上下文,因此可以与ajax回调一起使用(我假设稍后使用.call
,但我还没有验证这一点。)
jQuery有一个方法$.proxy
可以执行相同的操作,但与Function.bind
不可用的浏览器兼容。它的工作方式略有不同,它是一个jQuery方法,而不是Function
方法,但在这种情况下并不重要。
success: function () { /* your code */ }.bind(this)
success: $.proxy(function () { /* your code */ }, this)
两种方法都返回一个函数。
我个人认为这是最正确的解决方案,尽管它们的工作方式基本相同。
$.ajax
context
您通常可以使用$.ajaxSettings
进行设置,但在这种情况下可能没有意义。此设置为$.ajax
的所有回调设置上下文。
$.ajax({
context: this,
this
。请注意,$.ajax({
声明不会创建自己的范围。因此可以安全地做到:
$(".option_select").on("click", function () {
$.ajax({success: function () {}.bind(this)});
});
上面,this
仍然是jQuery设置为.click
回调的上下文的DOM元素。创建的唯一其他范围是function () {}
,但您可以使用this
。