为什么我的回调只在一个页面上被调用?

时间:2011-04-19 02:05:14

标签: javascript jquery ajax json

我正在使用jQuery获取一些JSON,然后将其插入一些元素并显示在我的页面上。

它在all pages除了one之外正常工作,其中响应似乎是页面本身。

我已将alert()放入回调中(successcomplete)并且它们似乎永远不会被解雇(尽管Firebug显示请求返回200 OK哪个应该触发success处理程序。)

我不知道该怎么办,我以前从未见过这个。

这是我正在使用的jQuery代码:

var specials = (function() {

    var specials = false,
        specialsAnchor;

    var init = function() {
        specialsAnchor = $('#menu-specials a');

        specialsAnchor.click(function(event) {
            event.preventDefault();
            if (specials != false && specials.is(':visible')) {
                hide();
            } else {
                show();
            }

        });
    };

    var load = function(callback) {

      specialsAnchor.addClass('loading');

      specials = $('<div />', { 'id': 'specials' }).hide().appendTo('#header');

      var specialsUl = $('<ul />').appendTo(specials);

      $.ajax(specialsAnchor.attr('href'), {
          dataType: 'json',
          success: function(data) {

            $.each(data, function(i, special) {

                specialsUl.append('<li><h4>' + special.heading + '</h4><p>' + special.content + '</p></li>');

            });
            specialsAnchor.removeClass('loading');
            callback.call();

         }

      });

    }

    var show = function() {
      if (specials == false) {
        load(show);
        return;
      }
      specials.slideDown(500);
    }

    var hide = function() {
      specials.slideUp(500);
    }

    $(init);

})();

发生了什么事?

2 个答案:

答案 0 :(得分:1)

我注意到你在这个页面上包含了jquery.validate,而不是其他人。 jQuery使用jQuery验证&gt;使用AJAX调用1.5 causes some issues

我意识到链接的问题/答案并不完全是你所看到的,但我已经看到了AJAX调用以及validate和jQuery的这种组合的各种奇怪问题,所以我认为值得一提。

希望有所帮助。

答案 1 :(得分:0)

这可能不是一个完整的答案,但可能是朝着正确方向迈出的一步。使用Charles Proxy,当我点击特殊内容时,它会显示在您的其他页面上,它向http://www.toberua.com/~new/specials发出请求,但是在联系我们页面上,ajax请求转而http://www.toberua.com/~new/contact-us(当然,这是{{3}}不是json)

另一个有趣的说明: 其他页面上的XMLHttpRequest正确设置Accept标头(即Accept application/json, text/javascript, */*; q=0.01,而在contact-us页面上设置为Accept */*)。我敢打赌,有一个不同的代码分支被调用...