Подтвердить что ты не робот

Как сохранить элементы, не обновленные

Основная цель заключается в том, чтобы не обновлять logotext <div class="small-7 medium-4 columns logo"> и меню <nav class="pagedMenu" role="navigation">, без обрезки на обновлении страницы или при загрузке содержимого со страницы на другую. Кроме того, состояние меню должно сохраняться со страницы на другую.

Я нашел здесь возможное решение, которое могло бы решить проблему (вы можете использовать ajax для извлечения обновленного содержимого и использовать jQuery для размещения нового содержимого на страницы и полностью избегать обновления. Выполняя это, существующие данные на странице останутся нетронутыми. said @jfriend00)

Итак, я попытался использовать плагин Ajax (называемый AWS). На странице параметров AWS я (предположим), что я сделал правильную вещь, указав wrapper как идентификатор контейнера Ajax, а также pagedMenu в качестве контейнера класса меню, включен режим перехода, нет идентификаторов контейнера ajax, не выбран загрузчик, уже имеющий импульсный загрузчик в теме.

В этот момент все, что у меня получилось, это ошибка меню/бокового меню (shiftnav)/импульсного точечного загрузчика/загрузки содержимого, созданная, возможно, неправильным определенным идентификатором контейнера Ajax и/или контейнером класса меню (?) ИЛИ посредством конфликт с существующим кодом JS/jQuery, не так уверен.

Также в консоли Chrome есть ошибка:

Uncaught SyntaxError: Unexpected token ;
(anonymous function) @ ajaxify.js?ver=4.3.1:175
n.extend.each @ jquery-2.1.4.min.js?ver=2.1.4:2
n.fn.n.each @ jquery-2.1.4.min.js?ver=2.1.4:2
$.bind.$.ajax.success @ ajaxify.js?ver=4.3.1:169
n.Callbacks.j @ jquery-2.1.4.min.js?ver=2.1.4:2
n.Callbacks.k.fireWith @ jquery-2.1.4.min.js?ver=2.1.4:2
x @ jquery-2.1.4.min.js?ver=2.1.4:4
n.ajaxTransport.k.cors.a.crossDomain.send.b @ jquery-2.1.4.min.js?ver=2.1.4:4

Все возвращается к норме при обновлении страницы, но ничего не помогает, бесполезно.

Я также должен упомянуть, что для меню я пытался сохранить состояние с помощью jQuery-Storage-API и storage=jQuery.sessionStorage;, как вы можете видеть в mynewmenu.js, но это не решит проблему, не относящуюся к освежающим элементам.

Только меню jsfiddle, если это помогает получить всю картину, здесь благодаря @Diego Betto.

Вы можете использовать эту прямую ссылку в качестве примера; существует аналогичная ситуация с описанным выше - право реализации Ajax (?) - и в отношении внешнего вида меню не обновляется с одной страницы на другую; если вы просматриваете книги, работы и т.д., вы увидите разделы меню; если есть модель, которая может быть реализована здесь, я буду рад ее найти.

LE: я пробовал еще раз ajaxify solution, сделанный @arvgta - особая благодарность - без успехов, но насколько я Найденный от автора, определенные элементы должны быть div с id не классами. Итак, я попытаюсь найти способ как-то изменить код, чтобы вместо этого использовать id.

Кроме того, я попытаюсь преобразовать и реализовать в файле ajaxify.min.js элемент page-container; jQuery('#page-container').ajaxify(); Я вернусь с новостями.

LE2: Я попытался реализовать решение, используя id вместо классов, но все же страницы не загружаются правильно.

В этот момент мы обновили файл ajax.min.js с этими строками:

(function($){

  jQuery(document).ready(function(){
    jQuery('#page-container').ajaxify({requestDelay:400,forms:false});
  });

})(jQuery); 

Кроме того, я изменил файл темы вместо id=page-container, если class=page-container.

В этих условиях, при щелчке по меню, ссылки меняются (как и должно быть), элементы меню/логотекста, кажется, работают почти нормально (иногда получается сменяемое положение), но контент не загружается правильно во всех случаях; То же самое, все возвращается к обычному обновлению страницы вручную (f5), но не помогает.

LE3: Похоже, что конфликт (по крайней мере) между плагином Revolution Slider и Ajaxify.

errormessage = "Ошибка слайдера Revolution: у вас есть некоторая библиотека jquery.js, которая появляется после включения файлов революции js."; = "+ ="
Это включает в себя make исключает библиотеки слайдера революции и делает их неработоспособными "." <= "" span = " > "

