Javascript якорная навигация - PullRequest
       15

Javascript якорная навигация

0 голосов
/ 21 декабря 2009

Я создаю веб-сайт с «якорной навигацией», которая используется в Facebook и Google Mail. Я получил это работает, но не полностью. Когда я загружаю страницу с чем-то вроде #contact, она не загружается, пока я не нажму на нее ссылку. Кроме того, был бы лучший, более эффективный способ сделать то, что я делаю? Я не лучший человек с программированием на JS.

JavaScript

$.navigate = function() {
  // a new link
  if($anchor != document.location.hash){
    // add a preloader
    $("#content")
      .empty()
      .html('<p class="align-center"><img src="assets/images/loading.gif" /></p>');
    // change the anchor saved for next time
    $anchor = document.location.hash;
    // get the variables ready for the get
    var i = $anchor.substring(1).split("/");
    var $page = i[0];
    var $y = (i[1]) ? i[1] : false;
    // get the file
    $.get("callback.php", { x: $page, y: $y }, function(data){
      $("#content")
        .empty()
        .html(data);
    },"html");
  }
};

$(function() {

  var $anchor = "";
  // change from the URI. This dont work.
  if(document.location.hash){ $.navigate(); }

  $("a","#nav")
    .css({backgroundColor:"#f7f7f7"})
    .each(function() { 
      $(this).attr("href","#" + $(this).attr("name")); 
    });  

  setInterval('$.navigate()', 300);

});

HTML:

<div id="nav">  
  <ul class="horizontal-nav">
    <li><a href="http://streetmafia.co.uk/" name="index">Home</a></li>
    <li><a href="http://streetmafia.co.uk/about" name="about">About</a></li>
    <li><a href="http://streetmafia.co.uk/portfolio" name="portfolio">Portfolio</a></li>
    <li><a href="http://streetmafia.co.uk/contact" name="contact">Contact</a></li> 
  </ul>
  <div id="l-nav"></div>
  <div id="r-nav"></div>  
</div>

Ответы [ 3 ]

2 голосов
/ 21 декабря 2009

Попробуйте плагин jquery ReallysimpleHistory .

1 голос
/ 22 декабря 2009

То же самое с плагином ReallysimpleHistory. Я не уверен, что полностью понимаю ваш код, но я бы разделил его на 2 функции:

  1. Один выполняет загрузку AJAX (включая отображение предварительного загрузчика)
  2. Другой проверяет текущий хеш (из URL) и вызывает предыдущую функцию

В вашем "$ (function () {..." вы сначала вызываете вторую функцию (только один раз), а затем связываете событие щелчка ссылок с первой функцией. Вы можете получить хеш в функции загрузки, используя $ (this) .attr ('name').

Быстрый пример (не проверено: P):

function ajaxLoad()
{

 var anchor;

 // Check to see if it's being called from an event
 if ( $(this).length > 0 )
 {
   anchor =  $(this).attr('name');  
 }
 else
 {
   anchor = document.location.hash;
 }

}
0 голосов
/ 05 августа 2010

Возможно, вы захотите проверить проект jQuery History: http://www.balupton.com/projects/jquery-history

Это немного более полнофункциональный и простой в реализации, чем другие, плюс поддержка, если она фантастическая. Для этого также имеется полнофункциональное расширение AJAX, позволяющее легко интегрировать запросы Ajax в ваши состояния / хэши, чтобы превратить ваш веб-сайт в полнофункциональное приложение Web 2.0: http://www.balupton.com/projects/jquery-ajaxy

Вот пример использования jQuery History (взятый с демонстрационного сайта):

// Bind a handler for ALL hash/state changes
$.History.bind(function(state){
    // Update the current element to indicate which state we are now on
    $current.text('Our current state is: ['+state+']');
    // Update the page"s title with our current state on the end
    document.title = document_title + ' | ' + state;
});

// Bind a handler for state: apricots
$.History.bind('/apricots',function(state){
    // Update Menu
    updateMenu(state);
    // Show apricots tab, hide the other tabs
    $tabs.hide();
    $apricots.stop(true,true).fadeIn(200);
});

И пример jQuery Ajaxy (взятый с демонстрационного сайта):

        'page': {
            selector: '.ajaxy-page',
            matches: /^\/pages\/?/,
            request: function(){
                // Log what is happening
                window.console.debug('$.Ajaxy.configure.Controllers.page.request', [this,arguments]);
                // Adjust Menu
                $menu.children('.active').removeClass('active');
                // Hide Content
                $content.stop(true,true).fadeOut(400);
                // Return true
                return true;
            },
            response: function(){
                // Prepare
                var Ajaxy = $.Ajaxy; var data = this.State.Response.data; var state = this.state;
                // Log what is happening
                window.console.debug('$.Ajaxy.configure.Controllers.page.response', [this,arguments], data, state);
                // Adjust Menu
                $menu.children(':has(a[href*="'+state+'"])').addClass('active').siblings('.active').removeClass('active');
                // Show Content
                var Action = this;
                $content.html(data.content).fadeIn(400,function(){
                    Action.documentReady($content);
                });
                // Return true
                return true;

И если вы когда-нибудь захотите получить параметры строки запроса (например, yoursite/page.html#page1?a.b=1&a.c=2), вы можете просто использовать:

$.History.bind(function(state){
    var params = state.queryStringToJSON(); // would give you back {a:{b:1,c:2}}
}

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

...