рдЖрдзреБрдирд┐рдХ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд░реВрдЯрд┐рдВрдЧ: рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ

рдПрдХ рдирдП рдПрдкреАрдЖрдИ рдХреА рдорджрдж рд╕реЗ, рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд░реВрдЯрд┐рдВрдЧ рдХреЛ рд╕реНрдЯреИрдВрдбрд░реНрдб рдмрдирд╛рдирд╛. рдпрд╣ рдПрдкреАрдЖрдИ, рдПрдХ рдкреЗрдЬ рд╡рд╛рд▓реЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ.

Browser Support

  • Chrome: 102.
  • Edge: 102.
  • Firefox: not supported.
  • Safari: not supported.

Source

рдПрдХ рдкреЗрдЬ рд╡рд╛рд▓реЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдПрд╕рдкреАрдП рдХреА рдореБрдЦреНрдп рд╕реБрд╡рд┐рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрдЯ рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдХреЙрдиреНрдЯреЗрдВрдЯ рдбрд╛рдЗрдиреИрдорд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдпрд╣ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдирдП рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реАрдХреЗ рдХреЗ рдмрдЬрд╛рдп рд╣реЛрддрд╛ рд╣реИ.

рдПрд╕рдкреАрдП, History API рдХреЗ рдЬрд╝рд░рд┐рдП рдпрд╛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреЗ #рд╣реИрд╢ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдХреЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдмреЗрд╣рдж рдЦрд░рд╛рдм рдПрдкреАрдЖрдИ рд╣реИ, рдЬрд┐рд╕реЗ рдПрд╕рдкреАрдП рдХреЗ рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдбреЗрд╡рд▓рдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛. рдЕрдм рд╡реЗрдм рдХреЛ рдПрдХ рдирдП рддрд░реАрдХреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ. рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ рдПрдХ рдРрд╕рд╛ рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдпрд╣ рдПрдкреАрдЖрдИ, History API рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕ рд╕реНрдкреЗрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░реЛрд▓ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдиреЗ History API рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕рдореЗрдВ рдкреИрдЪ рдХрд┐рдпрд╛.

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирдХрд╛рд░реА рджреА рдЧрдИ рд╣реИ. рддрдХрдиреАрдХреА рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, WICG рдХреЗ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдореЗрдВ рдбреНрд░рд╛рдлрд╝реНрдЯ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦреЗрдВ.

рдЗрд╕реНрддреЗрдорд╛рд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг

Navigation API рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд▓реЛрдмрд▓ navigation рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ "navigate" рд▓рд┐рд╕рдирд░ рдЬреЛрдбрд╝реЗрдВ. рдпрд╣ рдЗрд╡реЗрдВрдЯ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЗрдВрджреНрд░реАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ: рдпрд╣ рд╕рднреА рддрд░рд╣ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдЧрд╛. рднрд▓реЗ рд╣реА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╣реЛ (рдЬреИрд╕реЗ, рдХрд┐рд╕реА рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛, рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛ рдпрд╛ рдкреАрдЫреЗ рдФрд░ рдЖрдЧреЗ рдЬрд╛рдирд╛) рдпрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ (рдЬреИрд╕реЗ, рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЗ рдХреЛрдб рдХреЗ рдЬрд╝рд░рд┐рдП). рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЙрд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ. рдПрд╕рдкреАрдП рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕реА рдкреЗрдЬ рдкрд░ рд░рдЦрдирд╛ рдФрд░ рд╕рд╛рдЗрдЯ рдХреЗ рдХреЙрдиреНрдЯреЗрдВрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдпрд╛ рдмрджрд▓рдирд╛.

NavigateEvent рдХреЛ "navigate" рд▓рд┐рд╕рдирд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рди рдпреВрдЖрд░рдПрд▓. рд╕рд╛рде рд╣реА, рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЬрдЧрд╣ рд╕реЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ. "navigate" рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рджрд░реНрд╢рдХ рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

navigation.addEventListener('navigate', navigateEvent => {
  // Exit early if this navigation shouldn't be intercepted.
  // The properties to look at are discussed later in the article.
  if (shouldNotIntercept(navigateEvent)) return;

  const url = new URL(navigateEvent.destination.url);

  if (url.pathname === '/') {
    navigateEvent.intercept({handler: loadIndexPage});
  } else if (url.pathname === '/cats/') {
    navigateEvent.intercept({handler: loadCatsPage});
  }
});

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЗрди рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕реЗ рдореИрдиреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, intercept({ handler }) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ).
  • preventDefault() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рджреНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ.

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЗрд╡реЗрдВрдЯ рдкрд░ intercept() рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдкрдХреЗ handler рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреА рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП. рдЗрд╕рд╕реЗ рдПрдХ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ, navigation.transition рдмрдиреЗрдЧрд╛. рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.

рдЖрдо рддреМрд░ рдкрд░, intercept() рдФрд░ preventDefault(), рджреЛрдиреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрдирдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛. рдЕрдЧрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди, рдХреНрд░реЙрд╕-рдСрд░рд┐рдЬрд┐рди рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╣реИ, рддреЛ intercept() рдХреА рдорджрдж рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореИрдиреЗрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛. рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ 'рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ' рдпрд╛ 'рдЖрдЧреЗ рдЬрд╛рдПрдВ' рдмрдЯрди рджрдмрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ preventDefault() рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛. рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрдВрд╕рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП. (рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ GitHub рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ.)

рднрд▓реЗ рд╣реА, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд░реЛрдХрд╛ рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рддрдм рднреА "navigate" рдЗрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдЧрд╛. рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ рдХреЛрдб рдХрд┐рд╕реА Analytics рдЗрд╡реЗрдВрдЯ рдХреЛ рд▓реЙрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ.

рдкреНрд▓реИрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рдХреЛрдИ рджреВрд╕рд░рд╛ рдЗрд╡реЗрдВрдЯ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП?

