-1

私はまだ JavaScript を学んでおり、外部ファイル (test1.php、test2.php など) から各ページのコンテンツを読み込む ajax Web サイトを構築しています。動作するコードをまとめるのに数時間を費やしましたが、非常にぎこちなく感じます。それを合理化する方法に関する推奨事項はありますか?または、私がしていることは愚かであり、別の方法で行う必要がありますか?

JS:

$(document).ready(function() {

var hash = window.location.hash.substr(1);

var projectID = $('#topNav a').each(function(){
    var projectID = $(this).attr('id');
    if(hash==projectID){
        var toLoad = hash+'.php .content';
        $('.content').load(toLoad);
        $(this).siblings().removeClass('active');
        $(this).addClass('active');
    }                           
});

$('#topNav a').click(function(){

    var toLoad = $(this).attr('href')+' .content',
        newId = $(this).attr('rel'),        
        oldHeight = $('#shell').css("height"),      
        viewportHeight = $(window).height()

    if (!$(this).hasClass("active")) {

        $(this).siblings().removeClass('active');
        $(this).addClass('active');

        $('<div/>', {
            id: newId,
            class: 'content'
        }).css({ top: viewportHeight + "px", display: "none" }).appendTo('#shell').load(toLoad);

        $('#' + newId).show(function() {
            $(this).animate({ top: "0px", queue: false}, 600);
            $('#shell > div:first').animate({ top: "-" + oldHeight, queue: false}, 600, function() {

                $('#shell > div:first').remove()
            });
        });

        var newHash = $(this).attr('id');
        window.history.pushState(null, "", "#" + newHash);

    }

    return false;
});

window.addEventListener("popstate", function(e) {

    var hash = window.location.hash.substr(1),
        oldHeight = $('#shell').css("height"),      
        viewportHeight = $(window).height()

    var projectID = $('#topNav a').each(function(){
        var projectID = $(this).attr('id');
        if(hash==projectID){
            var toLoad = hash+'.php .content'

            $(this).siblings().removeClass('active');
            $(this).addClass('active');

            $('<div/>', {
                id: hash,
                class: 'content'
            }).css({ top: viewportHeight + "px", display: "none" }).appendTo('#shell').load(toLoad, function() {

                $(this).show(function() {
                    $(this).animate({ top: "0px", queue: false}, 600);
                    $('#shell > div:first').animate({ top: "-" + oldHeight, queue: false}, 600, function() {

                        $('#shell > div:first').remove()
                    });
                });

            });

        }                           
    });

});

});

HTML:

<nav id="topNav">
<a href="test1.php" id="test1" rel="content1" class="active">Test 1</a>
<a href="test2.php" id="test2" rel="content2">Test 2</a>
<a href="test3.php" id="test3"rel="content3">Test 3</a>
</nav>

<div id="shell">

<div id="content1" class="content">

    <p>Here is the first page</p>

</div>

</div>

CSS:

#topNav {
position: fixed; overflow: auto; top: 0; left: 0;
width: 100%; z-index: 100; background: #fff; height: 80px;
}
#topNav a { margin-right: 30px; color: #a9a9a9; }
  #topNav a.active { color: #333; }

#shell { margin: 0px; padding: 0px; width: 100%; height: 100%; }

.content { 
  position: absolute; margin: 0px; padding-bottom: 0px;
  width: 100%; height: 100%;
}
#content1 { background: #000; color: #fff; }
#content2 { background: red; }
#content3 { background: blue; }
4

1 に答える 1

1

要点 :

  • 多くのコードが重複しています -> パターンを特定し、プラグインを作成します
  • jquery オブジェクトをキャッシュしない
  • .on (&delegate イベント) を使用しない
  • jquery メソッドを連鎖させない

それらの線に沿って再構築します(これは単なるコアであり、テストされていませんが、良い再出発点になるはずです)

$.fn.extend({

  tofocus : function () {

      var $tofocus=$(this);
      //put your animations/effects/your browser history management stuff
     //addcclass/removeclass 
     //chain everything .end() if necesary (like after .siblings() )
    return $tofocus;


    },      

  loadcontent : function(id) {
       var $t=$(this);
       //look if this content was already loaded 
       //if loaded $("#'+id+'").tofocus() 

      //if not ->
       var viewportHeight=$(window).height();
       var $divcontent = $('<div/>', {
                    "id"   : "content-"+id,
                    "class": 'content'
                     }).css({ 
                      top: viewportHeight + "px", display: "none"       
                 }).appendTo($t).load(id+'.php',function() {
                        $(this).tofocus();
        });
        return $t;
  }
})



$(document).ready(function() {
  //cache your content container 
  // it will  be used every time a nav button is clicked/at init & if using back/fw button -> you'll spare as much access to the dom to create the object
  var $ctt=$("#shell");
  //load first page (id from hashtag on page load ?)
  var hashfirst=...
  $ctt.loadcontent(hashfirst);


  $(document).on("click","#topNav a",function(e) {
            $ctt.loadloadcontent(this.id);
            return false
   })

   window.addEventListener("popstate", function(e) {

            var hash = window.location.hash.substr(1),
            $ctt.loadcontent(hash);

           });
 });
于 2013-01-22T20:47:34.163 に答える