Javascript 为什么这个JS变量在AJAX之后会失去价值?

Javascript 为什么这个JS变量在AJAX之后会失去价值?,javascript,jquery,ajax,Javascript,Jquery,Ajax,考虑一下这个片段: $('.job-details-apply').live('click', function () { var url = $('#apply-job-url').val(); var id = $(this).attr('value'); var selected = $(this); $.ajax({ url: url, data: { id: id }, success: function

考虑一下这个片段:

$('.job-details-apply').live('click', function () {
    var url = $('#apply-job-url').val();
    var id = $(this).attr('value');
    var selected = $(this);
    $.ajax({
        url: url,
        data: { id: id },
        success: function (data) {
            $(selected).html('Test!');//selected is undefined at this point
        },
        error: function () {
        }
    });
    return false;
});
所选的
var
在成功处理程序中未定义。我是否需要在单击功能之外对其进行范围界定?e、 g

var selected = null;
$('.job-details-apply').live('click', function () {
    selected = $(this);
    //blah
}
在我看来,这有点不对


编辑:如果从控制器id返回的值a
JsonResult
(目前它只是一个bool)

产生差异,则无需更改所选
变量的声明方式。它将在ajax函数的成功处理程序中很好地使用

jQuery ajax成功处理程序中偶尔会出现混淆,但这不是问题的原因,
this
的值在ajax成功处理程序中会有所不同(它将指向一个ajax对象),但这不会影响对父函数中声明的变量的访问,因为它们可以直接使用,而无需使用
this


因此,既然您所问的不是问题,那么如果您确实对所选的
变量有问题,那么原因一定是您迄今为止在显示的代码中没有向我们披露的其他内容。我们可能需要看到一个更完整的示例,说明您在哪里遇到了此问题,甚至需要一个指向工作页面的链接,以便设置断点并检查问题。

是的,需要将此
存储在变量中

$('.job-details-apply').live('click', function () {
  var url = $('#apply-job-url').val();
  var id = $(this).attr('value');
  var _this = this;
  $.ajax({
      url: url,
      data: { id: id },
      success: function (data) {
          $(_this).html('Test!');
      },
      error: function () {
      }
  });
  return false;
});
当你这样做的时候

var selected = $(this);
selected
现在是从您单击的元素中构建的jQuery对象(
是您单击的元素的DOM对象;它没有任何jQuery方法;
selected
获得jQuery方法)

selected
此时当然应该定义,因为它是合并到闭包中的外部变量。但是,
$(选中)
解析为试图将已经是jQuery对象的内容传递给jQuery构造函数,jQuery可能会有点困惑,因为jQuery构造函数通常希望看到DOM对象(转换为jQuery对象),一个HTML字符串(构建相应的DOM片段并转换为jQuery对象)、函数(加载DOM时运行它)或扩展CSS选择器(将其转换为表示页面中一个或多个元素的jQuery对象)。因此,
$(选定)
的结果没有正式定义

显然,如果这是问题的根源,那么将代码更改为
selected.html(…)
至少会给出不同的结果,并且最好能工作。
},但有人告诉我,
.live()
已被弃用,取而代之的是
.on()
.delegate()
为什么返回null?它永远不应该返回null,它应该是
未定义的
或者
不是对象
,但永远不
null
。我不认为
选中的
未定义的
,除非您重新声明它。您如何测试该值,以及您在成功处理程序中做了什么?对不起s你是对的-它是未定义的(将编辑)(这里是凌晨3点10分lol)无法复制:为什么是否决票?OP询问的语法没有问题,我已经回答了提出的问题。此外,OP的代码中没有任何其他内容会导致OP描述的问题,因此我已经告诉他们。-1:似乎不是真的:。
foo
的值不会改变在不同的上下文中,即使初始化为
this
@arxanas,您的示例说明
this
在调用
onclick
错误处理程序之前由浏览器设置,并且说明
foo
在回调中保持其值(这正是我在回答中所说的).这与我在回答中所说的没有任何关系。因此,我不确定你认为你证明了什么,或者为什么你投了反对票(如果你这样做了)。你说,
这个值在你的ajax成功处理程序中会有所不同,
,这被回调证明是不真实的。@arxanas-如果这是你反对的,我已经修改了我的答案,因此关于
这个
的评论只是附加的信息,这是我一直想要的。y在哪里您从中获取e.Data.AC?您当前的答案基本上与原始代码相同。您将
保存到
\u此
中。他们保存了
$(此)
into
selected
。为什么你认为OP的代码不起作用,而你的代码会起作用?抱歉@glosrob,event.data对此不起作用。需要将其存储在变量中。我没有说他的代码不起作用。我说的是并显示了需要存储
this
@jfriend00的内容。事实上,OP问他是否必须删除在
.live
回调函数之外重新设置变量,答案是否定的。他的代码应该可以正常工作。
$.ajax({
    url: url,
    data: { id: id },
    success: function (data) {
        $(selected).html('Test!');//selected is undefined at this point