"navigate" рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░, рдПрд╕рдкреАрдП рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдореИрдиреЗрдЬ рдХрд░рддрд╛ рд╣реИ. рдкреБрд░рд╛рдиреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ. рдЕрдЧрд░ рдЖрдкрдиреЗ рдХрднреА History API рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЕрдкрдиреЗ рдПрд╕рдкреАрдП рдХреЗ рд▓рд┐рдП рд░реВрдЯрд┐рдВрдЧ рд▓рд┐рдЦреА рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдРрд╕рд╛ рдХреЛрдб рдЬреЛрдбрд╝рд╛ рд╣реЛ:

function updatePage(event) {
  event.preventDefault(); // we're handling this link
  window.history.pushState(null, '', event.target.href);
  // TODO: set up page based on new URL
}
const links = [...document.querySelectorAll('a[href]')];
links.forEach(link => link.addEventListener('click', updatePage));

рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕рднреА рдЪреАрдЬрд╝реЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ. рдЖрдкрдХреЗ рдкреЗрдЬ рдкрд░ рд▓рд┐рдВрдХ рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдЯ рд╕рдХрддреЗ рд╣реИрдВ. рд╕рд╛рде рд╣реА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдкреЗрдЬреЛрдВ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд┐рдВрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рднреА рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗ рдХреЛрдИ рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрдореЗрдЬ рдореИрдк рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рдЖрдкрдХрд╛ рдкреЗрдЬ рдЗрдирд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдРрд╕реА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ, рдирдпрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ рдЖрдкрдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ.

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рддрд░реАрдХрд╛ рдмреИрдХ/рдлрд╝реЙрд░рд╡рд░реНрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореИрдиреЗрдЬ рдирд╣реАрдВ рдХрд░рддрд╛. рдЗрд╕рдХреЗ рд▓рд┐рдП, "popstate" рдирд╛рдо рдХрд╛ рдПрдХ рдФрд░ рдЗрд╡реЗрдВрдЯ рд╣реИ.

рдирд┐рдЬреА рддреМрд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ History API рд╕реЗ рдЗрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ рджреЛ рдХрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдмреИрдХ рдпрд╛ рдлрд╝реЙрд░рд╡рд░реНрдб рдмрдЯрди рджрдмрд╛рдиреЗ рдкрд░ рдЬрд╡рд╛рдм рджреЗрдирд╛. рд╕рд╛рде рд╣реА, рдпреВрдЖрд░рдПрд▓ рдХреЛ рдкреБрд╢ рдФрд░ рдмрджрд▓рдирд╛. рдЗрд╕рдХреА рддреБрд▓рдирд╛ "navigate" рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдкрдиреЗ рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рд╕рдирд░ рд╕реЗрдЯ рдЕрдк рдХрд┐рдП рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рддреБрд▓рдирд╛ "navigate" рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ.

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рддрдп рдХрд░рдирд╛

navigateEvent рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлрд╝реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ. рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдХрд┐рд╕реА рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдореБрдЦреНрдп рдкреНрд░реЙрдкрд░реНрдЯреА рдпреЗ рд╣реИрдВ:

canIntercept
рдЕрдЧрд░ рдпрд╣ рдЧрд▓рдд рд╣реИ, рддреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛. рдХреНрд░реЙрд╕-рдСрд░рд┐рдЬрд┐рди рдиреЗрд╡рд┐рдЧреЗрд╢рди рдФрд░ рдХреНрд░реЙрд╕-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЯреНрд░реИрд╡рд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛.
destination.url
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореИрдиреЗрдЬ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рд╕рдмрд╕реЗ рдЕрд╣рдо рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ.
hashChange
рдЕрдЧрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдХ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╣реИ рдФрд░ рдпреВрдЖрд░рдПрд▓ рдХрд╛ рд╕рд┐рд░реНрдлрд╝ рд╣реИрд╢ рд╣рд┐рд╕реНрд╕рд╛ рдореМрдЬреВрджрд╛ рдпреВрдЖрд░рдПрд▓ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдпрд╣ рд╡реИрд▓реНрдпреВ 'рд╕рд╣реА' рд╣реЛрдЧреА. рдЖрдзреБрдирд┐рдХ рдПрд╕рдкреАрдП рдореЗрдВ, рд╣реИрд╢ рдХреЛ рдореМрдЬреВрджрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП. рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ hashChange рд╕рд╣реА рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рди рдкрдбрд╝реЗ.
downloadRequest
рдЕрдЧрд░ рдпрд╣ рд╕рд╣реА рд╣реИ, рддреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд download рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╡рд╛рд▓реЗ рд▓рд┐рдВрдХ рд╕реЗ рд╣реБрдИ рдереА. рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА.
formData
рдЕрдЧрд░ рдпрд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди, POST рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ. рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореИрдиреЗрдЬ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ. рдЕрдЧрд░ рдЖрдкрдХреЛ рд╕рд┐рд░реНрдлрд╝ GET рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореИрдиреЗрдЬ рдХрд░рдиреЗ рд╣реИрдВ, рддреЛ рдРрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ рдЬрд╣рд╛рдВ formData рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ. рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЖрдЧреЗ, рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рд╢рди рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ.
navigationType
рдпрд╣ "reload", "push", "replace" рдпрд╛ "traverse" рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рд╣реИ. рдЕрдЧрд░ рдпрд╣ "traverse" рд╣реИ, рддреЛ preventDefault() рдХреА рдорджрдж рд╕реЗ рдЗрд╕ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛.

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ shouldNotIntercept рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

function shouldNotIntercept(navigationEvent) {
  return (
    !navigationEvent.canIntercept ||
    // If this is just a hashChange,
    // just let the browser handle scrolling to the content.
    navigationEvent.hashChange ||
    // If this is a download,
    // let the browser perform the download.
    navigationEvent.downloadRequest ||
    // If this is a form submission,
    // let that go to the server.
    navigationEvent.formData
  );
}

рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛

рдЬрдм рдЖрдкрдХрд╛ рдХреЛрдб рдЕрдкрдиреЗ "navigate" рд▓рд┐рд╕рдирд░ рдореЗрдВ рд╕реЗ intercept({ handler }) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЕрдм рдкреЗрдЬ рдХреЛ рдирдИ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ. рд╕рд╛рде рд╣реА, рдпрд╣ рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ.

рдмреНрд░рд╛рдЙрдЬрд╝рд░, рдореМрдЬреВрджрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реЛрд▓ рдХреА рдкреЛрдЬрд╝рд┐рд╢рди рдХреИрдкреНрдЪрд░ рдХрд░рдХреЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдЖрдкрдХреЗ handler рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ. рдЕрдЧрд░ рдЖрдкрдХрд╛ handler рдХреЛрдИ рдкреНрд░реЙрдорд┐рд╕ рджрд┐рдЦрд╛рддрд╛ рд╣реИ (рдЬреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ-рдЖрдк рд╣реЛрддрд╛ рд╣реИ), рддреЛ рд╡рд╣ рдкреНрд░реЙрдорд┐рд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ рдФрд░ рд╡рд╣ рдкреВрд░рд╛ рд╣реБрдЖ рдпрд╛ рдирд╣реАрдВ.

navigation.addEventListener('navigate', navigateEvent => {
  if (shouldNotIntercept(navigateEvent)) return;
  const url = new URL(navigateEvent.destination.url);

  if (url.pathname.startsWith('/articles/')) {
    navigateEvent.intercept({
      async handler() {
        const articleContent = await getArticleContent(url.pathname);
        renderArticlePage(articleContent);
      },
    });
  }
});

рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрдкреАрдЖрдИ рдПрдХ рдРрд╕рд╛ рд╕реЗрдореИрдирдЯрд┐рдХ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдордЭрддрд╛ рд╣реИ: рдлрд╝рд┐рд▓рд╣рд╛рд▓, рдПрд╕рдкреАрдП рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкрд┐рдЫрд▓реЗ рдпреВрдЖрд░рдПрд▓ рдФрд░ рд╕реНрдЯреЗрдЯрд╕ рд╕реЗ рдирдП рдореЗрдВ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдХрдИ рдлрд╝рд╛рдпрджреЗ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ. рдЬреИрд╕реЗ, рд╕реБрд▓рднрддрд╛: рдмреНрд░рд╛рдЙрдЬрд╝рд░, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд, рдЖрдЦрд┐рд░ рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрдбрд╝рдмрдбрд╝реА рдХреЛ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Chrome рдЕрдкрдиреЗ рдиреЗрдЯрд┐рд╡ рд▓реЛрдбрд┐рдВрдЧ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ 'рд░реЛрдХреЗрдВ' рдмрдЯрди рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ. (рдлрд╝рд┐рд▓рд╣рд╛рд▓, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреАрдЫреЗ/рдЖрдЧреЗ рдмрдЯрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЬрд▓реНрдж рд╣реА рдареАрдХ рдХрд░ рджреА рдЬрд╛рдПрдЧреА.)

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рддреЗ рд╕рдордп, рдирдпрд╛ рдпреВрдЖрд░рдПрд▓ рдЖрдкрдХреЗ handler рдХреЙрд▓рдмреИрдХ рдХреЗ рдХреЙрд▓ рд╣реЛрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдПрдЧрд╛. рдЕрдЧрд░ рдбреАрдУрдПрдо рдХреЛ рддреБрд░рдВрдд рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдРрд╕реА рдЕрд╡рдзрд┐ рдмрди рдЬрд╛рддреА рд╣реИ рдЬрдм рдирдП рдпреВрдЖрд░рдПрд▓ рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдирд╛ рдХреЙрдиреНрдЯреЗрдВрдЯ рднреА рджрд┐рдЦрддрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдлрд╝реЗрдЪ рдХрд░рдиреЗ рдпрд╛ рдирдП рд╕рдм-рд░рд┐рд╕реЙрд░реНрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рд░рд┐рд▓реЗрдЯрд┐рд╡ рдпреВрдЖрд░рдПрд▓ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдкрд░ рдЕрд╕рд░ рдкрдбрд╝рддрд╛ рд╣реИ.

рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ GitHub рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдо рддреМрд░ рдкрд░ рд╣рдорд╛рд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреЙрдиреНрдЯреЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдкреЗрдЬ рдХреЛ рддреБрд░рдВрдд рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

navigation.addEventListener('navigate', navigateEvent => {
  if (shouldNotIntercept(navigateEvent)) return;
  const url = new URL(navigateEvent.destination.url);

  if (url.pathname.startsWith('/articles/')) {
    navigateEvent.intercept({
      async handler() {
        // The URL has already changed, so quickly show a placeholder.
        renderArticlePagePlaceholder();
        // Then fetch the real data.
        const articleContent = await getArticleContent(url.pathname);
        renderArticlePage(articleContent);
      },
    });
  }
});

рдЗрд╕рд╕реЗ, рдпреВрдЖрд░рдПрд▓ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рд╕рд╛рде рд╣реА, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рд╡рдЬрд╣ рд╕реЗ, рддреЗрдЬрд╝реА рд╕реЗ рд▓реЛрдб рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рднреА рд▓рдЧрддрд╛ рд╣реИ.

рд╕рд┐рдЧреНрдирд▓ рд░реЛрдХрдирд╛

intercept() рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдПрдХ рд╕рд╛рде рдХрдИ рдХрд╛рдо рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ. рдЗрд╕рд▓рд┐рдП, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рдЬрд╝рд░реВрд░рдд рди рдкрдбрд╝реЗ. рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ, рдЬрдм:

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рдХреЛрдб рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреБрд░рд╛рдиреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдирдП рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ 'рд░реЛрдХреЗрдВ' рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ.

рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, "navigate" рд▓рд┐рд╕реНрдирд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдЗрд╡реЗрдВрдЯ рдореЗрдВ рдПрдХ signal рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХ AbortSignal рд╣реЛрддреА рд╣реИ. рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдлрд╝реЗрдЪ рдХреЛ рдмреАрдЪ рдореЗрдВ рд░реЛрдХрдирд╛ рд▓реЗрдЦ рдкрдврд╝реЗрдВ.

рдХрдо рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЛ рд░реЛрдХрдиреЗ рдкрд░ рдЗрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ. рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ fetch() рдкрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдХреЙрд▓ рдореЗрдВ AbortSignal рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕рд╕реЗ, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрди-рдлрд╝реНрд▓рд╛рдЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рд░рджреНрдж рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ. рдЗрд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдмреИрдВрдбрд╡рд┐рдбреНрде рдмрдЪреЗрдЧрд╛ рдФрд░ fetch() рд╕реЗ рдорд┐рд▓рд╛ Promise рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛. рд╕рд╛рде рд╣реА, рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ, DOM рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдЬреИрд╕реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рд╕реЗ рд░реЛрдХреЗрдЧрд╛, рддрд╛рдХрд┐ рдЕрдм рдЕрдорд╛рдиреНрдп рдкреЗрдЬ рдиреЗрд╡рд┐рдЧреЗрд╢рди рди рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ.

рдпрд╣рд╛рдВ рдкрд┐рдЫрд▓рд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ getArticleContent рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ AbortSignal рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ fetch() рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

navigation.addEventListener('navigate', navigateEvent => {
  if (shouldNotIntercept(navigateEvent)) return;
  const url = new URL(navigateEvent.destination.url);

  if (url.pathname.startsWith('/articles/')) {
    navigateEvent.intercept({
      async handler() {
        // The URL has already changed, so quickly show a placeholder.
        renderArticlePagePlaceholder();
        // Then fetch the real data.
        const articleContentURL = new URL(
          '/get-article-content',
          location.href
        );
        articleContentURL.searchParams.set('path', url.pathname);
        const response = await fetch(articleContentURL, {
          signal: navigateEvent.signal,
        });
        const articleContent = await response.json();
        renderArticlePage(articleContent);
      },
    });
  }
});

рд╕реНрдХреНрд░реЛрд▓ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛

рдХрд┐рд╕реА рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ intercept() рдХрд░рдиреЗ рдкрд░, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдкрдиреЗ-рдЖрдк рд╕реНрдХреНрд░реЛрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛.

рдЕрдЧрд░ navigationEvent.navigationType "push" рдпрд╛ "replace" рд╣реИ, рддреЛ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдХрд┐рд╕реА рдирдИ рдПрдВрдЯреНрд░реА рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреВрдЖрд░рдПрд▓ рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ (# рдХреЗ рдмрд╛рдж рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛) рд╕реЗ рджрд┐рдЦрд╛рдП рдЧрдП рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рд╕реНрдХреНрд░реЛрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреНрд░реЛрд▓ рдХреЛ рдкреЗрдЬ рдХреЗ рд╕рдмрд╕реЗ рдКрдкрд░ рдкрд░ рд░реАрд╕реЗрдЯ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЯреНрд░реИрд╡рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реЛрд▓ рдХреА рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдирд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдЗрддрд┐рд╣рд╛рд╕ рдПрдВрдЯреНрд░реА рдкрд┐рдЫрд▓реА рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рдЧрдИ рдереА.

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдЖрдкрдХреЗ handler рд╕реЗ рдорд┐рд▓рд╛ рдкреНрд░реЙрдорд┐рд╕ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реНрдХреНрд░реЛрд▓ рдХрд░рдирд╛ рд╣реИ, рддреЛ navigateEvent.scroll() рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

navigation.addEventListener('navigate', navigateEvent => {
  if (shouldNotIntercept(navigateEvent)) return;
  const url = new URL(navigateEvent.destination.url);

  if (url.pathname.startsWith('/articles/')) {
    navigateEvent.intercept({
      async handler() {
        const articleContent = await getArticleContent(url.pathname);
        renderArticlePage(articleContent);
        navigateEvent.scroll();

        const secondaryContent = await getSecondaryContent(url.pathname);
        addSecondaryContent(secondaryContent);
      },
    });
  }
});

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, intercept() рдХреЗ scroll рд╡рд┐рдХрд▓реНрдк рдХреЛ "manual" рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ, рдСрдЯреЛ рд╕реНрдХреНрд░реЛрд▓ рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдСрдкреНрдЯ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

navigateEvent.intercept({
  scroll: 'manual',
  async handler() {
    // тАж
  },
});

рдлрд╝реЛрдХрд╕ рдореИрдиреЗрдЬ рдХрд░рдирд╛

рдЖрдкрдХреЗ handler рд╕реЗ рдорд┐рд▓рд╛ рдкреНрд░реЙрдорд┐рд╕ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдмреНрд░рд╛рдЙрдЬрд╝рд░ autofocus рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реЗрдЯ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдПрд▓рд┐рдореЗрдВрдЯ рдкрд░ рдлрд╝реЛрдХрд╕ рдХрд░реЗрдЧрд╛. рдЕрдЧрд░ рдХрд┐рд╕реА рднреА рдПрд▓рд┐рдореЗрдВрдЯ рдореЗрдВ рд╡рд╣ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ <body> рдПрд▓рд┐рдореЗрдВрдЯ рдкрд░ рдлрд╝реЛрдХрд╕ рдХрд░реЗрдЧрд╛.

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдСрдкреНрдЯ рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, intercept() рдХреЗ focusReset рд╡рд┐рдХрд▓реНрдк рдХреЛ "manual" рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:

navigateEvent.intercept({
  focusReset: 'manual',
  async handler() {
    // тАж
  },
});

рдЗрд╡реЗрдВрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдФрд░ рдкреВрд░рд╛ рди рд╣реЛрдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА

рдЬрдм рдЖрдкрдХреЗ intercept() рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдЪреАрдЬрд╝ рд╣реЛрдЧреА:

  • рдЕрдЧрд░ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ Promise рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдЖрдкрдиреЗ intercept() рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ), рддреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ, Event рдХреЗ рд╕рд╛рде "navigatesuccess" рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛.
  • рдЕрдЧрд░ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ Promise рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдкреАрдЖрдИ ErrorEvent рдХреЗ рд╕рд╛рде "navigateerror" рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛.