Ссылка на сайт здесь. Любые мысли/альтернативы в этой области? (не заинтересованы в использовании других платформ, разных тем WordPress и т.д. всего лишь обходной путь в этой существующей ситуации)

LE4: Насколько я могу судить, есть много пользователей, которые проголосовали за ответ Джейка Бауна, который мог бы быть действительно решением; но я не могу найти причину, которая не была правильно реализована в моей теме (без ошибок) живая ссылка здесь Элементы logotext/menu все еще исчезают при обновлении, не сохраняются без обновления. Любые мысли @Jake Bown/кто-нибудь?

LE final. Buzinas(еще раз спасибо за ваше время и усилия) дал самый близкий ответ для моих нужд, принимая во внимание среду моего сайта (плагины установлены и т.д.); Я вернусь с новостями, как только у меня получится окончательное решение. Спасибо всем.

4b9b3361

Ответ 1

TL; DR

Я создал плункер для вас, взгляните и играйте с ним, пока вы можете. Вы будете узнать много из этого!


Я думаю, что вы слишком много делаете здесь, но не пробовали простейшие:

Основная цель состоит в том, чтобы не обновлять логотекст и меню, не обрезая обновление страницы или пока контент загружается со страницы на другую. Также состояние меню должно сохраняться со страницы на другую.

Если вы хотите сделать это, выполните несколько шагов:

  • Создайте страницу "мастер", которую мы собираемся вызывать index.html с этого момента.
  • Итак, наш индекс должен иметь статическую часть нашей страницы, например меню, логотип, нижний колонтитул и т.д.
  • Затем наши "подстраницы" должны быть обрезаны (теги html, head, body, script, style), только контент, который должен отображаться на нашей главной странице).
  • Теперь мы должны изменить наши ссылки, чтобы использовать AJAX вместо полного обновления:

    /* we add a 'click' event handler to our menu */
    document.getElementById('menu-menu-2').addEventListener('click', function(e) {
      var el = e.target;
    
      /* then, we see if the element that was clicked is a anchor */
      if (el.tagName === 'A') {
        /* we prevent the default functionality of the anchor (i.e redirect to the page) */
        e.preventDefault();
        /* we show our spinner, so the user can see that something is loading */
        spinner.classList.remove('hidden');
    
        /* and we call our AJAX function, passing a function as the callback */
        ajax(el.href, function(xhr) {
          /* we get our main div, and we replace its HTML to the response that came
             from the AJAX request */
          document.getElementById('main').innerHTML = xhr.responseText;
          /* since the request was finished, we hide our spinner again */
          spinner.classList.add('hidden');
        });
      }
    });
    
  • Хорошо, теперь наши страницы уже работают через AJAX, а не перезагружают наш статический контент.


Но теперь мы видим, что у нас есть некоторые проблемы. Например, если кто-то попытается открыть одну из наших страниц напрямую через URL-адрес, он увидит незакрепленную страницу без меню/логотипа и т.д. Итак, что нам делать?

Теперь у нас есть еще несколько шагов:

  • Имитировать, что наши ссылки эффективно переносятся между страницами с помощью API истории:

    /* inside our ajax callback, we save the fake-redirect we made into the pushState */
    ajax(el.href, function(xhr) {
      document.getElementById('main').innerHTML = xhr.responseText;
    
      /* save the new html, so when the user uses the back button, we can load it again */
      history.pushState({
        html: main.innerHTML,
        title: el.textContent + '| neuegrid'
      }, '', el.href);
    
      /* (...) */
    });
    
    /* and outside it, we add a 'popstate' event handler */
    window.addEventListener('popstate', function(e) {
      /* so, if we've saved the state before, we can restore it now */
      if (e.state) {
        document.getElementById('main').innerHTML = e.state.html;
        document.title = e.state.title;
      }
    });
    
  • И нам нужно, чтобы при входе пользователя непосредственно на другую страницу, например about-us, мы перенаправляем его на index.html, а затем загружаем страницу about-us.

  • Итак, мы создаем файл redirect.js, и мы ссылаемся на него во всех наших подстраниц:

    /* save the page that the user tried to load into the sessionStorage */
    sessionStorage.setItem('page', location.pathname);
    /* and them, we redirect him to our main page */
    location.replace('/');
    
  • И затем, на нашей странице index.html, мы видим, есть ли какая-либо страница в sessionStorage, и мы ее загружаем, если есть, в противном случае мы загружаем нашу страницу home.

    var page = sessionStorage.getItem('page') || 'home';
    /* we look into the menu items, and find which has an href attribute 
       ending with the page URL we wanna load */
    document.querySelector('#menu-menu-2 > li > a[href$="' + page + '"').click();
    

