2013-09-22 80 views
0

當我請求一個頁面並返回404時,下面的代碼給了我一個像this這樣的錯誤。相反,它應該調出一個警報。奇怪的是它只對鏈接已經在已被ajaxed,在不更新/改變它的鏈接工作正常。

('.page-wrap').append('<img src="img/graphics/ajax-loader.gif" class="ajax-loader" />'); 

    var target = $('section.content'), 
     siteURL = 'http://' + top.location.host.toString(), 
     internalLinks = $("a[href^='"+siteURL+"'], a[href^='/'], a[href^='./'], a[href^='../'], a[href^='#']"), 
     links = $('a'), 
     URL, 
     el, 
     mainContent, 
     headContent, 
     headClasses, 
     pageName, 
     ajaxSpinner = $('.ajax-loader'); 
    internalLinks.click(function(e) { 

     el = $(this); 

     URL = el.attr('href'); 

     $('.current_page_item').removeClass('current_page_item'); 
     el.addClass("current_link").parent().addClass("current_page_item"); 

     ajaxLoader(URL, false); 

     e.preventDefault(); 

    }); 

    function ajaxLoader(location, isHistory) { 
      $("html, body").animate({ scrollTop: "0px" }); 
      ajaxSpinner.show(); 
      $('.page-wrap').css('opacity', '0.5}'); 


      // Load New Page 
      $.get(location, function(data) { 
       mainContent = $('section.content', data).html(); 
       headContent = $('.feature-content', data).html(); 
       pageName = $('.page-name', data).html(); 
       headClasses = $('header', data).attr('class'); 
       $('section.content').html(mainContent); 
       $('.page-name').html(pageName); 
       $('.feature-content').html(headContent); 
       if (headClasses) { 
        $('header').attr('class', headClasses); 
       } else { 
        $('header').removeClass(); 
       } 
       if (!isHistory) { 
        history.pushState(location, '', location); 
       } 

       $(resizeHeader); 

       ajaxSpinner.fadeOut(); 
      }).error(function() { 
       alert('woops'); // or whatever 
      }); 
    } 
    w.bind('popstate', function(event) { 
     if (event.originalEvent.state !== null) { 
      ajaxLoader(event.originalEvent.state, true); 
     } 
    }); 
+0

你究竟想要什麼? – Brian

+0

我想用AJAX加載頁面,如果有錯誤(例如404),那麼它會通知用戶,上面的代碼工作,但是在我添加'.error'部分後,它開始出現錯誤。 – George

+0

@George,這些行的目的是什麼:'mainContent = $('section.content',data).html();'etc?我看不出爲什麼需要它們...... –

回答

1

的第一個想法

  • 是它也許是東西在你的成功處理程序代碼是造成某種錯誤的情況下?就像可能注入任何回到第一個成功時間的html導致腳本第二次失敗一樣?

  • 您看到在您的Fiddler/Firebug/F12開發人員工具中選擇了什麼 - 您正在使用其中之一,對嗎? :)保留在任何控制檯錯誤的眼睛......

第二個想法

您正在使用什麼版本的jQuery?

我已經用jq 1.8.2測試了這個,錯誤處理程序對我來說工作得很好,但是如果這是一個JSONP請求,它將不會觸發error()函數。我把你的代碼的要點:

$.get(
       "404MeBaby.html", function (data) { 
        $(".result").html(data); 
        console.log(data); 
       } 
      ).error(
      function (x) { 
       console.log("well that didn't go so well..."); 
      }); 

API

在jQuery 1.5,成功回調函數也將傳遞一個 「jqXHR」 對象(在jQuery的1.4,這是通過了XMLHttpRequest對象)。但是,由於JSONP和跨域GET請求不使用 XHR,在這些情況下,傳遞給 成功回調的jqXHR和textStatus參數未定義。

您可以嘗試使用$.ajax,因爲它可以提供更多的控制。或者,您可以設置jQuery全局ajax選項,如here所示,這將影響所有$ .get調用,但請記住JSONP的詛咒,如果相關!

+0

正如所料,這是它給我的錯誤,僅此而已(http://cl.ly/image/2E2l1Y41051s)。我正在運行jQuery 1.9.1。我已經玩弄了它,並發現它是行: $('section.content')。html(mainContent); 這會導致錯誤。我會看看是否它的HTML導致錯誤,但我不知道爲什麼? – George

+0

@George,你可以在這裏張貼什麼是你注入到該元素mainContent的價值 - 從你的代碼覆蓋ajax目標,是嗎?讓我們看看是否有什麼有趣的東西被寫入該元素.. –

+0

我已經這樣做了,對我來說似乎沒有任何狡猾。它只是HTML。這是否與文檔第一次創建時鏈接不存在有關?我改變了ajax之後完整的鏈接之一,並且它符合這個結論。 你有什麼可以解決這個問題的建議嗎? – George