2012-07-11 64 views
0

我想实现一个JSON调用来模拟某个AJAX面板不是可行选项的某个页面上的AJAX。在Windows 2008上的JSON语法错误

当从下拉列表中选择一个状态并填充Counties下拉列表时,我希望调用我的.aspx页面。

在我的国家下拉

,我有这样的电话:

的onchange = “jsonDropDownLoader( '县',这个 'Content2_DDLCounties')”

这一呼吁是在页面上,该代码是在这里:

function jsonDropDownLoader(sType, oParent, oChild) { 
    var lstrChild = document.getElementById(oChild); 
    var lstrFilter = "" 

    if (oParent.value > "") { 
    lstrFilter = oParent.value 
    } 

    lstrChild.options.length = 0; 
    if (oParent.value > "") { 
    var JSONobject = {}; 
    var http_request = new XMLHttpRequest(); 
    url = "/AltairWeb.NET/RS/jsonDropDownLoader.aspx?TYPE=" + sType + "&FILTER=" + lstrFilter 
    http_request.open("GET", url, false); 
    http_request.onreadystatechange = function() { 
     var done = 4, ok = 200; 
     if (http_request.readyState == done && http_request.status == ok) { 
      JSONobject = JSON.parse(http_request.responseText); 
     } 
    }; 
    http_request.send(null); 
    var JSONarray = eval('(' + http_request.responseText + ')').data 
    for (var i = 0; i < JSONarray.length; ++i) { 
     var optn = document.createElement("OPTION"); 
     optn.text = JSONarray[i].text; 
     optn.value = JSONarray[i].value; 
     lstrChild.options.add(optn); 
    } 
    } 
} 

它返回一个字符串,然后我用它填充县下拉菜单。

我正在收回数据,但它不会在您的QA服务器上呈现。使用开发人员工具与IE8,我可以看到,我有这条线上的错误:

JSONobject = JSON.parse(http_request.responseText); 

它说,JSON没有声明。

它说,我也有一个语法错误,在这条线:

var JSONarray = eval('(' + http_request.responseText + ')').data 

这工作完全在我的开发。但是,我的开发盒上有WinXP/IIS 5,而我们的QA服务器是带有IIS7.5的Win2008服务器。我们有新的开发盒,但在那之前,我坚持使用XP机器。

由于它在本地工作,它似乎必须是与QA服务器上的Windows或IIS安全问题,可能与http_request调用,但我找不到任何通过谷歌帮助我解决这个问题。

我知道我已经看到JSON.parse在IE9之前不被IE支持的帖子,但是当我指向我的开发服务器时,这种方式完全适用于IE8,但是当我指向QA服务器时,似乎并不是浏览器问题。 任何想法?

+1

是否打开兼容模式?在IE7中没有定义“JSON”。顺便说一句,这与Windows 2008无关,但与IE8,而不是与其选项。 – MaxArt 2012-07-11 22:25:02

+0

请[不要添加签名或标语到您的帖子](http://stackoverflow.com/faq#signatures)。 – meagar 2012-07-12 16:09:43

回答

1

JSON.parse()是您的浏览器,而不是服务器的功能。

你是肯定区别是服务器...而不是你的客户端浏览器?

你也可以考虑使用类似jQuery的东西(它既可以简化你的编码,又可以帮助调解像这样的跨浏览器问题)。例如:

  • Parse JSON in JavaScript?

    变种JSON = '{ “结果”:真, “计数”:1}', OBJ = JSON & & JSON.parse(JSON)|| $ .parseJSON(JSON);

+0

这不是客户端浏览器。我在我的笔记本电脑上,并在每个环境中打开它自己的选项卡。所以同样的浏览器,它在一个环境中工作,而不在另一个环境中。 如果我使用Firefox btw,我会得到相同的结果。它指向我的开发服务器时有效,但指向QA服务器时不起作用。这就是我认为这不是IE问题的原因。 – tkflick 2012-07-11 22:43:33

+0

1)如果你可以发布* exact *错误信息,那肯定会很有用。 2)“JSON未定义”错误强烈暗示浏览器...但这可能只是一个红鲱鱼。我不知道。 3)无论如何,如果你可以使用jQuery(或Dojo),生活会更加快乐......恕我直言...... – paulsm4 2012-07-12 00:31:11

+0

嘿......你是正确的先生,这是一个红鲱鱼!看到我的帖子上面。我是json的新手,我甚至没有写这个代码。编写它的开发人员在夏威夷待了几个星期,所以我最终成为了一个我们部署它之后必须解决的问题,而且在QA中失败了。 – tkflick 2012-07-12 16:05:53

1

首先,您使用的是同步调用(xhr.open('GET', url, false)),并且您还使用onreadystatechange。这是错误的。选择一个或另一个。

https://developer.mozilla.org/en/xmlhttprequest

enter image description here

其次,检查JSON浏览器的支持。见https://stackoverflow.com/a/891306/48082。 如果您不确定,请使用json.org的json2.js

最后,不使用eval。使用适当的JSON库。

+0

正如我所说,我知道我的浏览器支持它,因为它指向开发环境时工作得很好。我不知道同步呼叫/ onreadystatechange问​​题,谢谢,我会改正这一点。 – tkflick 2012-07-12 15:49:22

+0

我终于搞清楚了问题所在。这基本上是一个id10t错误。 IIS目录结构在本地上与在实际的Web服务器上不同。在本地,我们的网址是http://localhost/AltairWeb.Net/但是在网络服务器上它会是http://qa.altair.org/所以实际的AltairWeb.Net文件夹被qa.altair.org取代。这就是为什么当我直接打开代码隐藏页面时,它会返回记录,但不会通过javascript/json调用... json调用实际上是在http_request.responseText语句中引发未找到页面错误。 感谢您的帮助。 – tkflick 2012-07-12 15:49:37