【问题标题】:Call function after ajax load?ajax加载后调用函数?
【发布时间】:2015-09-16 08:07:19
【问题描述】:

我有一个 ajax 函数,当我点击它时会触发它。

$(document).ready(function(){

    $.ajaxSetup({cache:false});
    $(".post-link").click(function(){
        var post_link = $(this).attr("href");
        $("#main-content").fadeIn(500);
        $("#single-post-container").html('<img src="image.png">');
        $("#single-post-container").load(post_link);
                        return false;
    });          
});

但是在我触发它之后,我想调用一个新函数。 jQuery 中用于幻灯片放映的函数。我谷歌了很多,我看到如果你把新功能放在 ajax 的“成功:”部分它会起作用。但我的没有成功部分?我明白如果我让你发笑,我就是业余爱好者!哈哈。但是,如果您需要更多信息,请告诉我。

谢谢!

(我要添加的功能是这样的:)

$(function(){


var width = 600;
var animationSpeed = 1000;
var pause = 3000;
var currentSlide = 1;


var $slider = $("#slider");
var $slideContainer = $(".slides");
var $slides = $(".slide");
var $toggleRight = $("#right");
var $toggleLeft = $("#left");


$toggleRight.click(function(){
    $slideContainer.animate({'margin-left': '-='+width}, animationSpeed,     function(){
        currentSlide++;
        if (currentSlide === $slides.length) {
            currentSlide = 1;
            $slideContainer.css('margin-left', 0);
        }
    });
});

$toggleLeft.click(function(){
    if (currentSlide === 1) {
        currentSlide = $slides.length;
        $slideContainer.css({'margin-left': '-'+width*($slides.length-1)+'px'});
        $slideContainer.animate({'margin-left': '+='+width}, animationSpeed, function() {
            currentSlide--;
        });
    } else {
        $slideContainer.animate({'margin-left': '+='+width}, animationSpeed, function(){
            currentSlide--;
        });
    }
});




});

【问题讨论】:

    标签: javascript jquery ajax wordpress


    【解决方案1】:

    您可以在 .loadcallback function 中调用您的新函数。例如:

    $("#single-post-container").load(post_link,function(){
        //Call new function here
    });
    

    回调函数

    如果提供了“完成”回调,它会在之后执行 已执行后处理和HTML 插入。回调 为jQuery 集合中的每个元素触发一次,这是 依次设置为每个DOM 元素。

    您还可以使用callback function 中的status 参数检查负载是success 还是failed,如下所示:

    $("#single-post-container").load(post_link,function( response, status, xhr ) {
      if (status == "error" ) {
        var msg = "Sorry but there was an error: ";
        $( "#error" ).html( msg + xhr.status + " " + xhr.statusText );
      }
      else
      {
         //Call new function
      }
    });
    

    【讨论】:

    • 感谢您的回复!再看我的问题,我加了功能!
    • function 一个名字并在 load @Snik1 之后调用它
    • 非常感谢,但问题是当我现在这样做时,当我点击 .post-link 时页面会重定向...有什么建议吗?
    • $(".post-link").click(function(e){e.preventDefault() //other codes as it its }) @Snik1 阻止默认操作...
    • 所以在我的 JS 中,我将所有的新函数都放在了 ** function myNewFunction(){ //HERE } ** 并在加载后调用它?
    【解决方案2】:

    documentation 中所述:“当检测到成功响应时(即当 textStatus 为“成功”或“未修改”时)”

    $(document).ready(function(){
    
        $.ajaxSetup({cache:false});
        $(".post-link").click(function(){
            var post_link = $(this).attr("href");
            $("#main-content").fadeIn(500);
            $("#single-post-container").html('<img src="image.png">');
            $("#single-post-container").load(post_link, 
             function (responseText, textStatus, XMLHttpRequest) {
                if (textStatus == "success") {
                  // all good!
                }
                if (textStatus == "error") {
                  // oh noes!
                });
                                return false;
             });          
     });
    

    【讨论】:

    • 感谢您的回复!再看我的问题,我加了功能!
    【解决方案3】:

    问题是加载是异步的。该函数调用在 AJAX 请求完成之前返回。如果有代码需要在请求完成后执行,则需要使用完成/成功回调。

    More Info

    你可以这样做。

    $(document).ready(function(){
    
    $.ajaxSetup({cache:false});
    $(".post-link").click(function(){
        var post_link = $(this).attr("href");
        $("#main-content").fadeIn(500);
        $("#single-post-container").html('<img src="image.png">');
        $("#single-post-container").load(post_link, function( response, status, xhr ) {
       if(status=="success"){
    
         var width = 600;
         var animationSpeed = 1000;
         var pause = 3000;
         var currentSlide = 1;
    
    
         var $slider = $("#slider");
         var $slideContainer = $(".slides");
         var $slides = $(".slide");
         var $toggleRight = $("#right");
         var $toggleLeft = $("#left");
    
    
        $toggleRight.click(function(){
        $slideContainer.animate({'margin-left': '-='+width}, animationSpeed, function(){
        currentSlide++;
        if (currentSlide === $slides.length) {
            currentSlide = 1;
            $slideContainer.css('margin-left', 0);
        }
    });
    });
    
       $toggleLeft.click(function(){
    if (currentSlide === 1) {
        currentSlide = $slides.length;
        $slideContainer.css({'margin-left': '-'+width*($slides.length-1)+'px'});
        $slideContainer.animate({'margin-left': '+='+width}, animationSpeed, function() {
            currentSlide--;
        });
    } else {
        $slideContainer.animate({'margin-left': '+='+width}, animationSpeed, function(){
            currentSlide--;
        });
            }
         });
    
         }
          if ( status == "error" ) {
            var msg = "Sorry but there was an error: ";
            $( "#error" ).html( msg + xhr.status + " " + xhr.statusText );
          }
                        return false;
       });          
    });
    

    【讨论】:

    • 感谢您的回复!再看我的问题,我加了功能!
    • 查看编辑后的答案。但这将是您问题的快速解决方案。我建议您阅读更多关于 JavaScript 模式/实践的内容。例如:您可以将其作为一个单独的函数并在成功内调用它。
    • 非常感谢,但问题是当我现在这样做时,当我点击 .post-link 时页面会重定向...有什么建议吗?
    • 加载的正常行为是从服务器加载数据并将返回的 HTML 放入匹配的元素中。所以根据你的场景,它应该用内容替换#single-post-container div。
    猜你喜欢
    • 2013-09-11
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多