【问题标题】:Accessing local variables after a $.post of datatype "script" has completed在数据类型“脚本”的 $.post 完成后访问局部变量
【发布时间】:2010-05-26 12:36:15
【问题描述】:

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

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

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

发布到服务器:

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

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

moveNode(element, to_list);

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

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

【问题讨论】:

    标签: jquery scope


    【解决方案1】:

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

    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”意味着好的,其他任何东西都是错误消息(互联网上到处都是基于文本的协议) .我更喜欢更多的结构,但关键是你有选择。

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

    【讨论】:

    • 'eval' 几乎总是一个坏主意。
    • 这应该已经发生了,数据类型为"script":github.com/jquery/jquery/blob/master/src/ajax.js#L669
    • 这不适用于公共网站。那么你的首选方法是什么? JSON?我的想法是“脚本”已经在这样做了。
    • @Matthew:我完全同意。我的第一句话中有一个很大的“不”!当我的意思当然是“但我不会推荐它”时,它读作“但我会推荐它”。 :-)
    • @Dex:是的,我会使用数据(JSON、XML、文本等)在层之间传输消息,而不是代码;当您提出问题时,我正在添加该建议。 :-) 以这种方式传输代码是一个紧密耦合的问题。 (不管是内部应用还是公共网站。)
    【解决方案2】:

    您可以在回调(可能是 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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多