Javascript对象文字,POST问题

Javascript Object literal, POST problems

本文关键字:POST 问题 文字 对象 Javascript      更新时间:2023-09-26

我正试图让autocomplete-rails.js与Ajax、一起在rails中工作

i具有以下功能

<script type="text/javascript">
function reply_click(clicked_id)
{
 var x = "work";
 var y = "monday"
 alert(y)
 $.ajax({
  type    : 'POST',
  url     : "/whens", 
  data: { y : x},
success : function(data) {
            alert(data);          
          },  
});
}
</script>

我得到的问题是这会返回

"y"=>"work"

我希望它返回y的值,而不是

"monday"=>"work"

此外,如果我做以下

<script type="text/javascript">
function reply_click(clicked_id)
{
 var x = "work";
 var y = "monday"
 var data = {};
 data[x] = y;
 $.ajax({
  type    : 'POST',
  url     : "/whens", 
  data,
success : function(data) {
            alert(data);          
          },  
});
}
</script>

它似乎返回了我得到的问题是它返回

"term"=>"work"

知道我如何让它返回y 的内容吗

如果键没有引号,并不意味着它使用了变量。

正如你提到的,正确的方法是

var data = {};
data[y] = x;
$.ajax({
  type    : 'POST',
  url     : "/whens", 
  data    : data,
  success : function(data) {
            alert(data);          
          },  
 });

注意,我将其更改为data[y] = x;

如果您想使用ajax加载一些数据,作为回报,这些数据可以用于自动完成,那么请使用ajax加载字符串数组。例如。控制器内do-

def get_characteristics
  unless ['Threads', 'Note'].include?(params[:name])
  @characteristics = Category.all.collect(&:characteristic)
  respond_to do |format|
    format.js{}
  end
end

在get_characteristics.js.haml中(例如在haml中)

var characteristics = #{@characteristics.to_json};
$('#characteristic').autocomplete( //the id of the text fields where u want autocomplete
  source: characteristics  //the array of string that u want for autocomplete
)

了解更多信息http://jqueryui.com/demos/autocomplete/

变量作为关联数组中的索引-Javascript

> var x = "work"
> var y = "monday"
> data= {}
{}
> data[x]=y
'monday'
> data
{ work: 'monday' }

你不能,第二个片段(data[y] =)是唯一的方法。原因如下:

像JS中的所有东西一样,对象文字是一个对象(duh),并且具有属性。全局作用域中声明的所有变量都是全局(无名称)对象的属性。您拥有的唯一(半)真变量是您在闭包范围中声明的变量。因此,从这个角度来看,在构造对象文字时不应该引用属性是理所当然的
我甚至认为,在对象文字的声明中允许引用属性是错误的,或者至少应该劝阻这样做。

JS是一种很棒的语言,被一堆不一致、怪癖和糟糕的想法所掩盖。可悲的是,如果你只知道gunk(几乎每个人都知道gunk,很少有人知道真正的语言以及它的力量在哪里),那么那些一致且良好的罕见功能一开始看起来像是一个障碍。值得庆幸的是,你有大量的构造,可以让你做你想做的事情,并且做得很好。

在这种情况下,您可以将其全部写出来data[a] = b; data[c] = d;...或者您可以使用幂构造函数(google it)
另一个选项只是一个非常小的循环,假设您的数据对象将使用传递给函数的参数填充:

var data = {};
var argArray = Array.prototype.slice.apply(arguments,[0]);//returns array of arguments
var duo;
while(duo = argArray.splice(0,2))
{
    data[duo[0]] = duo[1];
    if (argArray.length < 2)
    {
        break;
    }
}

只是举个例子。当涉及到对象时,我建议你(和其他人)研究一下crackfords构造,以及函数调用在JS中的含义:函数不仅仅被调用,而是创建了call-object