首页 > 解决方案 > 将ajax调用的结果插入页面代码时的范围问题

问题描述

我有从 Ajax 调用返回的数据,但需要将变量传入或传出 Ajax onSuccess 函数以将结果插入我的页面。我很确定这是一个范围问题。

我昨天在这里发布了一个复杂的问题,主要是关于其中的 Ajax 部分,而那部分现在正在工作 - 我得到了正确的结果。我可以通过两种方式将它插入到我的页面代码中,但一种是从 onSuccess 函数中获取变量值;另一个需要将变量值放入其中!我不能让他们中的任何一个工作。这是代码的精简版本:

var base = 'http://10.0.1.2:90/~dvds/';

// initialization routines
document.observe ('dom:loaded', function() {
    // set up handler for variable numbers of selects
    var addselects = $$('.addselect');
    for (var i = 0; i < addselects.length; i++) {
        var addselect = addselects[i];
        addselect.onchange = newSelect;
    }
});

// handler for adding new field to array
function newSelect() {
    var thisid = this.id;
    var newhtml;

    var url = base + 'ajaxtest';
    // send request to do the business
    var myAjax = new Ajax.Request (url, {
        method: 'post',
        onSuccess: function (req) {
            var xml = req.responseXML;
            var id = xml.getElementsByTagName('id')[0].firstChild.nodeValue;

            if (id) {
                newhtml = '\t\t<li>\r\t\t\t<select class="addselect" name="newlist" id="newlist" />\r\t\t\t\t<option value="" selected="selected"></option>\r';
                // loop
                var newid, newname;
                var ids = xml.getElementsByTagName('id');
                var names = xml.getElementsByTagName('name');
                for (var i = 0; i < ids.length; i++) {
                    newid = ids[i].firstChild.nodeValue;
                    newname = names[i].firstChild.nodeValue;
                    newhtml += '\t\t\t\t<option value="' + newid + '">' + newname + '</option>\r';
                }
                newhtml += '\t\t\t</select>\r\t\t</li>\r';
// alert (thisid);
                $('thisid').up('ul').insert (newhtml);
            }
            else {
                alert (’ng');
                newhtml = '<li>No good.</li>';
            }
        },
        onFailure: function() {
            alert ('Script failure.');
            newhtml = '<li>No good.</li>';
        }
    });

// alert (newhtml);
//  if (newhtml) {
//      this.up('ul').insert (newhtml);
//  }
}

将变量 thisid 建立为 this.id 后,我不明白为什么 $('thisid') 在 $('thisid').up('ul').insert (newhtml); 行中不起作用 - 特别是 thisid 的值确实正确显示在我为测试而输入的警报中(已注释掉)。为什么是这样?如果我将 newhtml 放入该警报中,它也是正确的。

鉴于这似乎不起作用,我尝试了将 newhtml 的值传递出去(已在顶部声明它)并将其插入页面中最后一个被注释掉的代码块的替代方法 - 但这不起作用任何一个。

我哪里错了?

标签: ajaxscopeprototypejs

解决方案


推荐阅读