jquery.pjax.min.js
8.76 KB
!function(t){function e(e,a,r){var i=this;return this.on("click.pjax",e,function(e){var o=t.extend({history:!0},m(a,r));o.container||(o.container=t(this).attr("data-pjax")||i),n(e,o)})}function n(e,n,a){a=m(n,a);var i=e.currentTarget;if(0!=t(i).data("pjax")){if("A"!==i.tagName.toUpperCase())throw"$.fn.pjax or $.pjax.click requires an anchor element";if(!(e.which>1||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||location.protocol!==i.protocol||location.hostname!==i.hostname||i.href.indexOf("#")>-1&&h(i)==h(location)||e.isDefaultPrevented())){var o={url:i.href,container:t(i).attr("data-pjax"),target:i},c=t.extend({},o,a),s=t.Event("pjax:click");t(i).trigger(s,[c]),s.isDefaultPrevented()||(r(c),e.preventDefault(),t(i).trigger("pjax:clicked",[c]))}}}function a(e,n,a){a=m(n,a);var i=e.currentTarget,o=t(i);if("FORM"!==i.tagName.toUpperCase())throw"$.pjax.submit requires a form element";var c={type:(o.attr("method")||"GET").toUpperCase(),url:o.attr("action"),container:o.attr("data-pjax"),target:i};if("GET"!==c.type&&void 0!==window.FormData)c.data=new FormData(i),c.processData=!1,c.contentType=!1;else{if(t(i).find(":file").length)return;c.data=t(i).serializeArray()}r(t.extend({},c,a)),e.preventDefault()}function r(e){function n(e,n,r){r||(r={}),r.relatedTarget=a;var i=t.Event(e,r);return c.trigger(i,n),!i.isDefaultPrevented()}e=t.extend(!0,{},t.ajaxSettings,r.defaults,e),t.isFunction(e.url)&&(e.url=e.url());var a=e.target,i=f(e.url).hash,c=e.context=x(e.container);e.data||(e.data={}),t.isArray(e.data)?(e.data=t.grep(e.data,function(t){return"_pjax"!==t.name}),e.data.push({name:"_pjax",value:c.selector})):e.data._pjax=c.selector;var s;if(e.beforeSend=function(t,a){if("GET"!==a.type&&(a.timeout=0),t.setRequestHeader("X-PJAX","true"),t.setRequestHeader("X-PJAX-Container",c.selector),a.ieRedirectCompatibility){var r=window.navigator.userAgent;(r.indexOf("MSIE ")>0||r.indexOf("Trident/")>0||r.indexOf("Edge/")>0)&&t.setRequestHeader("X-Ie-Redirect-Compatibility","true")}if(!n("pjax:beforeSend",[t,a]))return!1;a.timeout>0&&(s=setTimeout(function(){n("pjax:timeout",[t,e])&&t.abort("timeout")},a.timeout),a.timeout=0);var o=f(a.url);i&&(o.hash=i),e.requestUrl=d(o)},e.complete=function(t,a){s&&clearTimeout(s),n("pjax:complete",[t,a,e]),n("pjax:end",[t,e])},e.error=function(t,a,r){var i=y("",t,e),c=t.status>=301&&t.status<=303,s=c||n("pjax:error",[t,a,r,e]);(c||"GET"==e.type&&"abort"!==a&&s)&&(e.replaceRedirect?o(i.url):e.pushRedirect&&(window.history.pushState(null,"",i.url),window.location.replace(i.url)))},e.success=function(a,s,u){var p=r.state,d="function"==typeof t.pjax.defaults.version?t.pjax.defaults.version():t.pjax.defaults.version,h=u.getResponseHeader("X-PJAX-Version"),m=y(a,u,e),x=f(m.url);if(i&&(x.hash=i,m.url=x.href),d&&h&&d!==h)o(m.url);else if(m.contents){if(r.state={id:e.id||l(),url:m.url,title:m.title,container:c.selector,fragment:e.fragment,timeout:e.timeout,cache:e.cache},e.history&&(e.push||e.replace)&&window.history.replaceState(r.state,m.title,m.url),t.contains(e.container,document.activeElement))try{document.activeElement.blur()}catch(t){}m.title&&(document.title=m.title),n("pjax:beforeReplace",[m.contents,e],{state:r.state,previousState:p}),c.html(m.contents);var v=c.find("input[autofocus], textarea[autofocus]").last()[0];v&&document.activeElement!==v&&v.focus(),j(m.scripts,c);var g=e.scrollTo;if(i){var w=decodeURIComponent(i.slice(1)),b=document.getElementById(w)||document.getElementsByName(w)[0];b&&(g=t(b).offset().top)}"number"==typeof g&&t(window).scrollTop(g),n("pjax:success",[a,s,u,e])}else o(m.url)},r.state||(r.state={id:l(),url:window.location.href,title:document.title,container:c.selector,fragment:e.fragment,timeout:e.timeout,cache:e.cache},window.history.replaceState(r.state,document.title)),!(r.xhr&&r.xhr.readyState<4&&r.options.skipOuterContainers)){u(r.xhr),r.options=e;var h=r.xhr=t.ajax(e);return h.readyState>0&&(e.history&&e.push&&!e.replace&&(w(r.state.id,p(c)),window.history.pushState(null,"",e.requestUrl)),n("pjax:start",[h,e]),n("pjax:send",[h,e])),r.xhr}}function i(e,n){var a={url:window.location.href,push:!1,replace:!0,scrollTo:!1};return r(t.extend(a,m(e,n)))}function o(t){r.options.history&&(window.history.replaceState(null,"",r.state.url),window.location.replace(t))}function c(e){R||u(r.xhr);var n,a=r.state,i=e.state;if(i&&i.container){if(R&&P==i.url)return;if(a){if(a.id===i.id)return;n=a.id<i.id?"forward":"back"}var c=O[i.id]||[],s=t(c[0]||i.container),l=c[1];if(s.length){var d={id:i.id,url:i.url,container:s,push:!1,fragment:i.fragment,timeout:i.timeout,cache:i.cache,scrollTo:!1};a&&d.cache&&b(n,a.id,p(s));var f=t.Event("pjax:popstate",{state:i,direction:n});if(s.trigger(f),l){s.trigger("pjax:start",[null,d]),r.state=i,i.title&&(document.title=i.title);var h=t.Event("pjax:beforeReplace",{state:i,previousState:a});s.trigger(h,[l,d]),s.html(l),s.trigger("pjax:end",[null,d])}else r(d);s[0].offsetHeight}else o(location.href)}R=!1}function s(e){var n=t.isFunction(e.url)?e.url():e.url,a=e.type?e.type.toUpperCase():"GET",r=t("<form>",{method:"GET"===a?"GET":"POST",action:n,style:"display:none"});"GET"!==a&&"POST"!==a&&r.append(t("<input>",{type:"hidden",name:"_method",value:a.toLowerCase()}));var i=e.data;if("string"==typeof i)t.each(i.split("&"),function(e,n){var a=n.split("=");r.append(t("<input>",{type:"hidden",name:a[0],value:a[1]}))});else if(t.isArray(i))t.each(i,function(e,n){r.append(t("<input>",{type:"hidden",name:n.name,value:n.value}))});else if("object"==typeof i){var o;for(o in i)r.append(t("<input>",{type:"hidden",name:o,value:i[o]}))}t(document.body).append(r),r.submit()}function u(e){e&&e.readyState<4&&(e.onreadystatechange=t.noop,e.abort())}function l(){return(new Date).getTime()}function p(t){var e=t.clone();return e.find("script").each(function(){this.src||jQuery._data(this,"globalEval",!1)}),[t.selector,e.contents()]}function d(t){return t.search=t.search.replace(/([?&])(_pjax|_)=[^&]*/g,""),t.href.replace(/\?($|#)/,"$1")}function f(t){var e=document.createElement("a");return e.href=t,e}function h(t){return t.href.replace(/#.*/,"")}function m(e,n){return e&&n?n.container=e:n=t.isPlainObject(e)?e:{container:e},n.container&&(n.container=x(n.container)),n}function x(e){if((e=t(e)).length){if(""!==e.selector&&e.context===document)return e;if(e.attr("id"))return t("#"+e.attr("id"));throw"cant get selector for pjax container!"}throw"no pjax container for "+e.selector}function v(t,e){return t.filter(e).add(t.find(e))}function g(e){return t.parseHTML(e,document,!0)}function y(e,n,a){var r={},i=/<html/i.test(e),o=n.getResponseHeader("X-PJAX-URL");if(r.url=o?d(f(o)):a.requestUrl,i)var c=t(g(e.match(/<head[^>]*>([\s\S.]*)<\/head>/i)[0])),s=t(g(e.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0]));else c=s=t(g(e));if(0===s.length)return r;if(r.title=v(c,"title").last().text(),a.fragment){if("body"===a.fragment)u=s;else var u=v(s,a.fragment).first();u.length&&(r.contents="body"===a.fragment?u:u.contents(),r.title||(r.title=u.attr("title")||u.data("title")))}else i||(r.contents=s);return r.contents&&(r.contents=r.contents.not(function(){return t(this).is("title")}),r.contents.find("title").remove(),r.scripts=v(r.contents,"script").remove(),r.contents=r.contents.not(r.scripts)),r.title&&(r.title=t.trim(r.title)),r}function j(e,n){if(e){var a=t("script[src]"),r=function(e){var r=this.src;a.filter(function(){return this.src===r}).length?e():r?(t.getScript(r).done(e).fail(e),document.head.appendChild(this)):(n.append(this),e())},i=0,o=function(){if(!(i>=e.length)){var t=e[i];i++,r.call(t,o)}};o()}}function w(t,e){r.options.cache&&(O[t]=e,k.push(t),T(X,0),T(k,r.defaults.maxCacheLength))}function b(t,e,n){var a,i;O[e]=n,"forward"===t?(a=k,i=X):(a=X,i=k),a.push(e),(e=i.pop())&&delete O[e],T(a,r.defaults.maxCacheLength)}function T(t,e){for(;t.length>e;)delete O[t.shift()]}function E(){return t("meta").filter(function(){var e=t(this).attr("http-equiv");return e&&"X-PJAX-VERSION"===e.toUpperCase()}).attr("content")}function S(){t.fn.pjax=e,t.pjax=r,t.pjax.enable=t.noop,t.pjax.disable=C,t.pjax.click=n,t.pjax.submit=a,t.pjax.reload=i,t.pjax.defaults={history:!0,cache:!0,timeout:650,push:!0,replace:!1,type:"GET",dataType:"html",scrollTo:0,maxCacheLength:20,version:E,pushRedirect:!1,replaceRedirect:!0,skipOuterContainers:!1,ieRedirectCompatibility:!0},t(window).on("popstate.pjax",c)}function C(){t.fn.pjax=function(){return this},t.pjax=s,t.pjax.enable=S,t.pjax.disable=t.noop,t.pjax.click=t.noop,t.pjax.submit=t.noop,t.pjax.reload=function(){window.location.reload()},t(window).off("popstate.pjax",c)}var R=!0,P=window.location.href,A=window.history.state;A&&A.container&&(r.state=A),"state"in window.history&&(R=!1);var O={},X=[],k=[];t.inArray("state",t.event.props)<0&&t.event.props.push("state"),t.support.pjax=window.history&&window.history.pushState&&window.history.replaceState&&!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/),t.support.pjax?S():C()}(jQuery);