Files
2018-05-08 11:22:54 +08:00

453 lines
15 KiB
JavaScript

/**
* Base JavaScript
*
* @link https://www.bgbk.org
*/
( function( $, document, window, args ){
//显示 JS 模块
$( 'html' ).removeClass( 'no-js' );
//判断移动端
function is_mobile(){
return $( '#mobile-header' ).css( 'display' ) == 'block';
}
//初始化幻灯片
function slider_init(){
$( '[data-owl-carousel]' ).each( function(){
var $this = $( this );
$this.owlCarousel( $this.data( 'owl-carousel' ) );
} );
}
$( slider_init );
/**
* 镜像防火墙
*/
( function() {
if ( !args.imageFirewall )
return;
if ( args.imageFirewall === window.location.hostname )
return;
var parser = $( '<a />' ).attr( 'href', window.location.href )[0];
parser.hostname = args.imageFirewall;
window.location.href = parser.href;
} )();
//推荐搜索
$( document ).on( 'submit', '.search-form', function(){
var $text = $( this ).find( '.search-text' ),
recommend = $text.data( 'recommend-search' );
if ( !$text.val() && recommend )
$text.val( recommend );
} );
//显示文章标签
$( document ).on( 'click', '#post-box .post-meta-box .post-meta > .tags', function(){
$( this ).children( '.tags-list' ).toggle();
} );
$( document ).on( 'click', '#post-box .post-meta-box .post-meta > .tags .tags-list', function( e ){
e.stopPropagation();
} );
//快捷键提交评论
$( document ).keypress( function( e ){
var btn = $( '#respond #submit' );
if( e.ctrlKey && e.which == 13 || e.which == 10 ){
btn.click();
document.body.focus();
return;
}
if( e.shiftKey && e.which == 13 || e.which == 10 ) btn.click();
} );
//评论表情框
$( document ).on( 'click', '#commentform .comment-form-smiley .button', function( e ){
e.stopPropagation();
$( this ).next( '.smiley-box' ).html( args.insert_smiley ).slideToggle();
} );
$( document ).on( 'click', function(){
$( '#commentform .comment-form-smiley .smiley-box' ).slideUp();
} );
$( document ).on( 'click', '#commentform .comment-form-smiley .smiley-box', function( e ){
if( !is_mobile() ) e.stopPropagation();
} )
//评论框插入表情
$( document ).on( 'click', '#commentform .comment-form-smiley .smiley-box > a', function(){
var textarea = document.getElementById( 'comment' ),
content = ' ' + $( this ).data( 'smiley' ) + ' ';
if( !textarea || textarea.type != 'textarea' ) return;
if( document.selection ){
textarea.focus();
var sel = document.selection.createRange();
sel.text = content;
textarea.focus();
}else if( textarea.selectionStart || textarea.selectionStart == '0' ){
var selectionEnd = textarea.selectionEnd;
textarea.value = textarea.value.substring( 0, textarea.selectionStart ) + content + textarea.value.substring( selectionEnd, textarea.value.length );
selectionEnd += content.length;
textarea.focus();
textarea.selectionStart = selectionEnd;
textarea.selectionEnd = selectionEnd;
} else {
textarea.value += content;
textarea.focus();
}
} );
//AJAX 提交评论
$( document ).on( 'submit', '#commentform', function(){
if( !args.ajax_comment ) return true;
var form = $( this ),
respond = $( '#respond' ),
respond_parent = respond.parent(),
respond_parent_tag_name = respond_parent.get( 0 ).tagName,
comment_parent_element = null,
submit = form.find( '#submit' ),
submit_text = submit.val(),
submit_count_wait = 15,
comments_number = form.parents( '#comments' ).find( '.comments-number' ),
submit_count = function(){
if( submit_count_wait > 0 ){
submit.val( submit_count_wait );
--submit_count_wait;
setTimeout( submit_count, 1000 );
return;
}
submit.attr( 'disabled', false );
submit.val( submit_text ).fadeTo( 'slow', 1 );
};
$.ajax( {
url: args.admin_ajax,
data: form.serialize() + '&action=submit_comment',
type: form.attr( 'method' ),
beforeSend: function(){
submit.attr( 'disabled', true );
submit.val( args.comment_loading ).fadeTo( 'slow', 0.5 );
},
error: function( request ){
submit.val( request.responseText );
setTimeout( function(){
submit.attr( 'disabled', false );
submit.val( submit_text ).fadeTo( 'slow', 1 ).fadeTo( 'slow', 1 );
}, 3000 );
},
success: function( data ){
form.find( '#comment' ).val( '' );
if( comments_number.length ){
var number = parseInt( comments_number.text() );
comments_number.text( number + 1 );
}
if( respond_parent_tag_name == 'DIV' ) comment_parent_element = respond_parent.children( '.comments-list' );
else{
if( !respond_parent.children( 'ul.children' ).length ) respond.before( '<ul class="children"></ul>' );
comment_parent_element = respond_parent.children( 'ul.children' );
}
comment_parent_element.append( data );
var comment_element = comment_parent_element.children( 'li:last' );
comment_element.hide();
comment_element.fadeIn( 4000 );
$( 'html, body' ).animate( { scrollTop: comment_element.offset().top }, 900 );
submit_count();
}
} );
return false;
} );
//相关文章刷新
$( document ).on( 'click', '.related-posts-box .refresh[data-post-id]:not(.activate)', function(){
var refresh = $( this ),
posts_list = refresh.parents( '.related-posts-box' ).find( '.related-posts' );
$.ajax( {
url: args.admin_ajax,
type: 'GET',
data: {
action: 'related_posts_refresh',
post_id: refresh.data( 'post-id' )
},
beforeSend: function(){
refresh.addClass( 'activate' );
posts_list.fadeTo( 500, 0.3 );
},
complete: function(){
refresh.removeClass( 'activate' );
posts_list.fadeTo( 500, 1 );
},
success: function( data ){
posts_list.html( data );
}
} );
} );
//文章页 tab 菜单
$( document ).on( 'click', '#mobile-tab-menu > li:not(.disable)', function(){
$( this ).parent( 'ul' ).children( 'li' ).removeClass( 'current' );
$( this ).addClass( 'current' );
var current = $( this ).data( 'tab' ),
articles = {
context: '.context',
related: '.related-posts-box',
comments: '#comments'
};
$.each( articles, function( article, selector ){
article == current ? $( selector ).removeClass( 'mobile-hide' ) : $( selector ).addClass( 'mobile-hide' );
} );
} );
//移动版搜索框蒙版
$( document ).on( 'focus', '#mobile-header .mobile-title .search-form .search-text', function(){
$( '.search-mobile-mask' ).fadeIn();
} );
$( document ).on( 'blur', '#mobile-header .mobile-title .search-form .search-text', function(){
$( '.search-mobile-mask' ).fadeOut();
} );
//返回顶部
$( window ).scroll( function(){
var element = $( '#return-top' );
$( window ).scrollTop() > 150 && !is_mobile() ? element.fadeIn() : element.fadeOut();
} );
$( document ).on( 'click', '#return-top', function(){
$( 'html, body' ).animate( { scrollTop: 0 }, 300 );
return false;
} );
//AJAX 加载页面
( function(){
if( !args.ajax_load_page || !history.pushState ) return true;
var start_push = true,
ajax_obj = null,
menu = null,
load_posts_list = false;
//AJAX 加载链接
$( document ).on( 'click', 'a:not([data-no-ajax], .comment-reply-link, #cancel-comment-reply-link)', function(){
var url = $( this ).attr( 'href' ),
site_url = args.site_url,
target = $( this ).attr( 'target' );
if(
( target && target != '_self' ) ||
this.pathname.indexOf( '/wp-admin' ) !== -1 ||
this.pathname.indexOf( '/wp-login.php' ) !== -1 ||
this.pathname.indexOf( '/feed' ) !== -1 ||
this.search.indexOf( '?feed=' ) !== -1 ||
this.search.indexOf( '&feed=' ) !== -1 ||
this.pathname.indexOf( '.js' ) !== -1 ||
this.pathname.indexOf( '.css' ) !== -1 ||
this.pathname.indexOf( '.bmp' ) !== -1 ||
this.pathname.indexOf( '.pcx' ) !== -1 ||
this.pathname.indexOf( '.png' ) !== -1 ||
this.pathname.indexOf( '.jpg' ) !== -1 ||
this.pathname.indexOf( '.gif' ) !== -1 ||
this.pathname.indexOf( '.tiff' ) !== -1 ||
this.pathname.indexOf( '.zip' ) !== -1 ||
this.pathname.indexOf( '.rar' ) !== -1 ||
this.pathname.indexOf( '.psd' ) !== -1 ||
this.hostname != document.domain
) return true;
ajax_load_page( url );
return false;
} );
//AJAX 刷新
$( document ).on( 'click', '#header .control > li.refresh > a', function(){
ajax_load_page( location.href );
return false;
} );
//AJAX 搜索
$( document ).on( 'submit', '.search-form', function(){
var action = $( this ).attr( 'action' ),
a_element = document.createElement( 'a' );
a_element.href = action;
ajax_load_page( action + ( a_element.search ? '&' : '?' ) + $( this ).serialize() );
return false;
} );
//修改菜单高亮
$( document ).on( 'click', '.menu li a', function(){
menu = $( this );
} );
//修改移动菜单高亮
$( document ).on( 'click', '#mobile-menu > li > a', function(){
set_mobile_menu_current( $( this ).parent( 'li' ).data( 'name' ) );
} );
//解码转义 HTML
function html_decode( value ){
return $( '<p />' ).html( value ).text();
}
//AJAX 加载页面
function ajax_load_page( url ){
if( ajax_obj ) ajax_obj.abort();
ajax_obj = $.ajax( {
url: url,
type: 'GET',
data: 'ajax_load=page',
dataType: 'json',
beforeSend: function(){
progress( 'start' );
progress( 'inc' );
$( '#container' ).fadeTo( 500, 0.3 );
},
complete: function(){
ajax_obj = null;
},
error: function( request ){
switch( request.statusText ){
case 'abort':
progress( 'done' );
break;
case 'OK':
window.location.href = url;
break;
default:
alert( request.statusText );
$( '#container' ).fadeTo( 500, 1, function(){
progress( 'done' );
} );
progress( 'inc' );
break;
}
},
success: function( data ){
if( start_push ){
history.pushState( get_state(), document.title, location.href );
start_push = false;
}
$( 'html, body' ).animate( { scrollTop: 0 }, 120 );
$( '.menu li.menu-item' ).removeClass( 'current-menu-item current-menu-parent current_page_item current-post-ancestor' );
if( menu ){
menu.parent( 'li.menu-item' ).addClass( 'current-menu-item' ).parents( 'li.menu-item' ).addClass( 'current-menu-parent' );
menu = null;
}
document.title = html_decode( data.title );
$( '#container' ).replaceWith( data.code );
$( '#container' ).fadeTo( 0, 0.3 ).fadeTo( 500, 1, function(){
progress( 'done' );
} );
$( 'body' ).attr( 'class', data.body_class );
slider_init();
if( data.refresh_sidebar ) $( '#sidebar' ).replaceWith( data.sidebar_code );
if( data.mobile_menu_current ) set_mobile_menu_current( data.mobile_menu_current );
$( '#mobile-header .mobile-title' ).html( data.mobile_title );
data.mobile_return_show ? $( '#mobile-header .mobile-return' ).addClass( 'show' ) : $( '#mobile-header .mobile-return' ).removeClass( 'show' );
// 兼容 SyntaxHighlighter 插件
if ( window.SyntaxHighlighter )
SyntaxHighlighter.highlight();
// 兼容 Crayon Syntax Highlighter 插件
if ( window.CrayonSyntax )
CrayonSyntax.init();
// 兼容 Hermit 音乐播放器
if ( window.hermitjs )
hermitjs.reload( 0 );
history.pushState( get_state(), data.title, url );
goto_hash_element();
progress( 'inc' );
}
} );
}
//浏览器前进后退
window.addEventListener( 'popstate', function( e ){
if( !e.state ) return;
document.title = e.state.title;
$( '#container' ).replaceWith( e.state.code );
$( '#sidebar' ).replaceWith( e.state.sidebar_code );
$( 'body' ).attr( 'class', e.state.body_class );
set_mobile_menu_current( e.state.mobile_menu_current );
$( '#mobile-header .mobile-title' ).html( e.state.mobile_title );
e.state.mobile_return_show ? $( '#mobile-header .mobile-return' ).addClass( 'show' ) : $( '#mobile-header .mobile-return' ).removeClass( 'show' );
});
//调用进度条
function progress( cb ){
if( args.progress ){
var func = NProgress[cb];
return func();
}
return false;
}
//获取网页内容
function get_state(){
return {
title: document.title,
code: $( '#container' ).clone().fadeTo( 0, 1 ).prop( 'outerHTML' ),
body_class: $( 'body' ).attr( 'class' ),
sidebar_code: $( '#sidebar' ).prop( 'outerHTML' ),
mobile_menu_current: $( '#mobile-menu > li.current' ).data( 'name' ),
mobile_title: $( '#mobile-header .mobile-title' ).html(),
mobile_return_show: $( '#mobile-header .mobile-return' ).hasClass( 'show' )
};
}
//锚点跳转
function goto_hash_element(){
setTimeout( function(){
var hash_element = $( location.hash );
if( hash_element.length ) $( 'html, body' ).animate( { scrollTop: hash_element.offset().top }, 120 );
}, 500 );
}
//设置移动菜单高亮
function set_mobile_menu_current( current ){
$( '#mobile-menu > li' ).removeClass( 'current' ).filter( '.' + current ).addClass( 'current' );
}
//下拉加载文章
$( window ).scroll( function(){
if( $( this ).scrollTop() < $( document ).height() - $( this ).height() - 10 || !is_mobile() || ajax_obj ) return;
var page_navi = $( '.posts-list-mobile-page-navi' ),
next_link = page_navi.data( 'next-link' );
if( !next_link ) return;
ajax_obj = $.ajax( {
url: next_link,
type: 'GET',
data: 'ajax_load=page',
dataType: 'json',
beforeSend: function(){
$( '.posts-list-mobile-page-navi' ).addClass( 'loading' );
},
complete: function(){
ajax_obj = null;
load_posts_list = false;
$( '.posts-list-mobile-page-navi' ).removeClass( 'loading' );
},
error: function( request ){
if( request.statusText != 'abort' ) alert( request.statusText );
},
success: function( data ){
document.title = html_decode( data.title );
var element = $( data.code );
$( 'body' ).attr( 'class', data.body_class );
element.find( '.posts-list > li' ).appendTo( '.posts-list' );
element.find( '.posts-list-mobile-page-navi' ).replaceAll( '.posts-list-mobile-page-navi' );
$( '.posts-list-page-navi' ).remove();
}
} );
} );
} )();
} )( jQuery, document, window, theme_base_args );