src/cm/media/js/lib/yui/yui3-3.15.0/build/pjax-base/pjax-base-debug.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('pjax-base', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
`Y.Router` extension that provides the core plumbing for enhanced navigation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
implemented using the pjax technique (HTML5 pushState + Ajax).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
@module pjax
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@submodule pjax-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
var win = Y.config.win,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
    // The CSS class name used to filter link clicks from only the links which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
    // the pjax enhanced navigation should be used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
    CLASS_PJAX = Y.ClassNameManager.getClassName('pjax'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
    Fired when navigating to a URL via Pjax.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    When the `navigate()` method is called or a pjax link is clicked, this event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
    will be fired if the browser supports HTML5 history _and_ the router has a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
    route handler for the specified URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
    This is a useful event to listen to for adding a visual loading indicator
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
    while the route handlers are busy handling the URL change.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
    @event navigate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
    @param {String} url The URL that the router will dispatch to its route
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
      handlers in order to fulfill the enhanced navigation "request".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
    @param {Boolean} [force=false] Whether the enhanced navigation should occur
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
      even in browsers without HTML5 history.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
    @param {String} [hash] The hash-fragment (including "#") of the `url`. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
      will be present when the `url` differs from the current URL only by its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
      hash and `navigateOnHash` has been set to `true`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
    @param {Event} [originEvent] The event that caused the navigation. Usually
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
      this would be a click event from a "pjax" anchor element.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
    @param {Boolean} [replace] Whether or not the current history entry will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
      replaced, or a new entry will be created. Will default to `true` if the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
      specified `url` is the same as the current URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
    EVT_NAVIGATE = 'navigate';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
`Y.Router` extension that provides the core plumbing for enhanced navigation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
implemented using the pjax technique (HTML5 `pushState` + Ajax).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
This makes it easy to enhance the navigation between the URLs of an application
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
in HTML5 history capable browsers by delegating to the router to fulfill the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
"request" and seamlessly falling-back to using standard full-page reloads in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
older, less-capable browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
The `PjaxBase` class isn't useful on its own, but can be mixed into a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
`Router`-based class to add Pjax functionality to that Router. For a pre-made
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
standalone Pjax router, see the `Pjax` class.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    var MyRouter = Y.Base.create('myRouter', Y.Router, [Y.PjaxBase], {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
        // ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
@class PjaxBase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
@extensionfor Router
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
function PjaxBase() {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
PjaxBase.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    // -- Protected Properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    Holds the delegated pjax-link click handler.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    @property _pjaxEvents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    @type EventHandle
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
    // -- Lifecycle Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
    initializer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
        this.publish(EVT_NAVIGATE, {defaultFn: this._defNavigateFn});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
        // Pjax is all about progressively enhancing the navigation between
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
        // "pages", so by default we only want to handle and route link clicks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
        // in HTML5 `pushState`-compatible browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
        if (this.get('html5')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
            this._pjaxBindUI();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
        if (this._pjaxEvents) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
            this._pjaxEvents.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
    Navigates to the specified URL if there is a route handler that matches. In
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
    browsers capable of using HTML5 history, the navigation will be enhanced by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
    firing the `navigate` event and having the router handle the "request".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
    Non-HTML5 browsers will navigate to the new URL via manipulation of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
    `window.location`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    When there is a route handler for the specified URL and it is being
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
    navigated to, this method will return `true`, otherwise it will return
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    `false`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    **Note:** The specified URL _must_ be of the same origin as the current URL,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
    otherwise an error will be logged and navigation will not occur. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
    intended as both a security constraint and a purposely imposed limitation as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
    it does not make sense to tell the router to navigate to a URL on a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    different scheme, host, or port.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    @method navigate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
    @param {String} url The URL to navigate to. This must be of the same origin
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
      as the current URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
    @param {Object} [options] Additional options to configure the navigation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
      These are mixed into the `navigate` event facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
        @param {Boolean} [options.replace] Whether or not the current history
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
          entry will be replaced, or a new entry will be created. Will default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
          to `true` if the specified `url` is the same as the current URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
        @param {Boolean} [options.force=false] Whether the enhanced navigation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
          should occur even in browsers without HTML5 history.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
    @return {Boolean} `true` if the URL was navigated to, `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
    navigate: function (url, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
        // The `_navigate()` method expects fully-resolved URLs.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
        url = this._resolveURL(url);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
        if (this._navigate(url, options)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
            return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
        if (!this._hasSameOrigin(url)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
            Y.error('Security error: The new URL must be of the same origin as the current URL.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
        return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
    Utility method to test whether a specified link/anchor node's `href` is of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
    the same origin as the page's current location.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
    This normalize browser inconsistencies with how the `port` is reported for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
    anchor elements (IE reports a value for the default port, e.g. "80").
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    @method _isLinkSameOrigin
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
    @param {Node} link The anchor element to test whether its `href` is of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
        same origin as the page's current location.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
    @return {Boolean} Whether or not the link's `href` is of the same origin as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
        the page's current location.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
    @since 3.6.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    _isLinkSameOrigin: function (link) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        var location = Y.getLocation(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
            protocol = location.protocol,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
            hostname = location.hostname,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
            port     = parseInt(location.port, 10) || null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
            linkPort;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        // Link must have the same `protocol` and `hostname` as the page's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
        // currrent location.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        if (link.get('protocol') !== protocol ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
                link.get('hostname') !== hostname) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
            return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
        linkPort = parseInt(link.get('port'), 10) || null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
        // Normalize ports. In most cases browsers use an empty string when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
        // port is the default port, but IE does weird things with anchor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
        // elements, so to be sure, this will re-assign the default ports before
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
        // they are compared.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
        if (protocol === 'http:') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
            port     || (port     = 80);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
            linkPort || (linkPort = 80);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
        } else if (protocol === 'https:') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
            port     || (port     = 443);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
            linkPort || (linkPort = 443);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
        // Finally, to be from the same origin, the link's `port` must match the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
        // page's current `port`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
        return linkPort === port;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    Underlying implementation for `navigate()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    @method _navigate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    @param {String} url The fully-resolved URL that the router should dispatch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
      to its route handlers to fulfill the enhanced navigation "request", or use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
      to update `window.location` in non-HTML5 history capable browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    @param {Object} [options] Additional options to configure the navigation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
      These are mixed into the `navigate` event facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
        @param {Boolean} [options.replace] Whether or not the current history
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
          entry will be replaced, or a new entry will be created. Will default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
          to `true` if the specified `url` is the same as the current URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
        @param {Boolean} [options.force=false] Whether the enhanced navigation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
          should occur even in browsers without HTML5 history.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
    @return {Boolean} `true` if the URL was navigated to, `false` otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
    _navigate: function (url, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
        url = this._upgradeURL(url);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
        // Navigation can only be enhanced if there is a route-handler.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
        if (!this.hasRoute(url)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
            return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
        // Make a copy of `options` before modifying it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
        options = Y.merge(options, {url: url});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
        var currentURL = this._getURL(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
            hash, hashlessURL;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
        // Captures the `url`'s hash and returns a URL without that hash.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
        hashlessURL = url.replace(/(#.*)$/, function (u, h, i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
            hash = h;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
            return u.substring(i);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
        if (hash && hashlessURL === currentURL.replace(/#.*$/, '')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
            // When the specified `url` and current URL only differ by the hash,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
            // the browser should handle this in-page navigation normally.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
            if (!this.get('navigateOnHash')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
                return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
            options.hash = hash;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
        // When navigating to the same URL as the current URL, behave like a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
        // browser and replace the history entry instead of creating a new one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
        'replace' in options || (options.replace = url === currentURL);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
        // The `navigate` event will only fire and therefore enhance the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
        // navigation to the new URL in HTML5 history enabled browsers or when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
        // forced. Otherwise it will fallback to assigning or replacing the URL
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
        // on `window.location`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
        if (this.get('html5') || options.force) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
            this.fire(EVT_NAVIGATE, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        } else if (win) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
            if (options.replace) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
                win.location.replace(url);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
                win.location = url;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
        return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
    Binds the delegation of link-click events that match the `linkSelector` to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
    the `_onLinkClick()` handler.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
    By default this method will only be called if the browser is capable of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
    using HTML5 history.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
    @method _pjaxBindUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
    _pjaxBindUI: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
        // Only bind link if we haven't already.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
        if (!this._pjaxEvents) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
            this._pjaxEvents = Y.one('body').delegate('click',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
                this._onLinkClick, this.get('linkSelector'), this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
    // -- Protected Event Handlers ---------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
    Default handler for the `navigate` event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
    Adds a new history entry or replaces the current entry for the specified URL
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
    and will scroll the page to the top if configured to do so.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
    @method _defNavigateFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
    _defNavigateFn: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
        this[e.replace ? 'replace' : 'save'](e.url);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
        if (win && this.get('scrollToTop')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
            // Scroll to the top of the page. The timeout ensures that the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
            // scroll happens after navigation begins, so that the current
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
            // scroll position will be restored if the user clicks the back
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
            // button.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
            setTimeout(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
                win.scroll(0, 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
            }, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
    Handler for delegated link-click events which match the `linkSelector`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    This will attempt to enhance the navigation to the link element's `href` by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
    passing the URL to the `_navigate()` method. When the navigation is being
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
    enhanced, the default action is prevented.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    If the user clicks a link with the middle/right mouse buttons, or is holding
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    down the Ctrl or Command keys, this method's behavior is not applied and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
    allows the native behavior to occur. Similarly, if the router is not capable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
    or handling the URL because no route-handlers match, the link click will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
    behave natively.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
    @method _onLinkClick
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
    _onLinkClick: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
        var link, url, navigated;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
        // Allow the native behavior on middle/right-click, or when Ctrl or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
        // Command are pressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
        if (e.button !== 1 || e.ctrlKey || e.metaKey) { return; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
        link = e.currentTarget;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
        // Only allow anchor elements because we need access to its `protocol`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
        // `host`, and `href` attributes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
        if (link.get('tagName').toUpperCase() !== 'A') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
            Y.log('pjax link-click navigation requires an anchor element.', 'warn', 'PjaxBase');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
        // Same origin check to prevent trying to navigate to URLs from other
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
        // sites or things like mailto links.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
        if (!this._isLinkSameOrigin(link)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
        // All browsers fully resolve an anchor's `href` property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
        url = link.get('href');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
        // Try and navigate to the URL via the router, and prevent the default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
        // link-click action if we do.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
        if (url) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
            navigated = this._navigate(url, {originEvent: e});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
            if (navigated) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
                e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
PjaxBase.ATTRS = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
    CSS selector string used to filter link click events so that only the links
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
    which match it will have the enhanced navigation behavior of Pjax applied.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
    When a link is clicked and that link matches this selector, Pjax will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
    attempt to dispatch to any route handlers matching the link's `href` URL. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
    HTML5 history is not supported or if no route handlers match, the link click
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
    will be handled by the browser just like any old link.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
    @attribute linkSelector
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
    @type String|Function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
    @default "a.yui3-pjax"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
    @initOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
    linkSelector: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
        value    : 'a.' + CLASS_PJAX,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
        writeOnce: 'initOnly'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
    Whether navigating to a hash-fragment identifier on the current page should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
    be enhanced and cause the `navigate` event to fire.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
    By default Pjax allows the browser to perform its default action when a user
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
    is navigating within a page by clicking in-page links
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    (e.g. `<a href="#top">Top of page</a>`) and does not attempt to interfere or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
    enhance in-page navigation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
    @attribute navigateOnHash
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
    @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
    @default false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
    navigateOnHash: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
        value: false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
    Whether the page should be scrolled to the top after navigating to a URL.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
    When the user clicks the browser's back button, the previous scroll position
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
    will be maintained.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
    @attribute scrollToTop
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
    @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
    @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
    scrollToTop: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
        value: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
Y.PjaxBase = PjaxBase;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
}, '@VERSION@', {"requires": ["classnamemanager", "node-event-delegate", "router"]});