下面是w3c上面的例子,http://www.w3school.com.cn/ajax/ajax_database.asp。 被我稍微改装了两行。
问题一: 直接点击下面的字符串,都是可以访问的。“http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 ”为什么用下面的写法访问不到?
问题二:应该怎么实现这个功能?
源码:
<html>
<head>
<script type="text/javascript">
function showCustomer(str)
{
var xmlhttp;
if (str=="")
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
alert(xmlhttp.responseText);// 弹出 返回的信息
//document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443",false);//调用接口,根据电话号码获取 ,归属地信息
//xmlhttp.open("GET","/ajax/getcustomer.asp?q="+str,true); http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443
xmlhttp.send();
}
</script>
</head>
<body>
<form action="" style="margin-top:15px;">
<label>请选择一位客户:
<select name="customers" onchange="showCustomer(this.value)" style="font-family:Verdana, Arial, Helvetica, sans-serif;">
<option value="APPLE">Apple Computer, Inc.</option>
<option value="BAIDU ">BAIDU, Inc</option>
<option value="Canon">Canon USA, Inc.</option>
<option value="Google">Google, Inc.</option>
<option value="Nokia">Nokia Corporation</option>
<option value="SONY">Sony Corporation of America</option>
</select>
</label>
</form>
<br />
<p id="txtHint">客户信息将在此处列出 ...</p>
</body>
</html>
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
@xelz 说的很正确。访问不到是因为跨域问题,解决跨域的方案很多,jsonp 就是一种很有效的方式。
具体方法就是,创建 script 节点,再给该节点指定一个 src 属性,然后插入到 dom 中。(这是必须的,因为script必须被渲染,src 才会去异步加载,当脚本加载完毕之后,就回去执行提前定义好的方法)
更新:
@bumfod 说的对,当时随手一些,没有测试。我更新了一块代码!
以下代码不能运行,因为
mobile_tel_segment
不是去全局函数。以下代码没有测试过!注意 src 属性的值
http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443?callback=mobile_tel_segment
可以拷贝以下代码,我测试过。
该 api 的 querystring 中有一个 callback 参数。(大多数jsonp的支持方式都是这种参数)
需要注意的是 jsonp 只能发送 GET 请求,这跟他的工作机制有关!
ajax是不能跨域的, 更明确一点来说,你在
http://www.w3school.com.cn
页面上只能请求http://www.w3school.com.cn
这个域下的页面=========================
回答评论中的补充提问:
上面的代码(ajax方式),一般情况下是无法跨域的, 这是浏览器的安全机制保障的,除非你要访问的网站声明了允许来自某些页面的ajax跨域请求(CORS,感谢评论指出), 这种方式浏览器的支持情况有限
常规的跨域方法,你可以搜索一下
jsonp
的相关资料,这个跟ajax是完全不同的实现原理,你想访问的链接 http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 其实就是个jsonp类型的请求一种简单的方式就是你在自己的后台通过http请求得到你想要的资源,然后前台通过ajax来访问你自己的后台方法
http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443
返回的数据你是否看到__GetZoneResult_ =
你是不是觉得这不像是一般的JSON数据?
是的。这的确不是,这是另外一种叫做JSONP
那么,如果说使用JavaScript创建一个脚本element
这样会有什么效果呢?那就是__GetZoneResult_这个变量变成了后面跟随的JSON数据了。
其实这样的做法非常常见。
//--------------------分隔线 例子1-----------------------------------
比如百度的搜索建议,http://suggestion.baidu.com/su?wd=wocao&from=superpage&json=1
如果把这段链接作为一个新脚本element的src 那么会有什么效果呢?
实际上是回调了window.baidu.sug这个函数 且第一个参数是随后的JSON数据
刚开始玩JavaScript的时候我看到这种数据我也懵了,之后看了看搜索引擎,突然觉得好机智
总之,这样跨域的URL一般情况下无法直接用AJAX获取。一般都会提供像JSONP这样的方式