рдЗрди рдЗрд╡реЗрдВрдЯ рдХреА рдорджрдж рд╕реЗ, рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдПрдХ рд╣реА рдЬрдЧрд╣ рд╕реЗ рд╕рдлрд▓рддрд╛ рдпрд╛ рдЕрд╕рдлрд▓рддрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЛ рдЫрд┐рдкрд╛рдХрд░, рд╕рдлрд▓рддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЬреИрд╕реЗ:

navigation.addEventListener('navigatesuccess', event => {
  loadingIndicator.hidden = true;
});

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрдбрд╝рдмрдбрд╝реА рд╣реЛрдиреЗ рдкрд░ рдЧрдбрд╝рдмрдбрд╝реА рдХрд╛ рдореИрд╕реЗрдЬ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

navigation.addEventListener('navigateerror', event => {
  loadingIndicator.hidden = true; // also hide indicator
  showMessage(`Failed to load page: ${event.message}`);
});

"navigateerror" рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░, рдЬрд┐рд╕реЗ ErrorEvent рдорд┐рд▓рддрд╛ рд╣реИ, рдЦрд╛рд╕ рддреМрд░ рдкрд░ рдХрд╛рдо рдХрд╛ рд╣реЛрддрд╛ рд╣реИ. рдЗрд╕рдХреА рд╡рдЬрд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдЙрд╕ рдХреЛрдб рд╕реЗ рдХреЛрдИ рднреА рдЧрдбрд╝рдмрдбрд╝реА рдЬрд╝рд░реВрд░ рдкрд╛рдПрдЧрд╛ рдЬреЛ рдирдпрд╛ рдкреЗрдЬ рд╕реЗрдЯ рдЕрдк рдХрд░ рд░рд╣рд╛ рд╣реИ. await fetch() рдпрд╣ рдЬрд╛рдирдХрд░ рдХрд┐ рдЕрдЧрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдЧрдбрд╝рдмрдбрд╝реА рдХреЛ "navigateerror" рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛.

navigation.currentEntry, рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА рдХрд╛ рдРрдХреНрд╕реЗрд╕ рджреЗрддрд╛ рд╣реИ. рдпрд╣ рдПрдХ рдРрд╕рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рд┐рд▓рд╣рд╛рд▓ рдХрд╣рд╛рдВ рд╣реИ. рдЗрд╕ рдПрдВрдЯреНрд░реА рдореЗрдВ рдореМрдЬреВрджрд╛ рдпреВрдЖрд░рдПрд▓, рдореЗрдЯрд╛рдбреЗрдЯрд╛, рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреА рджреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ. рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓, рд╕рдордп рдХреЗ рд╕рд╛рде рдЗрд╕ рдПрдВрдЯреНрд░реА рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ key рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╣рд░ рдПрдВрдЯреНрд░реА рдХреА рдпреВрдиреАрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реЛрддреА рд╣реИ. рдпрд╣ рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА рдФрд░ рдЙрд╕рдХреЗ рд╕реНрд▓реЙрдЯ рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИ. рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА рдХрд╛ рдпреВрдЖрд░рдПрд▓ рдпрд╛ рд╕реНрдЯреЗрдЯрд╕ рдмрджрд▓рдиреЗ рдкрд░ рднреА, рдпрд╣ рдХреБрдВрдЬреА рдПрдХ рдЬреИрд╕реА рд░рд╣рддреА рд╣реИ. рдпрд╣ рдЕрдм рднреА рдЙрд╕реА рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╣реИ. рдЗрд╕рдХреЗ рдЙрд▓рдЯ, рдЕрдЧрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 'рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ' рдмрдЯрди рджрдмрд╛рдХрд░, рдЙрд╕реА рдкреЗрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ key рдмрджрд▓ рдЬрд╛рдПрдЧрд╛. рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдирдИ рдПрдВрдЯреНрд░реА рд╕реЗ рдирдпрд╛ рд╕реНрд▓реЙрдЯ рдмрдиреЗрдЧрд╛.

рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП, key рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдлрд╝реА рдХрд╛рдо рдХрд╛ рд╣реИ. рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реАрдзреЗ рдореИрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреБрдВрдЬреА рд╡рд╛рд▓реА рдПрдВрдЯреНрд░реА рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдкреЗрдЬреЛрдВ рдХреЗ рдмреАрдЪ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдПрдВрдЯреНрд░реА рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рднреА рдЗрд╕реЗ рд╣реЛрд▓реНрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

// On JS startup, get the key of the first loaded page
// so the user can always go back there.
const {key} = navigation.currentEntry;
backToHomeButton.onclick = () => navigation.traverseTo(key);

// Navigate away, but the button will always work.
await navigation.navigate('/another_url').finished;

рд╕реНрдерд┐рддрд┐

Navigation API, "рд╕реНрдЯреЗрдЯрд╕" рдХреА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛рддрд╛ рд╣реИ. рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреА рджреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕реЗрд╡ рд░рд╣рддреА рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдирд╣реАрдВ рджрд┐рдЦрддреА. рдпрд╣ History API рдореЗрдВ рдореМрдЬреВрдж history.state рд╕реЗ рдХрд╛рдлрд╝реА рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕реБрдзрд╛рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ.

Navigation API рдореЗрдВ, рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА (рдпрд╛ рдХрд┐рд╕реА рднреА рдПрдВрдЯреНрд░реА) рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдХреЙрдкреА рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, .getState() рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

console.log(navigation.currentEntry.getState());

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ undefined рд╣реЛрдЧрд╛.

рд╕реЗрдЯрд┐рдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐

рд╕реНрдЯреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрджрд▓рд╛рд╡ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдПрдВрдЯреНрд░реА рдХреЗ рд╕рд╛рде рд╕реЗрд╡ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ. рдЗрд╕рд▓рд┐рдП:

const state = navigation.currentEntry.getState();
console.log(state.count); // 1
state.count++;
console.log(state.count); // 2
// But:
console.info(navigation.currentEntry.getState().count); // will still be 1

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рд╕реНрдЯреЗрдЯрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛:

navigation.navigate(url, {state: newState});
// Or:
navigation.reload({state: newState});

рдпрд╣рд╛рдВ newState, рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ.

рдЕрдЧрд░ рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА рдХреА рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ рдХрд░рдиреА рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА рдХреА рдЬрдЧрд╣ рд▓реЗ рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

navigation.navigate(location.href, {state: newState, history: 'replace'});

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХрд╛ "navigate" рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░, navigateEvent.destination рдХреА рдорджрдж рд╕реЗ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рдкрд┐рдХ рдЕрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

navigation.addEventListener('navigate', navigateEvent => {
  console.log(navigateEvent.destination.getState());
});

рд╕рд┐рдВрдХ рдХрд░рдХреЗ рд╕реНрдЯреЗрдЯрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛

рдЖрдо рддреМрд░ рдкрд░, navigation.reload({state: newState}) рдХреЗ рдЬрд╝рд░рд┐рдП рд╕реНрдЯреЗрдЯрд╕ рдХреЛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХрд╛ "navigate" рд▓рд┐рд╕рдирд░ рдЙрд╕ рд╕реНрдЯреЗрдЯрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрднреА-рдХрднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдкрдХрд╛ рдХреЛрдб рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рддрдм рддрдХ рд╕реНрдЯреЗрдЯрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реЛ рдЪреБрдХрд╛ рд╣реЛрддрд╛ рд╣реИ. рдЬреИрд╕реЗ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА <details> рдПрд▓рд┐рдореЗрдВрдЯ рдХреЛ рдЯреЙрдЧрд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдлрд╝реЙрд░реНрдо рдЗрдирдкреБрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реИ. рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрдЯреЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд░реАрд▓реЛрдб рдФрд░ рдЯреНрд░реИрд╡рд░реНрд╕ рдХреЗ рджреМрд░рд╛рди рдпреЗ рдмрджрд▓рд╛рд╡ рдмрд░рдХрд░рд╛рд░ рд░рд╣реЗрдВ. updateCurrentEntry() рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

navigation.updateCurrentEntry({state: newState});

рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╡реЗрдВрдЯ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ:

navigation.addEventListener('currententrychange', () => {
  console.log(navigation.currentEntry.getState());
});

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдкрдХреЛ "currententrychange" рдореЗрдВ рд╕реНрдЯреЗрдЯрд╕ рдореЗрдВ рд╣реБрдП рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреА рдкрдбрд╝ рд░рд╣реА рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ "navigate" рдЗрд╡реЗрдВрдЯ рдФрд░ "currententrychange" рдЗрд╡реЗрдВрдЯ рдХреЗ рдмреАрдЪ, рд╕реНрдЯреЗрдЯрд╕ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдмрд╛рдВрдЯрд╛ рд╣реЛ рдпрд╛ рдЙрд╕рдХреА рдбреБрдкреНрд▓реАрдХреЗрдЯ рдХреЙрдкреА рдмрдирд╛рдИ рд╣реЛ. рд╡рд╣реАрдВ, navigation.reload({state: newState}) рдХреА рдорджрдж рд╕реЗ, рдЗрд╕реЗ рдПрдХ рд╣реА рдЬрдЧрд╣ рдкрд░ рдореИрдиреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рд╕реНрдЯреЗрдЯрд╕ рдмрдирд╛рдо рдпреВрдЖрд░рдПрд▓ рдкреИрд░рд╛рдореАрдЯрд░

рд╕реНрдЯреЗрдЯ рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рднреА рд╕реНрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ.

рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдпреВрдЖрд░рдПрд▓ рд╢реЗрдпрд░ рдХрд░рдиреЗ рдкрд░, рд╕реНрдЯреЗрдЯрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЙрд╕реЗ рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ. рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрдЯреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ.

рд╕рднреА рдПрдВрдЯреНрд░реА рдРрдХреНрд╕реЗрд╕ рдХрд░рдирд╛

рд╣рд╛рд▓рд╛рдВрдХрд┐, "рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА" рдореЗрдВ рдФрд░ рднреА рдЪреАрдЬрд╝реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИрдВ. рдПрдкреАрдЖрдИ, navigation.entries() рдХреЙрд▓ рдХреЗ рдЬрд╝рд░рд┐рдП рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЬрд┐рди рдПрдВрдЯреНрд░реА рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЙрдирдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдРрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рднреА рддрд░реАрдХрд╛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ. рдпрд╣ рдХреЙрд▓, рдПрдВрдЯреНрд░реА рдХрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд▓реЗрдХреНрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ. рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд┐рд╕реА рдкреЗрдЬ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдкрд┐рдЫрд▓реЗ рдпреВрдЖрд░рдПрд▓ рдпрд╛ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдореМрдЬреВрджрд╛ History API рдХреА рдорджрдж рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛.

рдЕрд▓рдЧ-рдЕрд▓рдЧ NavigationHistoryEntry рдкрд░ "dispose" рдЗрд╡реЗрдВрдЯ рдХреЛ рднреА рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдпрд╣ рдЗрд╡реЗрдВрдЯ рддрдм рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдПрдВрдЯреНрд░реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд░рд╣рддреА. рдРрд╕рд╛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдбреЗрдЯрд╛ рдорд┐рдЯрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рднреА рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдкрдиреЗ 10 рдЬрдЧрд╣реЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдЧреЗ рдХреА рдУрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛, рддреЛ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдЙрди 10 рдПрдВрдЯреНрд░реА рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.

