You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
381 lines
11 KiB
381 lines
11 KiB
/**
|
|
* --------------------------------------------------------------------
|
|
* jQuery tree plugin
|
|
* Author: Scott Jehl, scott@filamentgroup.com
|
|
* Copyright (c) 2009 Filament Group
|
|
* licensed under MIT (filamentgroup.com/examples/mit-license.txt)
|
|
* --------------------------------------------------------------------
|
|
*/
|
|
$.fn.tree = function(settings){
|
|
var o = $.extend({
|
|
expanded: ''
|
|
},settings);
|
|
|
|
return $(this).each(function(){
|
|
if( !$(this).parents('.tree').length ){
|
|
//save reference to tree UL
|
|
var tree = $(this);
|
|
|
|
//add the role and default state attributes
|
|
if( !$('body').is('[role]') ){ $('body').attr('role','application'); }
|
|
//add role and class of tree
|
|
tree.attr({'role': 'tree'}).addClass('tree');
|
|
//set first node's tabindex to 0
|
|
tree.find('i:eq(0)').attr('tabindex','0');
|
|
//set all others to -1
|
|
tree.find('i:gt(0)').attr('tabindex','-1');
|
|
//add group role and tree-group-collapsed class to all ul children
|
|
//tree.find('ul').attr('role','group').addClass('tree-group-collapsed'); //ecmoban模板堂 --zhuo 注释
|
|
//add treeitem role to all li children
|
|
tree.find('li').attr('role','treeitem');
|
|
//find tree group parents
|
|
tree.find('li:has(ul)')
|
|
//ecmoban模板堂 --zhuo start 注释
|
|
/*.attr('aria-expanded', 'false')
|
|
.find('>i')
|
|
.addClass('tree-parent tree-parent-collapsed');*/
|
|
//ecmoban模板堂 --zhuo end 注释
|
|
|
|
//expanded at load
|
|
tree
|
|
.find(o.expanded)
|
|
.attr('aria-expanded', 'true')
|
|
.find('>i')
|
|
.removeClass('tree-parent-collapsed')
|
|
.nextAll('ul')
|
|
.removeClass('tree-group-collapsed');
|
|
|
|
|
|
//bind the custom events
|
|
tree
|
|
//expand a tree node
|
|
.bind('expand',function(event){
|
|
var target = $(event.target) || tree.find('i[tabindex=0]');
|
|
target.removeClass('tree-parent-collapsed');
|
|
target.nextAll('ul').hide().removeClass('tree-group-collapsed').slideDown(150, function(){
|
|
$(this).removeAttr('style');
|
|
target.parent().attr('aria-expanded', 'true');
|
|
});
|
|
})
|
|
//collapse a tree node
|
|
.bind('collapse',function(event){
|
|
var target = $(event.target) || tree.find('i[tabindex=0]');
|
|
target.addClass('tree-parent-collapsed');
|
|
target.nextAll('ul').slideUp(150, function(){
|
|
target.parent().attr('aria-expanded', 'false');
|
|
$(this).addClass('tree-group-collapsed').removeAttr('style');
|
|
});
|
|
})
|
|
.bind('toggle',function(event){
|
|
var target = $(event.target) || tree.find('i[tabindex=0]');
|
|
//check if target parent LI is collapsed
|
|
if( target.parent().is('[aria-expanded=false]') ){
|
|
//call expand function on the target
|
|
target.trigger('expand');
|
|
}
|
|
//otherwise, parent must be expanded
|
|
else{
|
|
//collapse the target
|
|
target.trigger('collapse');
|
|
}
|
|
})
|
|
//shift focus down one item
|
|
.bind('traverseDown',function(event){
|
|
var target = $(event.target) || tree.find('i[tabindex=0]');
|
|
var targetLi = target.parent();
|
|
if(targetLi.is('[aria-expanded=true]')){
|
|
target.nextAll('ul').find('i').eq(0).focus();
|
|
}
|
|
else if(targetLi.nextAll('ul').length) {
|
|
targetLi.nextAll('ul').find('i').eq(0).focus();
|
|
}
|
|
else {
|
|
targetLi.parents('li').nextAll('ul').find('i').eq(0).focus();
|
|
}
|
|
})
|
|
//shift focus up one item
|
|
.bind('traverseUp',function(event){
|
|
var target = $(event.target) || tree.find('i[tabindex=0]');
|
|
var targetLi = target.parent();
|
|
if(targetLi.prev().length){
|
|
if( targetLi.prev().is('[aria-expanded=true]') ){
|
|
targetLi.prev().find('li:visible:last i').eq(0).focus();
|
|
}
|
|
else{
|
|
targetLi.prev().find('i').eq(0).focus();
|
|
}
|
|
}
|
|
else {
|
|
targetLi.parents('li:eq(0)').find('i').eq(0).focus();
|
|
}
|
|
});
|
|
|
|
|
|
//and now for the native events
|
|
tree
|
|
.focus(function(event){
|
|
//deactivate previously active tree node, if one exists
|
|
tree.find('[tabindex=0]').attr('tabindex','-1').removeClass('tree-item-active');
|
|
//assign 0 tabindex to focused item
|
|
$(event.target).attr('tabindex','0').addClass('tree-item-active');
|
|
})
|
|
.click(function(event){
|
|
//save reference to event target
|
|
var target = $(event.target);
|
|
//check if target is a tree node
|
|
if( target.is('i.tree-parent') ){
|
|
target.trigger('toggle');
|
|
target.eq(0).focus();
|
|
//return click event false because it's a tree node (folder)
|
|
return false;
|
|
}
|
|
})
|
|
.keydown(function(event){
|
|
var target = tree.find('i[tabindex=0]');
|
|
//check for arrow keys
|
|
if(event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40){
|
|
//if key is left arrow
|
|
if(event.keyCode == 37){
|
|
//if list is expanded
|
|
if(target.parent().is('[aria-expanded=true]')){
|
|
target.trigger('collapse');
|
|
}
|
|
//try traversing to parent
|
|
else {
|
|
target.parents('li:eq(1)').find('i').eq(0).focus();
|
|
}
|
|
}
|
|
//if key is right arrow
|
|
if(event.keyCode == 39){
|
|
//if list is collapsed
|
|
if(target.parent().is('[aria-expanded=false]')){
|
|
target.trigger('expand');
|
|
}
|
|
//try traversing to child
|
|
else {
|
|
target.parents('li:eq(0)').find('li i').eq(0).focus();
|
|
}
|
|
}
|
|
//if key is up arrow
|
|
if(event.keyCode == 38){
|
|
target.trigger('traverseUp');
|
|
}
|
|
//if key is down arrow
|
|
if(event.keyCode == 40){
|
|
target.trigger('traverseDown');
|
|
}
|
|
//return any of these keycodes false
|
|
return false;
|
|
}
|
|
//check if enter or space was pressed on a tree node
|
|
else if((event.keyCode == 13 || event.keyCode == 32) && target.is('i.tree-parent')){
|
|
target.trigger('toggle');
|
|
//return click event false because it's a tree node (folder)
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
};
|
|
|
|
$(function(){
|
|
|
|
|
|
|
|
//鼠标经过弹出图片信息
|
|
$(".item").hover(
|
|
function() {
|
|
$(this).find(".goods-info").animate({"top": "180px"}, 400, "swing");
|
|
},function() {
|
|
$(this).find(".goods-info").stop(true,false).animate({"top": "230px"}, 400, "swing");
|
|
}
|
|
);
|
|
|
|
|
|
|
|
});
|
|
|
|
(function($, wp, wps, window, undefined) {
|
|
'$:nomunge';
|
|
var $w = $(window),
|
|
waypoints = [],
|
|
oldScroll = -99999,
|
|
didScroll = false,
|
|
didResize = false,
|
|
eventName = 'waypoint.reached',
|
|
methods = {
|
|
init: function(f, options) {
|
|
this.each(function() {
|
|
var $this = $(this),
|
|
ndx = waypointIndex($this),
|
|
base = ndx < 0 ? $.fn[wp].defaults: waypoints[ndx].options,
|
|
opts = $.extend({},
|
|
base, options);
|
|
opts.offset = opts.offset === "bottom-in-view" ?
|
|
function() {
|
|
return $[wps]('viewportHeight') - $(this).outerHeight();
|
|
}: opts.offset;
|
|
if (ndx < 0) {
|
|
waypoints.push({
|
|
element: $this,
|
|
offset: $this.offset().top,
|
|
options: opts
|
|
});
|
|
}
|
|
else {
|
|
waypoints[ndx].options = opts;
|
|
}
|
|
f && $this.bind(eventName, f);
|
|
});
|
|
$[wps]('refresh');
|
|
return this;
|
|
},
|
|
remove: function() {
|
|
return this.each(function() {
|
|
var ndx = waypointIndex($(this));
|
|
if (ndx >= 0) {
|
|
waypoints.splice(ndx, 1);
|
|
}
|
|
});
|
|
},
|
|
destroy: function() {
|
|
return this.unbind(eventName)[wp]('remove');
|
|
}
|
|
};
|
|
function waypointIndex(el) {
|
|
var i = waypoints.length - 1;
|
|
while (i >= 0 && waypoints[i].element[0] !== el[0]) {
|
|
i -= 1;
|
|
}
|
|
return i;
|
|
}
|
|
function triggerWaypoint(way, dir) {
|
|
way.element.trigger(eventName, dir)
|
|
if (way.options.triggerOnce) {
|
|
way.element[wp]('destroy');
|
|
}
|
|
}
|
|
function doScroll() {
|
|
var newScroll = $w.scrollTop(),
|
|
isDown = newScroll > oldScroll,
|
|
pointsHit = $.grep(waypoints,
|
|
function(el, i) {
|
|
return isDown ? (el.offset > oldScroll && el.offset <= newScroll) : (el.offset <= oldScroll && el.offset > newScroll);
|
|
});
|
|
if (!oldScroll || !newScroll) {
|
|
$[wps]('refresh');
|
|
}
|
|
oldScroll = newScroll;
|
|
if (!pointsHit.length) return;
|
|
if ($[wps].settings.continuous) {
|
|
$.each(isDown ? pointsHit: pointsHit.reverse(),
|
|
function(i, point) {
|
|
triggerWaypoint(point, [isDown ? 'down': 'up']);
|
|
});
|
|
}
|
|
else {
|
|
triggerWaypoint(pointsHit[isDown ? pointsHit.length - 1: 0], [isDown ? 'down': 'up']);
|
|
}
|
|
}
|
|
$.fn[wp] = function(method) {
|
|
if (methods[method]) {
|
|
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
|
}
|
|
else if (typeof method === "function" || !method) {
|
|
return methods.init.apply(this, arguments);
|
|
}
|
|
else if (typeof method === "object") {
|
|
return methods.init.apply(this, [null, method]);
|
|
}
|
|
else {
|
|
$.error('Method ' + method + ' does not exist on jQuery' + wp);
|
|
}
|
|
};
|
|
$.fn[wp].defaults = {
|
|
offset: 0,
|
|
triggerOnce: false
|
|
};
|
|
var jQMethods = {
|
|
refresh: function() {
|
|
$.each(waypoints,
|
|
function(i, o) {
|
|
var adjustment = 0,
|
|
oldOffset = o.offset;
|
|
if (typeof o.options.offset === "function") {
|
|
adjustment = o.options.offset.apply(o.element);
|
|
}
|
|
else if (typeof o.options.offset === "string") {
|
|
var amount = parseFloat(o.options.offset),
|
|
adjustment = o.options.offset.indexOf("%") ? Math.ceil($[wps]('viewportHeight') * (amount / 100)) : amount;
|
|
}
|
|
else {
|
|
adjustment = o.options.offset;
|
|
}
|
|
o.offset = o.element.offset().top - adjustment;
|
|
if (oldScroll > oldOffset && oldScroll <= o.offset) {
|
|
triggerWaypoint(o, ['up']);
|
|
}
|
|
else if (oldScroll < oldOffset && oldScroll >= o.offset) {
|
|
triggerWaypoint(o, ['down']);
|
|
}
|
|
});
|
|
waypoints.sort(function(a, b) {
|
|
return a.offset - b.offset;
|
|
});
|
|
},
|
|
viewportHeight: function() {
|
|
return (window.innerHeight ? window.innerHeight: $w.height());
|
|
},
|
|
aggregate: function() {
|
|
var points = $();
|
|
$.each(waypoints,
|
|
function(i, e) {
|
|
points = points.add(e.element);
|
|
});
|
|
return points;
|
|
}
|
|
};
|
|
$[wps] = function(method) {
|
|
if (jQMethods[method]) {
|
|
return jQMethods[method].apply(this);
|
|
}
|
|
else {
|
|
return jQMethods["aggregate"]();
|
|
}
|
|
};
|
|
$[wps].settings = {
|
|
continuous: true,
|
|
resizeThrottle: 200,
|
|
scrollThrottle: 100
|
|
};
|
|
$w.scroll(function() {
|
|
if (!didScroll) {
|
|
didScroll = true;
|
|
window.setTimeout(function() {
|
|
doScroll();
|
|
didScroll = false;
|
|
},
|
|
$[wps].settings.scrollThrottle);
|
|
}
|
|
}).resize(function() {
|
|
if (!didResize) {
|
|
didResize = true;
|
|
window.setTimeout(function() {
|
|
$[wps]('refresh');
|
|
didResize = false;
|
|
},
|
|
$[wps].settings.resizeThrottle);
|
|
}
|
|
}).load(function() {
|
|
$[wps]('refresh');
|
|
doScroll();
|
|
});
|
|
})(jQuery, 'waypoint', 'waypoints', this);
|
|
|
|
|
|
|
|
(function($){
|
|
$.fn.membershipCard = function(options){};
|
|
})(jQuery);
|
|
|
|
|
|
|