因为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,请指教,
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、数据格式为:
oJson = {
"weatherinfo" : {
"city" : "beijing",
"weather" : "-25C"
}
}
那么获取可以这样的方式获取某城市的天气信息:
alert("城市:" + oJson["weatherinfo"]["city"] + ",天气:" + oJson["weatherinfo"]["weather"]);
2、普通的json对象解析:
oJson = {
a : "a",
b : "b",
c : "c"
};
那么可以通过这样的方式来取得键值:
for(var attr in oJson){
alert(oJson[attr]);
}
<!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]试试
<!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>
获取数据怎么会提示:
This page is accessing information that is not unser control...呢?
所以,我想用<script src=url>方式来动态加载,然后得到句柄,得到数据,按照zhouxiaobo123的方式用jquery,或者js的http直接调用url,会有那个安全提示。
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=
查看详细错误列子
http://support.microsoft.com/kb/829934
如果这届用url跨域访问,其实,是有可能出现那个安全提示的,对客户不友好。所以,我想用那个方法解决,但现在不知道,数据的句柄如何得到。
哈哈,明白你的说,给个思路吧,不一定行。<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();});”写全了,哈哈。
eval("var j=10;");
alert(j);这样是可以的
如:eval("json=" + /{"weatherinfo":{"city":"changsha"}}/.source);
/{"weatherinfo":{"city":"changsha"}}/ 这个该如何得到呀??
我想说的是,你的思路不对,相对于这种缺少句柄的貌似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”,这西摩依稀?哈哈
你看看script标签所有属性:<script id="d"></script>
<script>
for(var i in d)
document.write(i + "<br>");
</script>
IE和FF还有不同。
// test
for (var prop in jsonObj) {
alert(prop);
}直接把4楼的代码贴到你的浏览器里面试试。。
loadJs('http://m.weather.com.cn/data/101200101.html', function(jsonObj) {
// jsonObj就是你要的对象,明白?????啊懂??????
// 你的html返回值不是javascript代码,仅仅只是数据})
xmlHttp.responseText 这个不就是用js打开http得到外域的数据吗,刚才都说过了,浏览器访问外域,可能会有一个提示的,根据ie的security设置不同,有些可能没有提示,你没有提示,并不代表就没有提示啊,我这边就有,具体你可以参考微软的http://support.microsoft.com/kb/829934这篇文章,在http访问外域时,注:是本站,你要用webserver方式来访问外域,而不是直接运行js.
客户端
<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就可以了。
刚才我查看了浏览器中关于script标签的所有属性接口。为了安全,看来浏览器并没有提供给我们查看script标签内部信息的方法。最通用的方法可能也就只有上面的两个方法了。如果用ActiveX,可能也会受到权限的困扰。没意思。
譬如window.baidu.sug({q:"test",p:true,s:});数据是这个请求http://suggestion.baidu.com/su?wd=test返回的吗? 那通过什么样的方式去获取这个数据呢