From 18ce99c8f689fda3db5d4bc182cd655cd3c83387 Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Tue, 5 Jun 2018 23:48:45 +0800 Subject: [PATCH] Squashed 'packages/pjax/' content from commit 8abb21e git-subtree-dir: packages/pjax git-subtree-split: 8abb21e1e9d899217b03c489c9b2d9ecd92074b5 --- .editorconfig | 16 + .gitignore | 6 + .jscsrc | 132 + .jshintrc | 9 + .travis.yml | 7 + CHANGELOG.md | 125 + LICENSE | 20 + README.md | 670 +++ example/example.js | 61 + example/forms.html | 138 + example/index.html | 29 + example/page2.html | 15 + example/page3.html | 15 + index.d.ts | 205 + index.js | 279 + lib/abort-request.js | 8 + lib/eval-script.js | 41 + lib/events/off.js | 11 + lib/events/on.js | 11 + lib/events/trigger.js | 31 + lib/execute-scripts.js | 18 + lib/foreach-els.js | 9 + lib/foreach-selectors.js | 8 + lib/is-supported.js | 8 + lib/parse-options.js | 41 + lib/proto/attach-form.js | 132 + lib/proto/attach-link.js | 82 + lib/proto/handle-response.js | 70 + lib/proto/log.js | 11 + lib/proto/parse-element.js | 22 + lib/send-request.js | 78 + lib/switches-selectors.js | 37 + lib/switches.js | 122 + lib/uniqueid.js | 8 + lib/util/clone.js | 13 + lib/util/contains.js | 12 + lib/util/extend.js | 21 + lib/util/noop.js | 1 + lib/util/update-query-string.js | 10 + package-lock.json | 6892 +++++++++++++++++++++++++ package.json | 56 + tests/lib/abort-request.js | 56 + tests/lib/eval-scripts.js | 23 + tests/lib/events.js | 110 + tests/lib/execute-scripts.js | 29 + tests/lib/foreach-els.js | 45 + tests/lib/foreach-selectors.js | 24 + tests/lib/is-supported.js | 8 + tests/lib/parse-options.js | 49 + tests/lib/proto/attach-form.js | 184 + tests/lib/proto/attach-link.js | 143 + tests/lib/proto/handle-response.js | 208 + tests/lib/proto/parse-element.js | 27 + tests/lib/send-request.js | 137 + tests/lib/switch-selectors.js | 74 + tests/lib/switches.js | 78 + tests/lib/uniqueid.js | 12 + tests/lib/util/clone.js | 17 + tests/lib/util/contains.js | 16 + tests/lib/util/extend.js | 17 + tests/lib/util/noop.js | 9 + tests/lib/util/update-query-string.js | 21 + tests/setup.js | 6 + tests/test.ts | 41 + 64 files changed, 10814 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .jscsrc create mode 100644 .jshintrc create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 example/example.js create mode 100644 example/forms.html create mode 100644 example/index.html create mode 100644 example/page2.html create mode 100644 example/page3.html create mode 100644 index.d.ts create mode 100644 index.js create mode 100644 lib/abort-request.js create mode 100644 lib/eval-script.js create mode 100644 lib/events/off.js create mode 100644 lib/events/on.js create mode 100644 lib/events/trigger.js create mode 100644 lib/execute-scripts.js create mode 100644 lib/foreach-els.js create mode 100644 lib/foreach-selectors.js create mode 100644 lib/is-supported.js create mode 100644 lib/parse-options.js create mode 100644 lib/proto/attach-form.js create mode 100644 lib/proto/attach-link.js create mode 100644 lib/proto/handle-response.js create mode 100644 lib/proto/log.js create mode 100644 lib/proto/parse-element.js create mode 100644 lib/send-request.js create mode 100644 lib/switches-selectors.js create mode 100644 lib/switches.js create mode 100644 lib/uniqueid.js create mode 100644 lib/util/clone.js create mode 100644 lib/util/contains.js create mode 100644 lib/util/extend.js create mode 100644 lib/util/noop.js create mode 100644 lib/util/update-query-string.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tests/lib/abort-request.js create mode 100644 tests/lib/eval-scripts.js create mode 100644 tests/lib/events.js create mode 100644 tests/lib/execute-scripts.js create mode 100644 tests/lib/foreach-els.js create mode 100644 tests/lib/foreach-selectors.js create mode 100644 tests/lib/is-supported.js create mode 100644 tests/lib/parse-options.js create mode 100644 tests/lib/proto/attach-form.js create mode 100644 tests/lib/proto/attach-link.js create mode 100644 tests/lib/proto/handle-response.js create mode 100644 tests/lib/proto/parse-element.js create mode 100644 tests/lib/send-request.js create mode 100644 tests/lib/switch-selectors.js create mode 100644 tests/lib/switches.js create mode 100644 tests/lib/uniqueid.js create mode 100644 tests/lib/util/clone.js create mode 100644 tests/lib/util/contains.js create mode 100644 tests/lib/util/extend.js create mode 100644 tests/lib/util/noop.js create mode 100644 tests/lib/util/update-query-string.js create mode 100644 tests/setup.js create mode 100644 tests/test.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8978b44 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# editorconfig.org +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..561eeb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +node_modules/ +tests/scripts/index.html +pjax.js +.nyc_output/ +pjax.min.js diff --git a/.jscsrc b/.jscsrc new file mode 100644 index 0000000..27bc03b --- /dev/null +++ b/.jscsrc @@ -0,0 +1,132 @@ +{ + "excludeFiles": [ + "node_modules/**", + "pjax.js", + "pjax.min.js" + ], + "fileExtensions": [ + ".js" + ], + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do", + "try", + "catch" + ], + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "return", + "try", + "catch" + ], + "requireSpaceBeforeBlockStatements": true, + "requireParenthesesAroundIIFE": true, + "requireSpacesInConditionalExpression": { + "afterTest": true, + "beforeConsequent": true, + "afterConsequent": true, + "beforeAlternate": true + }, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowMultipleVarDecl": true, + "requireBlocksOnNewline": 1, + "disallowPaddingNewlinesInBlocks": true, + "disallowEmptyBlocks": true, + "disallowSpacesInsideObjectBrackets": true, + "disallowSpacesInsideArrayBrackets": true, + "disallowSpacesInsideParentheses": true, + "disallowQuotedKeysInObjects": "allButReserved", + "disallowSpaceAfterObjectKeys": true, + "requireCommaBeforeLineBreak": true, + "requireOperatorBeforeLineBreak": [ + "?", + "+", + "-", + "/", + "*", + "=", + "==", + "===", + "!=", + "!==", + ">", + ">=", + "<", + "<=" + ], + "disallowSpaceAfterPrefixUnaryOperators": [ + "++", + "--", + "+", + "-", + "~", + "!" + ], + "disallowSpaceBeforePostfixUnaryOperators": [ + "++", + "--" + ], + "requireSpaceBeforeBinaryOperators": [ + "+", + "-", + "/", + "*", + "=", + "==", + "===", + "!=", + "!==" + ], + "requireSpaceAfterBinaryOperators": [ + "+", + "-", + "/", + "*", + "=", + "==", + "===", + "!=", + "!==" + ], + "disallowImplicitTypeConversion": [ + "numeric", + "boolean", + "binary", + "string" + ], + "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", + "disallowKeywords": [ + "with" + ], + "disallowMultipleLineStrings": true, + "validateQuoteMarks": "\"", + "validateIndentation": 2, + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "requireKeywordsOnNewLine": [ + "else" + ], + "requireLineFeedAtFileEnd": true, + "requireCapitalizedConstructors": true, + "safeContextKeyword": "that", + "requireDotNotation": true, + "jsDoc": { + "checkParamNames": true, + "checkRedundantParams": true, + "requireParamTypes": true + }, + "requireSpaceAfterLineComment": true +} diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..9f268f7 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,9 @@ +{ + "newcap": false, + "undef": true, + "unused": true, + "asi": true, + "esnext": true, + "node": true, + "browser": true +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..9c9521d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: "node_js" +node_js: + - "6" + - "8" +# Force Travis to use npm v5 +# https://github.com/travis-ci/travis-ci/issues/4653#issuecomment-194051953 +before_install: if [[ `npm -v` != 5* ]]; then npm i -g npm@5; fi diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7909fff --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,125 @@ +# 0.2.6 - 2018-04-30 + +- Fixed: Form submission for GET requests. + ([#129](https://github.com/MoOx/pjax/pull/129) - @robinnorth) +- Fixed: Refactor `loadUrl()` to make manually calling simpler. + ([#134](https://github.com/MoOx/pjax/pull/134) - @robinnorth) +- Fixed: Support multiple select fields in form submissions. + ([#147](https://github.com/MoOx/pjax/pull/147) - @robinnorth) +- Fixed: Use the same options object in `handle-response` as in `send-request`. This way, `pjax.state.options` will also have the request options. + ([#148](https://github.com/MoOx/pjax/pull/148) - @BehindTheMath) +- Added: Move the XHR callback to a separate method, and trigger an error event if the response cannot be parsed. + ([#137](https://github.com/MoOx/pjax/pull/137) - @BehindTheMath) +- Added: TypeScript definitions. + ([#138](https://github.com/MoOx/pjax/pull/138) - @BehindTheMath) +- Added: `replaceNode` switch, as an alternative to the `outerHTML` switch. + ([#141](https://github.com/MoOx/pjax/pull/141) - @BehindTheMath) +- Added: `X-PJAX-Selectors` HTTP header. This is a serialized JSON array of selectors, taken from `options.selectors`. You can use this to send back only the elements that Pjax will use to switch, instead of sending the whole page. + ([#144](https://github.com/MoOx/pjax/pull/144) - @BehindTheMath) +- Added: An option to use `FormData` to submit forms. + ([#153](https://github.com/MoOx/pjax/pull/153) - @BehindTheMath) +- Added: Tests. + ([f98f2dd](https://github.com/MoOx/pjax/commit/f98f2dd63b48113ff91b6bd8808257bfc723ef6b), [#145](https://github.com/MoOx/pjax/pull/145) - @robinnorth, @BehindTheMath) + +# 0.2.5 - 2018-02-02 + +- Fixed: Async switch functions now work correctly, because the DOM is now parsed after all the switches finish. + ([#79](https://github.com/MoOx/pjax/pull/79), [#110](https://github.com/MoOx/pjax/pull/110) - @oskarrough, @BehindTheMath, @robinnorth) +- Fixed: Bug on IE11 preventing AJAX page refresh. + ([#81](https://github.com/MoOx/pjax/pull/81) - @CPTechnikVX) +- Fixed: Default switches are now available as `Pjax.switches`. + ([#92](https://github.com/MoOx/pjax/pull/92) - @BehindTheMath) +- Fixed: An error that was caused by a missing `switchElementsAlt`. + ([#93](https://github.com/MoOx/pjax/pull/93), [#104](https://github.com/MoOx/pjax/pull/104) - @BehindTheMath, @robinnorth) +- Fixed: Incorrect `main` field in npm package + ([#105](https://github.com/MoOx/pjax/pull/105) - @robinnorth) +- Fixed: A pending XHR is now aborted if the user navigates somewhere else before the request is finished. + ([#114](https://github.com/MoOx/pjax/pull/114) - @robinnorth) +- Fixed: When rendering new content, focus will now be removed only from elements within one of the containers manipulated by Pjax. + ([#116](https://github.com/MoOx/pjax/pull/116) - @BehindTheMath) +- Fixed: Stop dispatching extraneous `pjax:complete` events when external scripts load + ([#118](https://github.com/MoOx/pjax/pull/118) - @robinnorth) +- Added: Send the `X-PJAX` header with XHR requests. + ([#80](https://github.com/MoOx/pjax/pull/80) - @bram1028) +- Added: Direct download link for script tags. (@MoOx) +- Added: Pass the element that triggered Pjax to the `pjax:send` event. + ([#94](https://github.com/MoOx/pjax/pull/94) - @BehindTheMath) +- Added: An option to set a timeout for XHR requests. + ([#95](https://github.com/MoOx/pjax/pull/95) - @BehindTheMath) +- Added: Checks for XHR redirects + ([#101](https://github.com/MoOx/pjax/pull/101) - @BehindTheMath) +- Added: Save scroll position with history, and restore when navigating backwards or forwards. + ([#110](https://github.com/MoOx/pjax/pull/110), [#119](https://github.com/MoOx/pjax/pull/119) - @BehindTheMath, @robinnorth) +- Added: Scroll to element position when URL contains a hash + ([#110](https://github.com/MoOx/pjax/pull/110) - @BehindTheMath) +- Added: Minified version of the Pjax bundle. + ([#115](https://github.com/MoOx/pjax/pull/115) - @BehindTheMath) +- Changed: Miscellaneous code and tests cleanup. + ([#96](https://github.com/MoOx/pjax/pull/96), [#98](https://github.com/MoOx/pjax/pull/98), [#99](https://github.com/MoOx/pjax/pull/99), [#100](https://github.com/MoOx/pjax/pull/1070), [#107](https://github.com/MoOx/pjax/pull/107), [#113](https://github.com/MoOx/pjax/pull/113), [#120](https://github.com/MoOx/pjax/pull/120) - @BehindTheMath, @MoOx, @robinnorth) + +# 0.2.4 - 2016-06-28 + +- Fixed: ``refresh`` should now work (use `this.parseDOM` for refresh) + ([#67](https://github.com/MoOx/pjax/pull/67) - @compressed) +- Fixed: Some attributes, such as `itemscope` have no corresponding value. + This change allows them to still be set. + ([#67](https://github.com/MoOx/pjax/pull/67) - @compressed) +- Added: ``cacheBust`` option + ([#71](https://github.com/MoOx/pjax/pull/71) - @tremby) + +# 0.2.3 - 2016-03-24 + +- Fixed: ``currentUrlFullReload`` option now works +- Fixed: ``this.reload`` is now a Function + ([#65](https://github.com/MoOx/pjax/issues/65)) + +# 0.2.2 - 2016-03-12 + +- Fixed: added back standalone version in `./pjax.js` +([#57](https://github.com/MoOx/pjax/issues/57) +- Fixed: error when using pjax with google analytics (``options`` was undefined) +([#59](https://github.com/MoOx/pjax/pull/59)) +- Fixed: HierarchyRequestError error +([#49](https://github.com/MoOx/pjax/pull/49)) +- Fixed: ``TypeError: Pjax.forEachEls is not a function`` +([#52](https://github.com/MoOx/pjax/pull/52)) +- Fixed: ``TypeError: Pjax.executeScripts is not a function`` +([#52](https://github.com/MoOx/pjax/pull/52)) +- Fixed: ``TypeError: Pjax.clone is not a function`` +([#52](https://github.com/MoOx/pjax/pull/52)) +- Added: Ignore events with prevented defaults +([#50](https://github.com/MoOx/pjax/pull/50)) + +# 0.2.1 - 2015-02-04 + +- Fixed: it's better when a release have actual files. + +# 0.2.0 - 2015-02-04 + +- Fixed: prevent scrollTo from being converted from false to 0 ([#33](https://github.com/MoOx/pjax/pull/33)) +- Changed: code exploded in commonjs style +- Added: lots of tests +- Added: `refresh` method to force update a DOM element ([#36](https://github.com/MoOx/pjax/pull/36)) + +# 0.1.4 - 2014-10-14 + +- Fixed: allow to load pages without any attributes on `` element (fix [#6](https://github.com/MoOx/pjax/issues/6)) +- Fixed: make `Pjax.switches.sideBySide` method usable (fix [#13](https://github.com/MoOx/pjax/issues/13)) + +# 0.1.3 - 2014-09-16 + +- Fixed: clicking on the current url somewhere does not produce a full reload by default (see option `currentUrlFullReload`) +- Fixed: `document.implementation.createHTMLDocument` error (in IE10, ref [#16](https://github.com/MoOx/pjax/pull/16)) + +# 0.1.2 - 2014-04-03 + +- Changed: `pjax.js` relocated in `src/` +- Fixed: `` attributes of pjaxified document are now available + +# 0.1.1 - 2014-04-02 + +- Fixed: safer UMD wrapper (fix concat issue) + +# 0.1.0 - 2014-03-24 + +✨ Initial release diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8b39b8f --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Maxime Thirouin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c056a03 --- /dev/null +++ b/README.md @@ -0,0 +1,670 @@ +# Pjax + +[![Build Status](https://img.shields.io/travis/MoOx/pjax.svg)](https://travis-ci.org/MoOx/pjax). + +> Easily enable fast AJAX navigation on any website (using pushState() + XHR) + +Pjax is **a standalone JavaScript module** that uses +AJAX (XmlHttpRequest) and +[pushState()](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history) +to deliver a fast browsing experience. + +_It allows you to completely transform the user experience of standard websites +(server-side generated or static ones) to make them feel like they are browsing an app, +especially for users with low bandwidth connection._ + +**No more full page reloads. No more multiple HTTP requests.** + +_Pjax does not rely on other libraries, like jQuery or similar. It is written entirely in vanilla JS._ + +## Installation + +- You can install Pjax from **npm**: + ```shell + npm install pjax + ``` + +- You can also link directly to the [bundle](https://cdn.jsdelivr.net/npm/pjax/pjax.js): + ```html + + ``` + Or the [minified bundle](https://cdn.jsdelivr.net/npm/pjax/pjax.min.js): + ```html + + ``` + +## How Pjax works + +Pjax loads pages using AJAX and updates the browser's current URL using `pushState()` without reloading your page's layout or any resources (JS, CSS), giving a fast page load. + +_But under the hood, it's just ONE HTTP request with a `pushState()` call._ + +Obviously, for [browsers that don't support `history.pushState()`](http://caniuse.com/#search=pushstate) Pjax gracefully degrades and does not do anything at all. + +It simply works with all permalinks and can update all parts of the page you +want (including HTML metas, title, and navigation state). + +- It's not limited to one container, like jQuery-Pjax is. +- It fully supports browser history (back and forward buttons). +- It supports keyboard browsing. +- Automatically falls back to standard navigation for external pages (thanks to Captain Obvious's help). +- Automatically falls back to standard navigation for internal pages that do not have an appropriate DOM tree. +- You can add pretty cool CSS transitions (animations) very easily. +- It's around 4kb (minified and gzipped). + +### Under the hood + +- It listens to every click on links _you want_ (by default all of them). +- When an internal link is clicked, Pjax grabs HTML from your server via AJAX. +- Pjax renders the page's DOM tree (without loading any resources - images, CSS, JS...). +- It checks that all defined parts can be replaced: + - If the page doesn't meet the requirements, standard navigation is used. + - If the page meets the requirements, Pjax does all defined DOM replacements. +- Then it updates the browser's current URL using `pushState()`. + +## Overview + +Pjax is fully automatic. You don't need to setup anything in the existing HTML. +You just need to designate some elements on your page that will be replaced when +you navigate your site. + +Consider the following page. + +```html + + + + + + +
+
+ Sha blah blah. +
+ + + + + + +``` + +We want Pjax to intercept the URL `/blah`, and replace `.my-Content` with the results of the request. +Oh and the `