За последние 24 часа нас посетили 17459 программистов и 1711 роботов. Сейчас ищут 1649 программистов ...

Как инстаграм это делает?

Тема в разделе "Вопросы от блондинок", создана пользователем NerdRage, 19 дек 2016.

  1. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Открываем любой инстраграм (например), тыкаем на любую фотку - ссылка в адресной строке браузера меняется. Это в JavaScript такое делается? Я в свои бородатые студенческие годы читал, что JavaScript такое не умеет делать по соображениям безопасности. Но видимо стандарты поменялись?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Уже две статьи на английском, а я так и не подучил английский...
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну так вперед
     
  5. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Сел наконец-то за эту штуку. Есть каталог. Когда нажимаешь на элемент - всплывает окно, адресная строка меняется например на /catalog/17. Закрываешь окно - адресная строка меняется обратно на /catalog/. Это всё работает. Ежели кому интересно как оно работает, то вот:
    Код (Javascript):
    1. // я использую плагин FancyBox 2 для всплывающих окон
    2. // после успешного аджакса по клику, контент выплёвывается во всплывающее окно
    3. $.fancybox({
    4.    content: result['html'],
    5.    afterClose: function() {
    6.       // при закрытии окна, возвращаемся в каталог
    7.       window.history.pushState({nav:'popup'}, '', '/catalog/');
    8.    }
    9. });
    10. // тут адресная строка меняется на /catalog/17 например
    11. window.history.pushState({nav:'popup'}, '', '/catalog/'+Id);
    А теперь вот в чём загвоздка.
    Если после закрытия всплывающего окна, нажать в браузере "назад", то ссылка поменяется на /catalog/17, но всплывающее окно естественно не откроется, потому что не было клик-эвента. Как с этим быть? Как поймать эвент изменения ссылки и повесить на него свою функцию?
    --- Добавлено ---
    Ещё аналогичная ситуация. Если открыть всплывающее окно, потом нажать "назад" в браузере, то ссылка меняется на /catalog/, но всплывающее окно не закрывается.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а вот для этого есть всякие spa фреймворки, роутеры и т.п.
     
  7. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    А как в том же Инстаграмме сделано доподлинно не известно? Загружать фронт-энд фреймворком из-за такой фигни не хотелось бы, попробую найти библиотеку.
     
  8. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тебе надо почитать про это дело. А то фреймворк vs библиотека - вопрос тонкий.
     
  10. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    @igordata Вообще ничего не надо. Вот весь код:
    Код (Javascript):
    1. window.onpopstate = history.onpushstate = function(e) {
    2.    $('body').html(window.location.href); // тест
    3. };
    Ловит именно нажатия в браузере вперёд-назад, но не когда ты вызываешь в скрипте window.history.pushState.
     
    #11 NerdRage, 25 фев 2017
    Последнее редактирование: 25 фев 2017
  11. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Короче у меня вот такая штука получилась. По-моему красота.
    Код (Javascript):
    1. window.onpopstate = history.onpushstate = function(e) {
    2.    var uri = window.location.pathname;
    3.    uri = uri.split('/');
    4.    uri.forEach(function(value, key, arr) {
    5.       if (value == 'catalog') {
    6.          var Id = parseInt(arr[key+1]);
    7.          if (Number.isInteger(Id)) {
    8.             alert(Id);
    9.          } else {
    10.             $('.fancybox-overlay').remove();
    11.          }
    12.          return false;
    13.       }
    14.    });
    15. };
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты считаешь, что не надо, потому что не читал