2011-09-23 77 views
6

我在更新ajax请求后未准备好的元素时遇到问题。ajax请求后准备好jQuery文档

如果我跑我myFunction()在页面加载功能,像这样:

$(function() { 
myFunction(); 
} 

我也完全没有问题。但如果我然后使用类似

$.ajax({ 
     url: this.href, 
     dataType: "script", 
     complete: function(xhr, status) { 
     myFunction(); 
     } 
    }); 

它返回$(".myElement").replaceWith("htmlHere")。完整的事件触发时,元素根本没有准备好。如果我在那里设置延迟,它会再次正常工作。

当DOM准备就绪时,是否还有其他事件被解雇?

更新:

下面是实际的代码:

$(function() { 
    $("a.remote").live("click", function(e) {  
    $.ajax({ 
     url: this.href, 
     dataType: "script", 
     success: function(xhr, status) { 
       myFunction(); 
      } 
    }); 

    e.preventDefault(); 
    return false; 
    }); 

    myFunction(); 
}); 

function myFunction() { 
    // Modify the dom in here 
} 

的缺失);只是我的一个错字。

我现在尝试使用成功,而不是完整的,它似乎没有任何区别。

+0

你的$就成功事件怎么办?在你的问题中是否应该提到一些功能? –

+1

你想把所有*代码放在一个大的$(function(){...});'handler中。这样,你永远不会有这样的问题......顺便说一句,这样做也会给你一个命名空间,无论如何你都需要它。 –

+0

我用更新后的代码更新了原始问题。 – Danny

回答

0
$(function() { 
myFunction(); 
} 

应该

$(document).ready(function() { 
myFunction(); 
}); 

或者柜面你想的AJAX对负载运行。不要

$(document).ready(function() { 
$.ajax(); 
}); 
+0

'$(function(){...})'是$(document).ready'的快捷方式。它只是缺少''''。 – pimvdb

+0

即便如此,上面的代码看起来像是他把dj ready事件之外的ajax。 –

4

您可以使用$(document).ready(function() { ... });包裹起来,你希望在DOM加载解雇任何东西。如果您希望此操作等待dom加载完成,您的ajax请求可以放在document.ready之内。

如果你想等到ajax加载它的资源,那么你应该使用ajax.success而不是complete

1

您缺少文档就绪包装函数的右括号。

$(function() { 
myFunction(); 
}); 

注意});在最后。

3

只要改变complete:success:在您的通话$.ajax():曾经的AJAX请求收到成功应答

$.ajax({ 
     url: this.href, 
     dataType: "script", 
     success: function(xhr, status) { 
     //make your DOM changes here 
     myFunction(); 
     } 
}); 

success功能将运行。因此,请在该功能内进行DOM更改,然后运行myFunction()

编辑
你似乎在试图使DOM改变使用myFunction()。但是,如果您没有首先将在AJAX响应中收到的HTML插入到DOM中,那么myFunction()将不会被修改。如果这确实发生了什么,那么你有两个选择:

  1. 插入HTML响应到DOM,然后调用myFunction()(而这一切应在success回调函数中发生)。
  2. 将AJAX响应作为参数传递给myFunction(),以便myFunction()可以处理DOM插入,然后执行必要的修改。
+0

我试过这个,但它似乎没有任何区别。 – Danny

+0

请参阅编辑我的回应。让我知道这是否有帮助。如果不是,请说明您将AJAX响应中的HTML插入到DOM中的哪个位置。 – maxedison

3

我已经根据您的代码设置了jsfiddle,它似乎正在工作。

这是当前的代码:

$(function() { 
    $("a.remote").live("click", function(e) {  
    $.ajax({ 
     url: this.href, 
     dataType: "script", 
     success: function(xhr, status) { 
       myFunction(); 
      } 
    }); 

    e.preventDefault(); 
    return false; 
    }); 

}); 

function myFunction() { 
    $("span").replaceWith("<p>test</p>"); 
} 

它取代span标记用一个段落。请检查它并与您的代码进行比较。如果它是相同的,那么你的问题在这个函数以外的地方(可能在myFunction中?)。

+1

+1因工作重现问题,当没有回复时,这是不切实际的。 – kovacsbv

1

在每次ajax调用后都会触发一个事件。它被称为ajaxComplete

$(document).ajaxComplete(function() { 
    $(".log").text("Triggered ajaxComplete handler."); 
}); 

这样你就可以

function Init(){ 
    // stuff here 
} 

$(document).ready(function() 
    Init(); 
}); 
$(document).ajaxComplete(function() 
    Init(); 
});