因为IE8调用外域url时,会有一个警告,所以,我打算用script的src来回调,在做一个小实验,代码如下
function loadJs (file, callback) {
var head = document.getElementsByTagName('head')[0];
var js = document.createElement('script');
js.setAttribute('type', 'text/javascript');
js.setAttribute('src', file);
js.setAttribute('charset','gbk'); head.appendChild(js);
js.onload = js.onreadystatechange = function() {
if (js.readyState && js.readyState != 'loaded' && js.readyState != 'complete') return;
js.onreadystatechange = js.onload = null;
if (callback) callback();
}
return false;
}
测试1,调用百度的suggest数据,
loadJs("http://suggestion.baidu.com/su?wd=test", window.baidu={},window.baidu.sug=function(a) {alert(a.s);});
数据格式是:
window.baidu.sug({q:"test",p:true,s:});
正常测试2,调用weather.com.cn的天气数据
loadJs("http://m.weather.com.cn/data/101200101.html", function() {alert();});
数据格式是:
{"weatherinfo":{"city"。。}}
问题是,我不知道,该如何得到obj,请指教,

解决方案 »

  1.   

    换句话说,楼主是在不确定json对象的key的前提下,如何来获取value吧?
    给你点思路。1、数据格式为:
    oJson = {
        "weatherinfo" : {
             "city" : "beijing",
             "weather" : "-25C"
         }
    }
    那么获取可以这样的方式获取某城市的天气信息:
    alert("城市:" + oJson["weatherinfo"]["city"] + ",天气:" + oJson["weatherinfo"]["weather"]);
      

  2.   


    2、普通的json对象解析:
    oJson = {
        a : "a",
        b : "b",
        c : "c"
    };
    那么可以通过这样的方式来取得键值:
    for(var attr in oJson){
        alert(oJson[attr]);
    }
      

  3.   

    问题在于,我返回的数据是{"weatherinfo":{"city"。。}},而不是oJson={"weatherinfo":{"city"。。}}也就是说,我不知道如何得到你所说的oJson对象
      

  4.   

    [Code name="HTML"]
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title><script type="text/javascript">
    function loadJs (file, callback) { var xmlHttp = createXmlHttp(); xmlHttp.open("GET", file, true); xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) { var jsonObj = null;
                
    eval("jsonObj = " + xmlHttp.responseText);

                 callback(jsonObj);              // test
                 for (var prop in jsonObj) {
    alert(prop);
                }
            }
            } };
    xmlHttp.send(null);
    } function createXmlHttp() { var tryThese = [function() {return new XMLHttpRequest();},
                    function() {return new ActiveXObject('Msxml2.XMLHTTP');},
                    function() {return new ActiveXObject('Microsoft.XMLHTTP');}];

    for (var index = 0; index < tryThese.length; index++) {
    try {
    var xmlHttp = tryThese[index]();
    return xmlHttp;
    } catch(e) {}
    }
    alert("Ajax is not supported.");
    return null;
    }

    </script>
    </head>
    <body onload="loadJs('http://m.weather.com.cn/data/101200101.html', function() {})">
    </body>
    </html>
    [/Code]试试
      

  5.   

    这个是我最开始试过的列子,因为这个涉及到跨域,所以ie8如果security调的有些高,会弹出一个 ‘This page is accessing information that is not unser control...'消息,这个不是很好,所以我才打算用script动态调用url来做,而返回的json数据,又没有obj,但又不知道如何得到object,那个url又不能加callback来得到定义对象的数据,大家有做过类似应用吗?
      

  6.   


    <!Doctype html public '-//w3c//dtd xhtml 1.0 transitional//en' 'http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd'>
    <html xmlns='http://www.w3.org/1999/xhtml'>
    <head>
    <script language='javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script>
    <script language='javascript' type='text/javascript'>
    $(document).ready(
        function()
        {
    $('#getData').click(function(){
    $.ajax({
    type:'get',
    url:'http://m.weather.com.cn/data/101200101.html',
    dataType:'json',
    error:function(){
    alert('错误');
    },
    success:function(data){
    alert(data.weatherinfo.city);
    }
    });
    });
    }
    );
    </script>
    </head>
    <body>
    <input type="button" value="获取数据" id="getData">
    <div id="t"></div>
    </body>
    </html>
      

  7.   

    不好意思,这个功能蛮简单的,我不想用jquery这个框架来实现,毕竟jquery最小都有20K,而且,我用jquery也试过,跨域一样会出现This page is accessing information that is not unser control...'消息。大家还有其它办法吗?
      

  8.   

    楼主你只是 跨域获取数据而已,难道还要去操作别人的页面吗?
    获取数据怎么会提示:
    This page is accessing information that is not unser control...呢?
      

  9.   

    如果跨域取数据,安全上可能会提示 ‘This page is accessing information that is not unser control...’
    所以,我想用<script src=url>方式来动态加载,然后得到句柄,得到数据,按照zhouxiaobo123的方式用jquery,或者js的http直接调用url,会有那个安全提示。
      

  10.   

    IE8浏览器,security设置为medium-high,你可以参考这个,通过google
    http://www.google.cn/search?hl=zh-CN&newwindow=1&rls=ig&q=This+page+is+accessing+information&aq=f&aqi=g3&aql=&oq=&gs_rfai=
    查看详细错误列子
      

  11.   

    或者也可以参考这篇微软的文档
    http://support.microsoft.com/kb/829934
    如果这届用url跨域访问,其实,是有可能出现那个安全提示的,对客户不友好。所以,我想用那个方法解决,但现在不知道,数据的句柄如何得到。
      

  12.   


    哈哈,明白你的说,给个思路吧,不一定行。<script type=text/javascript>eval("json=" + /{"weatherinfo":{"city":"changsha"}}/.source);alert(json.weatherinfo.city);</script>BTW:怎么得到的“{"weatherinfo":{"city"。。}}”,你得把“loadJs("http://m.weather.com.cn/data/101200101.html", function() {alert();});”写全了,哈哈。
      

  13.   

    用eval把json字符串变成js对象正解eval可以把js字符串变成js对象 例如 
    eval("var j=10;");
    alert(j);这样是可以的
      

  14.   

    我还是不明白,如何得到句柄
    如:eval("json=" + /{"weatherinfo":{"city":"changsha"}}/.source);
    /{"weatherinfo":{"city":"changsha"}}/ 这个该如何得到呀??
      

  15.   

    eval前首先得知道,json的句柄,问题的关键在于这里,我现在不知道如何得到,所以,eval无法用到。
      

  16.   

    我意思是,我现在不知道如何拿到数据(不是不知道如何用json转数据),也就不能赋值在用eval转为json格式。
      

  17.   

    so sorry!我才真正清楚你的意思,算我误导了。
    我想说的是,你的思路不对,相对于这种缺少句柄的貌似JSO而实际上不是JSON的东东,相对于你的加载定义,等价的形式为:<head>
    <script>
    {"weatherinfo":{"city":"武汉","city_en":"wuhan","date_y":"2010年3月22日","date": .....}}
    </script>
    </head>这样定义本身就是错误的,但在IE中报错,在FF中不报错但不明白作者什么意思。你能说上面是什么东东?
    而百度的那样定义等价于:<script>
    window.baidu={};
    window.baidu.sug=function(a){alert(a.s)};
    </script>
    <script id="changePath" src="http://suggestion.baidu.com/su?wd=test"></script>
    //加载完成后运行window.baidu.sug({q:"test",p:true,s:["test是什么...]})调用上面方法;所以,你必须先AJAX读取http://m.weather.com.cn/data/101200101.html返回Text字符串,
    再eval("var Json = " + Textstr)。
    个人认为,没有句柄定义的那不是Json,什么也不是,对于Javascript来说。
    变量也一样的,不写关键定义符“var”同时又没有用“=”赋值,随便在全局或局域中写个“p”,这西摩依稀?哈哈
      

  18.   

    对头。
    你看看script标签所有属性:<script id="d"></script>
    <script>
    for(var i in d)
    document.write(i + "<br>");
    </script>
    IE和FF还有不同。
      

  19.   

    不想用代理的话就用flash跨域。
      

  20.   

    4楼的代码你试过吗?我都能得到,你为什么得不到。这段,callback留给你自己实现var jsonObj = null;eval("jsonObj = " + xmlHttp.responseText);callback(jsonObj);这段是测试
    // test
    for (var prop in jsonObj) {
    alert(prop);
    }直接把4楼的代码贴到你的浏览器里面试试。。
      

  21.   

    // 调用的地方
    loadJs('http://m.weather.com.cn/data/101200101.html', function(jsonObj) {
    // jsonObj就是你要的对象,明白?????啊懂??????
    // 你的html返回值不是javascript代码,仅仅只是数据})
      

  22.   

    楼上措辞也太激烈点了吧:
    xmlHttp.responseText 这个不就是用js打开http得到外域的数据吗,刚才都说过了,浏览器访问外域,可能会有一个提示的,根据ie的security设置不同,有些可能没有提示,你没有提示,并不代表就没有提示啊,我这边就有,具体你可以参考微软的http://support.microsoft.com/kb/829934这篇文章,在http访问外域时,注:是本站,你要用webserver方式来访问外域,而不是直接运行js.
      

  23.   

    好吧,看来你src回调没有问题是哇。改下代码
    客户端
    <html>
    <head>
    <script type="text/javascript" src="http://localhost:8080/TomcatTest/TestServlet"></script>
    <script>
    function load() {
    alert(jsonObj);
    }</script>
    </head>
    <body onload="load();">
    </body>
    </html>服务器端
    package org.test;import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException{
    doPost(req, res);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException{

    InputStream is = null;
    try {
    URL url = new URL("http://m.weather.com.cn/data/101200101.html");
    is = url.openStream();
    byte[] b = new byte[is.available()];

    is.read(b);

    String prefix = "eval('var jsonObj = ";
    String suffix = "')";
    res.getOutputStream().write(prefix.getBytes());
    res.getOutputStream().write(b);
    res.getOutputStream().write(suffix.getBytes());

    res.getOutputStream().flush();
    } catch (Exception e) {

    } finally {
    is.close();
    }
    }
    }调用的外域js配置都可以写在web.xml中,通过initServlet导入到此Servlet
    页面上面只需要写src指向这个servlet就可以了。
      

  24.   

    基于你的script src没有警告来考虑。通过服务器端先捕捉到数据文件。接下来就是你的页面和你的服务器之间的内部访问了
      

  25.   

    initServlet的配置方法你自己在网页上查吧
      

  26.   

    如果是服务器做代理,就可以很灵活了,实现方法也非常多,这个我已经掌握了,而且如果在服务器做eval显然会影响效率,我只需要用url得到数据,然后json格式化,在做memcached缓存,下次不用再次取,返回句柄当作service给client。不过,我还是想知道有没有办法,直接用动态script得到数据。
      

  27.   

    这个方法,服务器端并没有eval。只是拼字符串而已。真正eval还是客户端。Servlet中用static String变量保存取到的数据,只要你的Web服务器不关下次客户端再发生相应。只需要判断字符串是不是为空。
      

  28.   

    各大浏览器为了安全性考虑,的确是可能会弹出那个警告框。
    刚才我查看了浏览器中关于script标签的所有属性接口。为了安全,看来浏览器并没有提供给我们查看script标签内部信息的方法。最通用的方法可能也就只有上面的两个方法了。如果用ActiveX,可能也会受到权限的困扰。没意思。
      

  29.   

    恩,还有第三种方法,通过jsonp协议得到,通过回调注入回调函数到url,然后在客户端定义该函数得到数据,前提是,对方服务器端需要支持,weather.com.cn我用httprequest跟踪过,似乎不支持。
      

  30.   

    你好,想请问楼主测试用例中的数据是怎么取到的,是那个file返回的么。
    譬如window.baidu.sug({q:"test",p:true,s:});数据是这个请求http://suggestion.baidu.com/su?wd=test返回的吗?   那通过什么样的方式去获取这个数据呢