$ .post数据类型“script”完成后访问局部变量

时间:2010-05-26 12:36:16

标签: jquery scope

我有两个列表,一个在右边,一个在左边。当我点击左侧的节点时,它会执行以下操作:

  

1)AJAX请求$ .post的内容   服务器的节点

     

2)如果交易成功   服务器,节点移动到列表   在右边通过jQuery

发布到服务器:

$.post($(F).attr('action'), $(F).serialize(), null, "script");

将节点移动到另一个列表:

moveNode(element, to_list);

'element'和'to_list'是局部变量。我可以使moveNode成为回调函数,但如果事务不成功,我将不得不发布一堆错误消息,并且我的代码中的内容变得笨拙。我也希望服务器生成错误消息。

有没有办法在服务器响应中调用moveNode()?

2 个答案:

答案 0 :(得分:2)

可能做你想做的事,但我不推荐它。方法如下:

function doTheThing() {
    var element, to_list;
    /* code here that gets element and to_list */

    // Modify the post to use a callback and the "text" data type
    $.post($(F).attr('action'), $(F).serialize(), handleMove, "text");

    // Here's the callback
    function handleMove(data) {
        eval(data);
    }
}

这是有效的,因为eval非常特殊,并且它在调用它的范围内执行(以这种方式有点神奇),因此文本eval中的代码评估有权访问调用eval的范围内的所有变量。

略微偏离主题,但我建议采用基于数据的方法。也许:

function doTheThing() {
    var element, to_list;
    /* code here that gets element and to_list */

    // Modify the post to use a callback and the "json" data type
    $.post($(F).attr('action'), $(F).serialize(), handleMove, "json");

    // Here's the callback
    function handleMove(data) {
        if (data.errorMessage) {
            /* ...show the error... */
        }
        else {
            moveNode(element, to_list);
        }
    }
}

...服务器要么返回:

{"errorMessage": "Don't move it!"}

{"success": true}

或在您的环境中有意义的任何内容。哎呀,如果它真的只是“它工作”或“这是一个错误”,你可以使用一个文本协议,其中“OK”意味着好,其他任何东西都是一个错误信息(互联网上充满了基于文本的协议) 。我更喜欢更多的结构,但关键是你有选择。

我会发现这种方法更容易维护。当您开始在层之间来回传递代码时,代码依赖于知道范围内变量的名称,这似乎是一个主要的紧密耦合问题。

答案 1 :(得分:1)

您可以使用错误消息解析回调中的服务器响应(可能是json编码),并使用布尔值来判断事务是否成功。然后根据响应运行你的moveNode()。

$.post($(F).attr('action'), $(F).serialize(), function(response) {
   if (response.successful) {
     alert('yay');
     moveNode(element, to_list);
   } else {
     alert('Error: ' + response.error);
   }
}, "json");