2012-03-10 22 views
0

我的腳本可以被細分爲三個部分:用JSON數據點擊加載環球免稅店圖庫。我需要新鮮的眼睛看我的錯誤

  1. 事件處理程序來捕獲點擊菜單項的ID。這是圖庫名稱,它告訴腳本在哪裏可以找到特定圖庫的圖像和xml文件。
  2. 從xml中提取圖像信息並將其轉換爲可用的JSON的功能。
  3. 將JSON加載到環球免稅店。

JSON不會變成Galleria,或者我沒有正確加載它。不幸的是,對JS來說,我太新了,以至於在調試時非常有效。我覺得我在這個相當深的水中。

該網站爲http://willowbrook.businesscatalyst.com/showcase

這是我的腳本。我正在使用最新的jQuery和xml2json插件。

$(document).ready(function() { 

var firstGallery   = 'kitchens'; 
var galleriaNavID   = '#showcasenav'; 
var galleriaID   = '#showcaseitems'; 
var selectedClass   = 'selected'; 
var imageFolder   = '/images/showcase/'; // Don't forget the/(forward slash) before and after 
var xmlFileName   = 'PhotoGallery.xml'; 
var selectedNavElement = galleriaNavID+' .'+selectedClass; 
var galleryName   = $(selectedNavElement).attr('id'); 

if(galleryName == null) { 
    galleryName = firstGallery; 
    $('#'+firstGallery).click(); 
}; 

function loadGalleria() { 
    function GalleriaBCtoJson() { // Convert PhotoGallery XML to JSON and load dynamically into Galleria 

     var data = new Array; 

     $.get(imageFolder+galleryName+'/'+xmlFileName, function(xml){ 
      var i; 
      var imgArray = $.xml2json(xml).album.img; 
      for(i in imgArray) { 
       data.push({ image: imageFolder+galleryName+'/'+imgArray[i].src }); 
      }; 
     }); 
     return data; 
    }; 

    var data = GalleriaBCtoJson(); 

    if ($(galleriaID).data('galleria')) { // If Galleria has already been initialized, 
     $(galleriaID).data('galleria').load(data); // load galleria with the new data 
    } 
    else { // Call Galleria, set options, 
     $(galleriaID).galleria({  
      dataSource: data, // and add the data as dataSource 
      image_crop: true, 
      carousel: true, 
      carousel_speed: 2000, 
      autoplay: 5000, 
      thumbnails: true, 
      showInfo: false, 
      transition: 'fade', 
      transition_speed: 600, 
      lightbox: true, 
      easing: 'galleriaIn', 
      pauseOnInteraction: false, 
      debug: false 
     }); 
    } 
}; 


$(galleriaNavID+' a').click(function(e) { // attach event handler to the menu 
    e.preventDefault(); 

    $(selectedNavElement).removeClass(selectedClass); // toggle selected class 
    $(this).addClass(selectedClass); 

    galleryName = $(this).attr('id'); 
    loadGalleria(); 
}); 

});

這是我使用建議完成的解決方案。這完美的作品:

  galleria : function(){ 
      $(document).ready(function() { 

       var firstGallery  = 'kitchens'; 
       var galleriaNavID  = '#showcasenav'; 
       var galleriaID   = '#showcaseitems'; 
       var selectedClass  = 'selected'; 
       var imageFolder   = '/images/showcase/'; // Don't forget the/(forward slash) before and after 
       var xmlFileName   = 'PhotoGallery.xml'; 
       var selectedNavElement = galleriaNavID+' .'+selectedClass; 
       var galleryName   = $(selectedNavElement).attr('id'); 

       if(galleryName == null) { 
        galleryName = firstGallery; 
       }; 

       function loadGalleria() { 
        function GalleriaBCtoJson(callback) { // Convert PhotoGallery XML to JSON and load dynamically into Galleria 

         var data = []; 

         $.get(imageFolder+galleryName+'/'+xmlFileName, function(xml){ 
          var i; 
          var imgArray = $.xml2json(xml).album.img; 
          for(i in imgArray) { 
           data.push({ image: imageFolder+galleryName+'/'+imgArray[i].src }); 
          }; 
          callback(data); 
         }); 
        }; 

        var data = GalleriaBCtoJson(function(data) { 
         if ($(galleriaID).data('galleria')) { // If Galleria has already been initialized, 
          $(galleriaID).data('galleria').load(data); // load galleria with the new data 
         } 
         else { // Call Galleria, set options, 
          $(galleriaID).galleria({  
           dataSource: data, // and add the data as dataSource 
           image_crop: true, 
           carousel: true, 
           carousel_speed: 2000, 
           autoplay: 5000, 
           thumbnails: true, 
           showInfo: false, 
           transition: 'fade', 
           transition_speed: 600, 
           lightbox: true, 
           easing: 'galleriaIn', 
           pauseOnInteraction: false, 
           debug: false 
          }); 
         } 
        }); 
       }; 


       $(galleriaNavID+' a').click(function(e) { // attach event handler to the menu 
        e.preventDefault(); 

        $(selectedNavElement).removeClass(selectedClass); // toggle selected class 
        $(this).addClass(selectedClass); 

        galleryName = $(this).attr('id'); 
        loadGalleria(); 
       }); 

       $('#'+firstGallery).click(); 
      }); 
     } 

只要記住把xml2json和廣場插件的頭。他們可以在這裏找到:http://www.fyneworks.com/jquery/xml-to-json/#tab-Download

http://galleria.io/

回答

1

我不知道究竟問題是什麼,但是當你這樣做:

var data = GalleriaBCtoJson(); 

...你會得到一個空數組,因爲$.get回調尚未被調用。該函數返回data,但由於它在ajax完成之前返回,因此它是空的。你可以用一個簡單的控制檯來確認。

你需要做的是這樣的:

GalleriaBCtoJson(function(data) { 
    // continue using data 
}); 

而且GalleriaBCtoJson

function GalleriaBCtoJson(callback) { 
    var data = []; 
    $.get(url, function(xml){ 
     // loop and insert into data here 
     callback(data); 
    }); 
} 
+0

所以,你會建議把我的if/else裏面的函數調用(你把「//繼續使用數據」)?我想我不明白ajax在分配給數據變量的時候是不是完整的。 – 2012-03-12 15:55:21

+0

@AdamCook是的,類似的東西。當你返回'data'時,它是空的。 'data.push()'羣體在返回後完成,因此在羣體完成後需要調用另一個函數,而不是從函數返回數據,即所謂的* callback *。這對於異步編程是很典型的,如果您打算在將來編寫JavaScript,那麼現在就可以開始討論它了。 – David 2012-03-12 20:53:56