И это, мы закончили. Посмотрите на плункер, который я вам сделал.

И играйте с ним, пока вы можете, так что вы многое узнаете от него.

Надеюсь, я мог бы помочь вам!:)


Примечание. Для справки это наша функция ajax:

function ajax(url, callback, method, params) {
  if (!method) method = 'GET';

  var xhr = new XMLHttpRequest();
  xhr.open(method, url);

  if (callback) xhr.addEventListener('load', function() {
    callback.call(this, xhr);
  });

  if (params) {
    params = Object.keys(params).map(function(key) {
      return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
    }).join('&');
    xhr.send(params);
  } else {
    xhr.send();
  }
}

Ответ 2

Из того, что вы сказали, я думаю, что, возможно, нашел решение, которое вы ищете, - вы хотите динамически загружать контент, сохраняя при этом логотип и навигацию нетронутыми? Если да, это может быть то, что вы ищете.

В этом примере страницы загружаются из div внутри страницы, но могут использоваться для загрузки другого URL-адреса или файла:

$('.viewport ul li a').on('click', function(e) {
   e.preventDefault();
   var link = this.hash.substring(1, this.hash.length);
   if($('.'+link).length) {
     $('.viewport span.body').html($('.'+link).html());
   }
});

Ответ 3

ИДЕТ С ПОМОЩЬЮ WORDPRESS

выполните следующие простые шаги (возьмите в качестве примера тему "twentyfifteen" в папке шаблонов WP):

  • edit single.php, page.php, index.php и все остальные страницы, имеющие функции get_header() и get_footer(), и замените их соответственно на следующий код:

ПРИМЕЧАНИЕ: это важно, потому что, если кто-то (например: поисковый движок) достигает ваших страниц непосредственно из ссылки, он по-прежнему полностью доступен и 100% работает. (полезно для SEO)


<?php 
//get_header()
if(!isset($_REQUEST['ajax'])){
  get_header();
}
?>

<!-- other code --->

<?php
//get_footer()
if(!isset($_REQUEST['ajax'])){
  get_footer();
}
?>
  1. откройте header.php добавьте ниже код внутри раздела <head> в самом конце
    <script>
!(function($) {
    $(function() {
        $('.menu-item a, .widget-area a, .page_item a').on('click', function(e) {
            e.preventDefault();
            var href = this.href;
            var query = href ? (href + (!/\?/g.test(href) ? '?' : '&') + 'ajax=1') : window.location;

            /* IMPLEMENT SOME LOGIG HERE BEFORE PAGE LOAD */
            /* ex: kill instance of running plugins */

            $('#content').hide().empty().load(query, function() {

                /* IMPLEMENT SOME LOGIG HERE AFTER PAGE IS LOADED */
                /* ex: refresh or run a new plugin instance for this page */

                jQuery(this).show();
            });
        });
    });
})(jQuery);
    </script>
  1. в файле header.php введите код ниже в конце файла, в 90% случаев он вам понадобится под навигацией. В этом случае мы уже имеем это в теме "twentyfifteen".

    NB:, скорее всего, у вас есть тег открытия <div id="content" class="site-content"> внутри файла header.php и закрывающий тег </div> в файле footer.php, это не имеет значения, вы можете оставьте его как есть.


<div id="content"></div>
  • ПРИМЕЧАНИЕ: считают это доказательством концепции; он может работать так, как есть, но вы все равно должны его адаптировать в соответствии с вашими потребностями; вам может потребоваться:

    • Добавьте меню (если оно еще не установлено), перейдя под Appeareace > Menus > [check Primary Menu] > Save Menu, чтобы активировать меню. он протестирован и работает.
    • Возможно, вам захочется добавить какой-либо другой класс в функцию jQuery, например .widget-area a, чтобы ajax также отображал ссылки на виджеты.
    • Если вы используете плагины 3d-вечеринки, вам может потребоваться, чтобы все зависимости каждого плагина были загружены также на главной странице из где вы хотите, чтобы все отображалось без обновления содержимого.
    • вам может потребоваться проверить и убить те плагин для 3d-вечеринок перед загрузкой новой страницы и запустить или обновить > плагин, необходимый на загруженной странице.