рдЙрджрд╛рд╣рд░рдг

рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рд╕рднреА рддрд░рд╣ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП, "navigate" рдЗрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ. (рдЕрд╕рд▓ рдореЗрдВ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд╕реНрдкреЗрд╕рд┐рдлрд╝рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛ рдЕрдзреНрдпрд╛рдВрд╢ рд╣реЛрддрд╛ рд╣реИ.)

рдХрдИ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рддрдм рд╣реЛрдЧрд╛, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ <a href="..."> рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдЧрд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛ рдРрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЯрд╛рдЗрдк рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ. рдпреЗ рдЯрд╛рдЗрдк рдЬрд╝реНрдпрд╛рджрд╛ рдЬрдЯрд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ.

рдкреНрд░реЛрдЧреНрд░рд╛рдореИрдЯрд┐рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди

рдкрд╣рд▓рд╛ рд╣реИ рдкреНрд░реЛрдЧреНрд░рд╛рдореИрдЯрд┐рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди, рдЬрд╣рд╛рдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЖрдкрдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рдХрд┐рд╕реА рддрд░реАрдХреЗ рдХреЗ рдХреЙрд▓ рдХреА рд╡рдЬрд╣ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ.

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА navigation.navigate('/another_page') рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕реЗ "navigate" рд▓рд┐рд╕рдирд░ рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдП рдЧрдП рд╕реЗрдВрдЯреНрд░рд▓рд╛рдЗрдЬрд╝реНрдб рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░ рд╕реЗ рдореИрдиреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛. рд╕рд╛рде рд╣реА, рдЖрдкрдХреЗ рд╕реЗрдВрдЯреНрд░рд▓рд╛рдЗрдЬрд╝реНрдб рд▓рд┐рд╕рдирд░ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.

рдЗрд╕рдХрд╛ рдордХрд╕рдж, location.assign() рдФрд░ рджреЛрд╕реНрддреЛрдВ рдЬреИрд╕реЗ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде, History API рдХреЗ рддрд░реАрдХреЛрдВ pushState() рдФрд░ replaceState() рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдПрдЧреНрд░реАрдЧреЗрдЯ рдХрд░рдирд╛ рд╣реИ.

navigation.navigate() рддрд░реАрдХрд╛, рдПрдХ рдРрд╕рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ { committed, finished } рдореЗрдВ рджреЛ Promise рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╣реЛрддреЗ рд╣реИрдВ. рдЗрд╕рд╕реЗ, рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди рдХреЗ "рдХрд┐рдП рдЬрд╛рдиреЗ" (рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдпреВрдЖрд░рдПрд▓ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирдпрд╛ NavigationHistoryEntry рдЙрдкрд▓рдмреНрдз рд╣реИ) рдпрд╛ "рдкреВрд░реЗ рд╣реЛрдиреЗ" (intercept({ handler }) рд╕реЗ рдорд┐рд▓реЗ рд╕рднреА рдкреНрд░реЙрдорд┐рд╕ рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рд╡рдЬрд╣ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ) рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

