利用AJAX的跨域原理重构页面 实现页面的模块化

jq的AJAX不光能请求网络数据,还能跨域访问html、js文件,举例说,当其跨域访问js文件时,其实是干了两件事情:1,创建<script>标签,src指向要访问的url,appendChild()去head标签中;2,声明函数fn,fn必须与请求目标js文件中调用的方法同名。

需要注意的点有: 1,html和js文件同时创建

有了这个基础,我们就可以利用ajax来实现模块化地构建页面,类似于mvc各种框架的思想。

1,在全局脚本app.js中定义两个函数

获取路径参数函数:

function getUrlParms(){
    
    var params={};
    
    var url=window.location.href;
    
    var arr=url.split("?");

    if(arr.length==2){
        var p=arr[1];     
    }else{
       console.log(params)
       return params;    
    }
    
    // p="a=1&b=2&c=3"
    var parr=p.split("&"); // ["a=1","b=2","c=3"]
    
    for(var i=0;i<parr.length;i++){

        var kv=parr[i].split("=");
              
        params[kv[0]]=kv[1];

    }   
    console.log(params)

    // {a:1,b:2,c:3}    
}

加载模块函数:

function router(m,container){
	
	container=container||$("#share");
	
	// 请求模块结构
	$.ajax({
	    url:"views/"+m+".html",
		success: function(data){
			container.html(data);
		}
	})
	
	// 请求js文件
	loadJs(m);
	
}
function loadJs(m){
   $.ajax({
	   url:"js/"+m+".js",
   })	
}

2,设置首次打开文件所呈现的页面,如果有欢迎页,要用到localStorage的知识:

$(function(){
  
  // 首次加载 -- 打开欢迎页, 2次以上打开的是tab模块
   
    if(!localStorage.count){
    	localStorage.count=0;
    }
    
    localStorage.count++;

    console.log(localStorage.count);

    if(localStorage.count==1){
    	router("hello")
    }else{
    	router("tab")   //选项卡是本项目在欢迎页消失后首先呈现的页面
    }	
})

3,tab模块,不变的部分,比如header,写在tab.html里,需要动态更改的部分,在tab.js里调用router()方法,当然事先要在tab.html里留出空间,插入之后用ajax请求到的内容:

router("home",$("#tabcontainer"))            //home是home.html文件

差不多原理就是这样了,是不是很类似vue的组件。

4,如果home.html需要写一个需要请求网络数据的列表,具体该怎么操作呢?以下为例:

<img src="image/banner1.jpg" class="auto">
<p class="tj">推荐歌单3</p>

<div class="songlist">

</div>

<div id="templateItem" style="display: none;">        //这就是要动态插入的模板原型,display设置为none
//目的是让其在视图上不显示
	
	<div class="item">
   	   <div>200</div>
   	   <img src="image/18581746511268315.jpg" class="auto">
   	   <p>老板,给我来一打这样的男友</p>
    </div>
    
</div>

然后在home.js中,重点是,用回调函数来处理ajax请求回来的数据

var server = "http://musicapi.duapp.com/api.php";            //服务器

//url: server+"?type=topPlayList&cat=%E5%85%A8%E9%83%A8&offset=0&limit="+9,        //URL地址

function getPlayList(limit,callback){
	
	$.ajax({
		type:"get",
		url: server+"?type=topPlayList&cat=%E5%85%A8%E9%83%A8&offset=0&limit="+limit,
		async:true,
		success:function(data){
			//console.log(data);
			callback(data.playlists)
		}
   });
 
}


getPlayList(9,function(data){
	
	  console.log(data)
	  
	  var $songlist=$(".songlist");
	  
	  var template=$("#templateItem").html();        //不能在函数里面创建template,不然只能插入一个
	  
	  for(var i=0;i<data.length;i++){
	   	 
	   	 var $template=$(template);
	  	 $template.find("div").html(data[i].playCount);
	  	 $template.find("img").attr("src",data[i].coverImgUrl);
	  	 $template.find("p").html(data[i].name);
	  	 $template.appendTo($songlist);
	  	 
	  }
	
});

用jq获取模板的html,注意用html()获取到的对象是js对象,如果要使用接下来的find()方法,要用$()对其进行包裹,转换成jq对象。

这里也可以使用字符串拼接的方法。

转载于:https://my.oschina.net/u/3499937/blog/1036949

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值