-
Notifications
You must be signed in to change notification settings - Fork 52
百度阿拉丁礼物页面
LYF edited this page Apr 27, 2016
·
1 revision
/*
* Author:李彦峰
* Date:2015-12-20
* 调调
*/
"use strict";
;(function(document,undefined){
/*
原生ajax函数。用法与jquery ajax一致。
author:pod4g
*/
// 图像占位
var placeholderImg = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAC9ASIDASIAAhEBAxEB/8QAGwABAQADAQEBAAAAAAAAAAAAAAYBAgQFAwn/2gAIAQEAAAAA/QUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcegHeAAAAEb7GweDabAAAACWqQS9NsAAAAJapOCdsZenyAAAAJb1ZWsgOSs6KfIAAAAlpT4a7YUttkAAAARW4OS8yAAAAGQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//xAAXAQEBAQEAAAAAAAAAAAAAAAAAAgED/9oACAECEAAAAAAAAAAAAAAAAAAUJAAKmkgAHTWcwAChIAAAAAAAAAAAAAP/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID/9oACAEDEAAAAAAAAAAAAAAAAAAQUAAligAGcZ6bAAIKAAAAAAAAAAAAAD//xAA9EAABAQUCCAsHBAMAAAAAAAABAgADBAURMVEGFSEiQZGTsRIWMkBTVFZhcZLSEBQ0NnJzoYCBwfATIDP/2gAIAQEAAT8A/Rs9nMDDvVOnsW5Q8SaKSpVCPFsfy3rzjzhsfy3rzjzhsfy3rzjzhsfy3rzjzhsfy3rzjzhsfy3rzjzhsfy3rzjzhgoEVGnLz1zLnEywumLqKQVIFVCiiMuTTXvbidLOgebQtxOlnQvNoW4nSzoXm0LcTpZ0LzaFuJ0s6F5tC3E6WdC82hbCySQkrhYdcM7UhS3hSSVk1FK6WdjMT4AfjnhsaU/Osy8Fbw1P9sPfgoP7p3M75CPpG7nhsaU/Osy+lW9PsJFujVq9k5m7qTwherPCeKqlDvSo3eHf/LSvDV8qLCI0O/8ACo04SEkcDvOXKPyySFCoNRbUWEXi/c2H3wUJ907md8hPh/HPDY0p+dJl9Kt6Wns9dyaHsC4heRDuusm4b7O9oHDGOcRQW/X7w6JzkUAIF4NLWe4RQLuB96D9K0EVSgcom6mg/wBq0zmL2axa3745TUIQDkSNAH9ytlIbBHCHgFEDErzbHK1GzuJu3FsPfgoQGv8A2I/GlnfIT4Ddzw2NKPnWY/SrelphEvIqNfPHrzhrKjUnQKkADubJeGqLa/u1aWENwu/8NWhqFULT5+uKwZlL14ovFqUSom0mh/ZnfIT4Ddz17FxUpwmjop1BriAslKRwSARkyggdzGerJqcH3dftn0tj1fZ53sz6Wx4rs872Z9LY9X2ed7M+lseK7PO9mfS2PV9nnezPpaczCKm0M5cCWLh0OlFSQlJIspSlGd8gC4Ddz2ppSppc2dedZbOvOstnXnWWzrzrLZ151ls686y2W86/0cf/xAAdEQADAAICAwAAAAAAAAAAAAAAAREQQAJgEjFB/9oACAECAQE/AOpxERERaDxDj70JRpY+6FKys8uq/wD/xAAbEQEBAQADAQEAAAAAAAAAAAABEQAxQGAQIf/aAAgBAwEBPwDyddXVyvQOPlDPHQsMLv3CpOhNHR08r//Z";
// 一次加载12条数据
var LOAD_COUNT = 12;
// var intersectArray = [];
var imgUrlPrev = '';
/*存储原生工具方法 start*/
var arrayPrototype = Array.prototype;
var forEach = arrayPrototype.forEach;
var ElementPrototype = HTMLElement.prototype;
/*存储原生工具方法 end*/
/* 扩展原生Node方法 start */
ElementPrototype.hasClass = function(cls){
return this.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}
ElementPrototype.addClass = function(cls){
if (!this.hasClass(cls)){
this.className += " " + cls;
}
}
ElementPrototype.removeClass = function(cls){
if (this.hasClass(cls)) {
var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
this.className = this.className.replace(reg, ' ');
}
}
ElementPrototype.toggleClass = function(cls){
if(this.hasClass(cls)){
this.removeClass(cls);
}else{
this.addClass(cls);
}
}
ElementPrototype.css = function(key,value){
if(arguments.length == 2){
this.style[key] = value;
}else if(typeof key === 'object'){
var cssText = '';
for(var attr in key){
cssText += attr + ":" + key[attr]+";";
}
this.style.cssText = cssText;
}
}
/*
html gsetter 方法
*/
ElementPrototype.html = function(val){
if(val){
this.innerHTML = val;
}else{
return this.innerHTML;
}
}
function getById(id){
return document.getElementById(id);
}
function getByClass(className,context){
return (context || document).getElementsByClassName(className);
}
function getByTag(tagName,context){
return (context || document).getElementsByTagName(tagName);
}
/* 扩展原生Node方法 end */
/*
生成卡片HTML结构
*/
function getCardHTMLString(shortId,nail,isPrev){
var className = '',imgSrc,article = data.m[shortId];
if(nail){
className = 'class="'+nail+'"';
}
// http://a.diaox2.com/cms/sites/default/files/
imgSrc = placeholderImg;
if(isPrev){
imgSrc = 'http://a.diaox2.com/cms/sites/default/files/'+ article.p;
}
return '<li '+className+' data-id="'+shortId+'"><a href="http://c.diaox2.com/aladin/'+(4294967296 * shortId + (+shortId))+'.html" media="handheld"><figure><img src="'+imgSrc+'"><figcaption><h3>'+article.t+'</h3></figcaption></figure></a></li>';
}
function htmlWork(arr){
var li = '',nail = 'nail';
arr.forEach(function(article,index){
var isPrev = false;
if(index < LOAD_COUNT){
isPrev = true;
}
if(index !== 0 && index % LOAD_COUNT === 0){
li += getCardHTMLString(article,nail,isPrev);
}else{
li += getCardHTMLString(article,'',isPrev);
}
})
getById('article-list').html(li);
}
/*
数组乱序
*/
function shuffle(o){
for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
}
function a(list, m) {
//list 求交集来的list,或者是单个tag的list
var sep, spos, output = [];
list.forEach(function(item,i){
if(sep == undefined) {
sep = m[item].w;
spos = i;
return;
} else {
if(m[item].w == sep) {
return; //同上一个值
} else {
output = output.concat(shuffle(list.slice(spos, i)));
sep = m[item].w;
spos = i;
}
}
})
return output;
}
/*
求交集。
若其中一个参数为空数组,则返回另一个非空数组
*/
/*
每次求交之后更新 intersectArray 的值,供懒加载使用
*/
function intersect(arr1,arr2){
var ret = [],m = data.m;
if(arr1 == undefined && arr2 == undefined){
return ret;
}
// 如果arr1为空数组或null,返回arr2
if(arr1 == undefined || arr1.length === 0){
// 无论如何都保证intersectArray最新
// intersectArray = arr2;
return a(arr2,m);
}
// 如果arr2为空数组或null,返回arr1
if(arr2 == undefined || arr2.length == 0){
// intersectArray = arr1;
return a(arr1,m);
}
// intersectArray =
ret = arr1.filter(function(item){
return arr2.indexOf(item) !== -1;
})
// console.log('交集-----------------------------------------------');
// console.log('第一个数组长度:%d',arr1.length);
// console.log('第二个数组长度:%d',arr2.length);
// console.log('交集长度:%d',ret.length);
// console.log('\n')
// 求完交集之后在这儿需要shuffle
return a(ret,data.m);
}
/*
解析URL,返回参数
*/
function parseURL(){
/*
giveingObject:送礼对象
scene:适用节日
*/
var hash = location.hash,
tagList = null,
ret = {},
map,
giveingObjectTagList,
sceneTagList;
if(hash){
hash = decodeURI(hash).replace('#','');
tagList = hash.split("_");
// 如果格式不符合要求,直接返回
if(!tagList.length){
return ret;
}
map = arrayPrototype.map;
giveingObjectTagList = map.call(getByTag('li',getById('left-menu')),function(li){
return li.html();
})
sceneTagList = map.call(getByTag('li',getById('right-menu')),function(li){
return li.html();
})
var giveingObjectVal;
var sceneVal;
tagList.forEach(function(tag){
giveingObjectTagList.forEach(function(giveingObjectTag){
if(giveingObjectTag.indexOf(tag) !== -1){
giveingObjectVal = giveingObjectTag;
}
})
sceneTagList.forEach(function(sceneTag){
if(sceneTag.indexOf(tag) !== -1){
sceneVal = sceneTag;
}
})
})
ret.giveingObject = giveingObjectVal;
ret.scene = sceneVal;
}
// ret = {
// giveingObject:'老婆女友',
// scene:'生日'
// }
return ret;
}
function change(key){
var map = {
"老婆女友":"女友",
"老公男友":"男友",
"春节回家":"春节",
"过年回家":"春节"
}
return map[key] == undefined ? key : map[key];
}
/*
根据参数,来触发相应的tab和menuList的active状态
*/
function triggerSelect(argObj){
var giveingObject = argObj.giveingObject,
scene = argObj.scene,menu,select,
giveObjectIdList = [],
sceneIdList = [],
inter;
// 如果没有参数,直接返回
if(!giveingObject && !scene){
return;
}
/* 1 找出该触发select的元素 */
menu = getByTag('menu')[0],
select = function(arg){
var
toCompare = arg.giveingObject,
name = arg.giveingObject,
elementList;
if(arg.scene){
elementList = getByTag('li',getById('right-menu'));
toCompare = arg.scene;
name = arg.scene;
}else{
elementList = getByTag('li',getById('left-menu'));
}
forEach.call(elementList,function(li){
if(li.html() === toCompare || li.html().indexOf(toCompare) !== -1){
li.click();
return;
}
});
// 默认是折叠状态
// getById('left-menu-tab').addClass('rotate');
// getById('right-menu-tab').addClass('rotate');
// getById('article').addClass('up');
// 返回当前被选中tag的对应的id的集合
return data[name];
}
if(giveingObject){
giveObjectIdList = select({giveingObject:change(giveingObject)});
}
if(scene){
sceneIdList = select({scene:change(scene)});
}
inter = intersect(giveObjectIdList,sceneIdList);
if(!inter || !inter.length){
noresult();
}else{
hasresult();
// 更新DOM
htmlWork(inter);
}
}
/*
判断2个数组是否相等
[] == []
[1,2] == [2,1]
*/
function arrayEqual(arr,arr2){
if(arr == undefined || arr2 == undefined ){
return false;
}
if(arr.length == 0 && arr2.length == 0){
return true;
}
if(arr === arr2){
return true;
}else{
if(arr.length === arr2.length){
var ret = [];
var ret = arr.filter(function(item,index){
// return item !== arr2[index];
return arr2.indexOf(item) === -1;
})
if(ret.length === 0){
return true;
}else{
return false;
}
}else{
return false;
}
}
}
function defaultUpdateDOM(){
var all = [],shortId;
for(shortId in data.m){
all.push(shortId);
}
changeHash();
// 不管怎样都要保证intersectArray是最新的
// intersectArray = all;
htmlWork(all);
}
function noresult(){
var articleList = getById('article-list');
articleList.parentNode.dataset.flag = "hidden";
articleList.html('<p class="no-result">没有结果 换个筛选条件试试~</p>')
// noresultEle = articleList.firstElementChild;
/*
(viwePortHeight - headerHeight - articleMarginTop - noresultEleHeight)/2
*/
// noresultEle.style.cssText = "margin:"+(document.documentElement.clientHeight - getById('left-menu-tab').offsetHeight - parseInt(getComputedStyle(articleList.parentNode,null).marginTop) - noresultEle.offsetHeight)/2+"px 0";
}
function hasresult(){
getById('article').dataset.flag = "";
}
function changeHash(tagList){
var value = '';
if(!tagList || !tagList.length){
location.hash = "";
return;
}
if(tagList.length === 1){
value = encodeURI(tagList[0]);
}else{
value = encodeURI(tagList[0]) + "_" +encodeURI(tagList[1]);
}
location.hash = value;
}
var oldTagList;
function intersectAndUpdateDOM(){
var menu = getByTag('menu')[0],
selectMenu = getByClass('select-menu',menu),
newTagList = [],
l = selectMenu.length,inter;
if(l == 0){
defaultUpdateDOM(newTagList);
return;
}
if(l == 1){
newTagList.push(selectMenu[0].html());
}else{
newTagList.push(selectMenu[0].html());
newTagList.push(selectMenu[1].html());
}
if(arrayEqual(newTagList,oldTagList)){
return;
}
changeHash(newTagList);
inter = getMetaListByTagArray(newTagList);
if(!inter || !inter.length){
noresult();
}else{
hasresult();
htmlWork(inter);
}
oldTagList = newTagList;
}
function getMetaListByTagArray(newTagList){
return newTagList.length === 1 ? intersect(data[change(newTagList[0])]) : intersect(data[change(newTagList[0])],data[change(newTagList[1])]);
}
/*
*/
document.addEventListener('DOMContentLoaded',function(){
// 选出tab和menuList的容器 menu
var menu = getByTag('menu')[0],
// 选出所有tab
tabList = getByClass('tab',menu),
selectTabClassName = "select-tab",
selectMenuClassName = "select-menu",
url = "http://c.diaox2.com/aladin/",
// 记录原始的title,供后续使用
leftMenuTitle = getById("left-menu-tab").firstElementChild.firstChild.nodeValue,
rightMenuTitle = getById("right-menu-tab").firstElementChild.firstChild.nodeValue,
articleList = getById('article-list'),
viewportHeight = document.documentElement.clientHeight,
argObj,flag = true,attr;
/*
循环给每个tab添加点击事件
*/
forEach.call(tabList,function(tab,index){
tab.onclick = function(){
var menuListContainer = getById(this.id.replace('-tab',''));
// 点击的是已经被选中的tab
if(this.hasClass(selectTabClassName)){
this.firstElementChild.firstElementChild.toggleClass('rotate');
getById('article').toggleClass('up');
}else{// 点击的是为被选中的tab
// 选出被选中的tab
var selectTab = getByClass(selectTabClassName,menu)[0],
// 获取被选中的tab对应的 menuList Id
selectMunuListContainer = getById(selectTab.id.replace('-tab',''));
// 取消被选中的tab的选中状态
selectTab.removeClass(selectTabClassName);
selectTab.firstElementChild.firstElementChild.addClass('rotate');
// 给当前被点击的tab添加选中状态
this.addClass(selectTabClassName);
// 显示当前选中的tab对应的 menuList
menuListContainer.css('display','block');
// 保证被选中的tab对应的menuList是展开状态
this.firstElementChild.firstElementChild.removeClass('rotate');
getById('article').removeClass('up');
// 隐藏上一次被选中的tab对应的 menuList
selectMunuListContainer.css('display','none');
}
}
})
/*
menuList中的li的点击事件
*/
forEach.call(getByClass('menu',menu),function(menuListContainer){
menuListContainer.onclick = function(e){
var target = e.target,oldSelectMenu,tab;
if(target.tagName.toUpperCase() === "LI"){
// 查询当前container中已经被选中的menu
oldSelectMenu = getByClass(selectMenuClassName,this)[0];
// 去掉已经被选中menu的选中状态
if(oldSelectMenu){
console.log();
oldSelectMenu.removeClass(selectMenuClassName);
}
// 给被点击的menu添加选中状态
target.addClass(selectMenuClassName);
// 更新tab title
tab = getById(this.id+"-tab").firstElementChild;
tab.firstChild.nodeValue = target.html();
// 选择完tag之后,折叠面板
tab.firstElementChild.addClass('rotate');
getById('article').addClass('up');
intersectAndUpdateDOM();
}
}
})
/*
清除所有条件的点击事件
*/
forEach.call(getByClass('clear',menu),function(clear){
clear.onclick = function(){
// 找出当前clear对应的menuList
var menuList = clear.parentNode,
menuListContainer = menuList.parentNode,
// 在当前menuList中找到被选中的menu
selectMenu = getByClass(selectMenuClassName,menuList)[0];
if(!selectMenu){
// 如果已经清除了筛选条件,直接返回
return;
}
// 清除被选中menu的选中状态
selectMenu.removeClass(selectMenuClassName);
var tab = getById(menuList.parentNode.id+"-tab").firstElementChild;
if(menuListContainer.hasClass("left-menu")){
tab.firstChild.nodeValue = leftMenuTitle;
}else{
tab.firstChild.nodeValue = rightMenuTitle;
}
tab.firstElementChild.addClass('rotate');
getById('article').addClass('up');
intersectAndUpdateDOM();
}
})
/*
根据参数
1、触发select
2、根据select,求交集,发送ajax
3、无参数或参数不符合要求,发送ajax取默认json
*/
// 获取参数
argObj = parseURL();
if(argObj){
flag = true;
for(attr in argObj){
if(argObj[attr] != undefined){
flag = false;
break;
}
}
// 如果没有一个参数,就执行默认的
if(flag){
defaultUpdateDOM();
}
}
// 触发select
triggerSelect(argObj);
/*
惰性加载
*/
// 3007 2377
setInterval(function(){
var
/*
把articleArray 放入定时器内部,
保证每次都是拿到最新的li集合,
如果放到定时器外部,如果切换了tag,但是articleArray其实并没有更新,
所以切换一下tag,在下拉,就不会懒加载了。。事实上永远加载不了。。
因为start永远为-1
*/
articleArray = arrayPrototype.slice.call(articleList.children),
nail = getByClass('nail',articleList)[0],
start = articleArray.indexOf(nail),
end = start + LOAD_COUNT;
if(!nail){
return;
}
if((document.body.scrollTop || document.documentElement.scrollTop) + viewportHeight >= nail.offsetTop){
articleArray.slice(start,end).forEach(function(item,index){
getByTag('img',item)[0].src =
'http://a.diaox2.com/cms/sites/default/files/'+data.m[item.dataset.id].p;
});
nail.removeClass('nail');
}
},60)
},false)
})(document)