navigate рддрд░реАрдХреЗ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпреЗ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • state: рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдирдИ рдПрдВрдЯреНрд░реА рдХреА рд╕реНрдерд┐рддрд┐, рдЬреЛ NavigationHistoryEntry рдкрд░ .getState() рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ.
  • history: рдЗрд╕реЗ "replace" рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ, рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдореМрдЬреВрджрд╛ рдПрдВрдЯреНрд░реА рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.
  • info: navigateEvent.info рдХреЗ рдЬрд╝рд░рд┐рдП рдиреЗрд╡рд┐рдЧреЗрдЯ рдЗрд╡реЗрдВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ.

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, info рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рд╕реА рдЦрд╛рд╕ рдРрдирд┐рдореЗрд╢рди рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдЧрд▓рд╛ рдкреЗрдЬ рджрд┐рдЦрддрд╛ рд╣реИ. (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреНрд▓реЛрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ #hash рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рддреМрд░ рдкрд░ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдереЛрдбрд╝реЗ рдЕрдЬреАрдм рд╣реИрдВ.) рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рдж рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ info рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 'рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ' рдФрд░ 'рдЖрдЧреЗ рдЬрд╛рдПрдВ' рдмрдЯрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ. рдЕрд╕рд▓ рдореЗрдВ, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╣рдореЗрд╢рд╛ undefined рд╣реЛрдЧрд╛.

рдмрд╛рдПрдВ рдпрд╛ рджрд╛рдПрдВ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХрд╛ рдбреЗрдореЛ

navigation рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВ. рдпреЗ рд╕рднреА рддрд░реАрдХреЗ, { committed, finished } рд╡рд╛рд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ. рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА traverseTo() рдФрд░ navigate() рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рд╣реИ. traverseTo() рдореЗрдВ key рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдХрд┐рд╕реА рдЦрд╛рд╕ рдПрдВрдЯреНрд░реА рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ back(), forward(), рдФрд░ reload() рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ. рдЗрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ, navigate() рдХреА рддрд░рд╣ рд╣реА, рдПрдХ рд╣реА рдЬрдЧрд╣ рдкрд░ рдореМрдЬреВрдж "navigate" рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░ рдореИрдиреЗрдЬ рдХрд░рддрд╛ рд╣реИ.

рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рд╢рди

рджреВрд╕рд░реА рдмрд╛рдд, POST рдХреЗ рдЬрд╝рд░рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓ <form> рд╕рдмрдорд┐рд╢рди рдПрдХ рдЦрд╛рд╕ рддрд░рд╣ рдХрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╣реИ рдФрд░ Navigation API рдЗрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЗрд▓реЛрдб рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЕрдм рднреА "navigate" рд▓рд┐рд╕рдирд░ рд╕реЗ рдореИрдиреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.

NavigateEvent рдкрд░ formData рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рджреЗрдЦрдХрд░, рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рд╢рди рдХреЛ fetch() рдХреА рдорджрдж рд╕реЗ, рдореМрдЬреВрджрд╛ рдкреЗрдЬ рдкрд░ рд╣реА рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реЙрд░реНрдо рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

navigation.addEventListener('navigate', navigateEvent => {
  if (navigateEvent.formData && navigateEvent.canIntercept) {
    // User submitted a POST form to a same-domain URL
    // (If canIntercept is false, the event is just informative:
    // you can't intercept this request, although you could
    // likely still call .preventDefault() to stop it completely).

    navigateEvent.intercept({
      // Since we don't update the DOM in this navigation,
      // don't allow focus or scrolling to reset:
      focusReset: 'manual',
      scroll: 'manual',
      handler() {
        await fetch(navigateEvent.destination.url, {
          method: 'POST',
          body: navigateEvent.formData,
        });
        // You could navigate again with {history: 'replace'} to change the URL here,
        // which might indicate "done"
      },
    });
  }
});

рдХреНтАНрдпрд╛ рдЕрдиреБрдкрд▓рдмреНтАНрдз рд╣реИ?

"navigate" рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░ рдХреЛ рдПрдХ рд╣реА рдЬрдЧрд╣ рд╕реЗ рдХрдВрдЯреНрд░реЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореМрдЬреВрджрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ рд╕реНрдкреЗрд╕рд┐рдлрд╝рд┐рдХреЗрд╢рди, рдкреЗрдЬ рдХреЗ рдкрд╣рд▓реА рдмрд╛рд░ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ "navigate" рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛. рдЬрд┐рди рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрдЯреЗрдЯрд╕ рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ (рдПрд╕рдПрд╕рдЖрд░) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИтАФрдЖрдкрдХрд╛ рд╕рд░реНрд╡рд░ рд╕рд╣реА рд╢реБрд░реБрдЖрддреА рд╕реНрдЯреЗрдЯрд╕ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ. рдпрд╣ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдЯреЗрдВрдЯ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреЛ рд╕рд╛рдЗрдЯреЗрдВ рдЕрдкрдиреЗ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреА рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдкреЗрдЬ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ.

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдПрдХ рдФрд░ рдЦрд╛рд╕ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдлрд╝ рдПрдХ рдлрд╝реНрд░реЗрдо рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ. рдЬреИрд╕реЗ, рдЯреЙрдк-рд▓реЗрд╡рд▓ рдкреЗрдЬ рдпрд╛ рдХреЛрдИ рдЦрд╛рд╕ <iframe>. рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╕рд░ рд╣реЛрдВрдЧреЗ. рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкреЗрд╕рд┐рдлрд╝рд┐рдХреЗрд╢рди рдореЗрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирдХрд╛рд░реА рджреА рдЧрдИ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЕрд╕рд░ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрдо рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрдЧреА. рдкрд┐рдЫрд▓реЗ History API рдореЗрдВ, рдлрд╝реНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдЬреИрд╕реЗ рдХрдИ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рднреНрд░рдо рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирдП Navigation API рдореЗрдВ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЛ рд╢реБрд░реВ рд╕реЗ рд╣реА рд╣реИрдВрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.

рдЖрдЦрд┐рд░ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЙрди рдПрдВрдЯреНрд░реА рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рддрдХ рдХреЛрдИ рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рдмрдиреА рд╣реИ рдЬрд┐рди рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ. рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдлрд╝рд┐рд▓рд╣рд╛рд▓ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рд░реНрдлрд╝ рдкреБрд░рд╛рдиреА рдПрдВрдЯреНрд░реА рдпрд╛ "рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдореЗрдВ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдПрдВрдЯреНрд░реА" рдХреЛ рдорд┐рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдП. рдмрд╛рдж рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдк рд╕реЗ, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдЯрд╕ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреЗ рддреМрд░ рдкрд░, рдореЗрд░реЗ рдкрд╛рд╕ рдпреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ:

  • рдирдП рдпреВрдЖрд░рдПрд▓ рдпрд╛ рд╕реНрдЯреЗрдЯрд╕ рдкрд░ рдЬрд╛рдХрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдпрд╛ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
  • рдЯрд╛рд╕реНрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдПрдВрдЯреНрд░реА рд╣рдЯрд╛рдирд╛

рдпрд╣ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдпрд╛ рдЗрдВрдЯрд░рд╕реНрдЯреАрд╢рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдирдпрд╛ рдпреВрдЖрд░рдПрд▓ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдмреИрдХ рдЬреЗрд╕реНрдЪрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╣ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧрд▓рддреА рд╕реЗ рдлрд╝реЙрд░рд╡рд░реНрдб рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдЯреНрд░реА рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ. рдореМрдЬреВрджрд╛ History API рдХреА рдорджрдж рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛.

Navigation API рдЖрдЬрд╝рдорд╛рдПрдВ

Navigation API, Chrome 102 рдореЗрдВ рдмрд┐рдирд╛ рдлрд╝реНрд▓реИрдЧ рдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИ. рдбреЛрдореЗрдирд┐рдХ рдбреЗрдирд┐рдХреЛрд▓рд╛ рдХрд╛ рдбреЗрдореЛ рднреА рдЖрдЬрд╝рдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдХреНрд▓рд╛рд╕рд┐рдХ History API рдЖрд╕рд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛. рд╕рд╛рде рд╣реА, рдЗрд╕рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ. рдЗрдирдореЗрдВ, рдЦрд╛рд╕ рдорд╛рдорд▓реЛрдВ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ. рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдирдП Navigation API рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡, рд╢рд┐рдХрд╛рдпрдд рдпрд╛ рд░рд╛рдп рджреЗрдВрдЧреЗ.

рд░реЗрдлрд╝рд░рдВрд╕

Acknowledgements

рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдереЙрдорд╕ рд╕реНрдЯрд╛рдЗрдирд░, рдбреЛрдореЗрдирд┐рдХ рдбреЗрдирд┐рдХреЛрд▓рд╛, рдФрд░ рдиреЗрдЯ рдЪреИрдкрд┐рди рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж.