一直用jQuery库,如果不用,还会使用Ajax吗?
参考书:1.PHP与jQuery开发实例;2.Ajax基础教程 (图灵程序设计丛书就是好)
把书1里jQuery代码换成原生JS,实例1是选择省份出现城市列表,实例2改成了联动下拉框。
一、实例1
html代码:
<form>
<p>
<label for="province">省份:</label>
<select id="choice" name="province">
<option value="">请选择</option>
<option value="JiangSu">江苏省</option>
<option value="AnHui">安徽省</option>
</select>
</p>
<div id="result"></div>
</form>
js代码:
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function doSearch(event) {
var province = document.getElementById("choice").value;
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", "data.php?province="+province, false);
xmlHttp.send(null);
}
//也常取名callBack
function handleStateChange() {
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
parseResults();
}
}
}
function parseResults() {
document.getElementById("result").innerHTML = xmlHttp.responseText;
}
//下拉框值改变出发事件
var evtObject = document.getElementById("choice");
if(evtObject.addEventListener){
evtObject.addEventListener("change",doSearch,false);
}
else if(evtObject.attachEvent){
evtObject.attachEvent("onchange",doSearch);
}
PHP代码:
<?php
if($_GET['province']=='JiangSu'){
$citys = array('南京', '苏州','南通','无锡');
echo getHTML($citys);
}
else if($_GET['province']=='AnHui'){
$citys = array('合肥', '芜湖','黄山','宣城');
echo getHTML($citys);
}
function getHTML($citys){
$strResult = '<ul>';
for($i=0; $i<count($citys); $i++){
$strResult.='<li>'.$citys[$i].'</li>';
}
$strResult.='</ul>';
return $strResult;
}
?>
插曲:原书实例中result是<p id="result"></p>,结果在ie6下 innerHTML 报错,所以换成了div。
二、联动下拉框
XMLHttpRequest对象提供了2个可以用来访问服务器响应的属性:1. responseText; 2. responseXML。
第二个实例采用从XML文件中读取数据。
XML代码
<?xml version="1.0" encoding="UTF-8"?>
<provinces>
<province index="1" name="JiangSu">
<name>江苏</name>
<citys>
<city>南京</city>
<city>苏州</city>
<city>南通</city>
<city>无锡</city>
</citys>
</province>
<province index="2" name="AnHui">
<name>安徽</name>
<citys>
<city>合肥</city>
<city>芜湖</city>
<city>黄山</city>
<city>宣城</city>
</citys>
</province>
</provinces>
PHP代码:
<?php
header("Content-Type: text/xml"); //必须指明,responseXML才能接收
libxml_use_internal_errors(true); //抑制xml错误,便于代码自行处理错误
$objXML = simplexml_load_file('data.xml');
if(!$objXML){
$errors = libxml_get_errors();
foreach($errors as $error){
echo $errors->message,'<br/>';
}
} else {
if($_GET['province']=='JiangSu'){
foreach($objXML->province as $province){
if($province->name == "江苏"){
echo $province->citys->asXML(); //asXML(),返回xml字符串
}
}
} else if ($_GET['province']=='AnHui'){
foreach($objXML->province as $province){
if($province->name == "安徽"){
echo $province->citys->asXML();
}
}
}
}
?>
html代码:
<form>
<p>
<label for="province">省份:</label>
<select id="choice" name="province">
<option value="JiangSu">江苏省</option>
<option value="AnHui">安徽省</option>
</select>
<label for="citys">城市:</label>
<select id="city" name="citys">
</select>
</p>
</form>
JS代码:
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function doSearch(event) {
var province = document.getElementById("choice").value;
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", "data.php?province="+province, false);
xmlHttp.send(null);
}
function handleStateChange() {
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
//clearPreviousResults();
parseResults();
}
}
}
function parseResults() {
var xmlDoc = xmlHttp.responseXML;
// var htmlStr="";
var cityName;
if(xmlDoc.getElementsByTagName("city")[0].text){
cityName = "text"; //IE6下 要用text 取 内容
} else {
cityName = "textContent"; //chrome下 要用textContent 取内容
}
for(var i=0;i<xmlDoc.getElementsByTagName("city").length;i++){
document.getElementById("city").options = new Option(xmlDoc.getElementsByTagName("city")[cityName],i)
}
}
doSearch(); //加载页面的时候先执行一次,因为去掉了“请选择”
var evtObject = document.getElementById("choice");
if(evtObject.addEventListener){
evtObject.addEventListener("change",doSearch,false);
}
else if(evtObject.attachEvent){
evtObject.attachEvent("onchange",doSearch);
}
插曲:ie6下,取城市名 得用 xmlDoc.getElementsByTagName("city")[0].text,而Chrome下用textContent,因此我用字符串cityName代替,并且取城市名的时候用了数组写法,不能用“.”取值。 select 在ie6下 设置innerHTML,页面没效果,但值存在。
以上2个实例在ie6和chrome下均可运行。哎,兼容性的确让人头疼,第二个实例JS部分花了好长时间才完全调好。时间太晚了,都没劲写感想了,洗洗睡了.......
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com