如何使用MVC局部视图在任何成功的Ajax请求后调用jQuery函数
我有jQuery代码,在渲染视图时运行良好。但是,我希望在Ajax请求成功后运行相同的代码。jQuery最初是在文档准备就绪时执行的,但我将其移动到了它自己的函数中,以便可以调用它。该函数向一些标签元素添加一些简单的类。以下是我到目前为止的情况:如何使用MVC局部视图在任何成功的Ajax请求后调用jQuery函数,jquery,ajax,Jquery,Ajax,我有jQuery代码,在渲染视图时运行良好。但是,我希望在Ajax请求成功后运行相同的代码。jQuery最初是在文档准备就绪时执行的,但我将其移动到了它自己的函数中,以便可以调用它。该函数向一些标签元素添加一些简单的类。以下是我到目前为止的情况: $(function () { afterLoad(); }); $.ajaxSetup({ success: function () { afterLoad(); } }); function afterL
$(function () {
afterLoad();
});
$.ajaxSetup({
success: function () {
afterLoad();
}
});
function afterLoad() {
// code to execute
}
发出一个简单的Ajax请求后,这不会正确执行:
$('#ajaxTest').load('<MVC Route>')
$('ajaxTest')。加载(“”)
部分视图返回得很好,但是afterLoad()
尝试在部分视图进入DOM之前运行。如果我再次执行相同的调用,afterLoad()
确实会运行(在以前的部分视图上),但是它会被新的部分视图覆盖
有什么想法吗?另一种方法很好,我正在寻找一种方法,就是在Ajax请求部分视图后运行站点级别的.js文件。母版页加载site.js文件,我希望在不重新加载文件的情况下执行其代码(因为浏览器已经加载了该文件)。另外,我不想强迫开发人员对Ajax调用做任何不同的操作,因此它需要使用一个简单的
.load()
,等等。您可以在jQuery中设置全局Ajax默认值
像这样
$.ajaxComplete(function(){
afterLoad();
});
因此,当ajaxCompleted时将执行您的方法。如果我没有看错您的问题,那么问题是您试图在ajax调用之后,但在将部分视图元素添加到DOM之前发出“后加载”。在这种情况下,我认为您需要调用afterLoad作为ajax加载方法的一部分:
$('#ajaxTest').load('<MVC Route>', null,
function (responseText, textStatus, XMLHttpRequest)
{
afterLoad();
});
$('#ajaxTest')。加载('',null,
函数(responseText、textStatus、XMLHttpRequest)
{
后负荷();
});
如果我不在基地,让我知道,快乐编码 这是我用来做你想做的事的: 如果需要访问XHR对象,您还可以访问它
//Global Ajax Complete
$("body").bind("ajaxSend", function(e, xhr, settings){
//Sent
}).bind("ajaxComplete", function(e, xhr, settings){
//Complete
}).bind("ajaxError", function(e, xhr, settings, thrownError){
//Error
});
编辑:
这就是我一直在为我工作的结构
site.js
function afterLoad() {
// code to execute
}
$(document).ready(function(){
$("body").bind("ajaxComplete", function(e, xhr, settings){
afterLoad();
});
});
创建了一个快速的。这就是你的意思吗
编辑两个:
您可能希望在DOM上为出现的任何
元素设置一个侦听器,然后运行afterLoad()
函数。这可能是一个性能猪,所以我会小心使用它
我过去经常这样做
$('form').livequery(function(){
afterLoad();
});
卸下AJAX安装部件
$.ajaxSetup({
/* success: function () {
afterLoad();
}*/
});
然后像这样使用load
:
$('#ajaxTest').load('<MVC Route>', function(){
afterLoad();
});
$('#ajaxTest')。加载('',函数(){
后负荷();
});
根据,这应该行得通。罪魁祸首是这个
$.ajaxSetup({
success: function () {
afterLoad();
}
});
load
在内部使用$。get
获取数据,当它调用成功处理程序时,甚至在将数据设置到元素中之前都会调用afterLoad
方法。您可能必须使用其他方法,但这不起作用
试试这个
$.ajaxSetup({
complete: function () {
afterLoad();
}
});
以上的答案对我来说并不适用。我浪费了很多时间想明白,但都是徒劳的。最后,我得到了一个解决方案,虽然有点不寻常。给你。基本上,我是在从AJAX附加DOM元素之后重新分配事件处理程序的
function autoLoad(){
//write event handlers which you are again going to assign to the ajax appended dom elements
}
$(document).ready(function(){
autoLoad;
//more event handlers if present (non dynamic DOM elements)
//Any other Jquery stuff
});
$.ajax({
//send request here
}).done(function(html) {
//unbind the event handlers assigned in autoload function
append ajax results here
autoLoad();
}).fail(function(ts) {
});
这对我来说很好:
$( document ).ajaxComplete(function( event,request, settings ) {
//your code here to run when ajax is complete
alert("Complete");
});
这就给了我一个错误:
uncaughttypeerror:Object函数(a,b){return new d.fn.init(a,b,g)}没有方法'ajaxComplete'
@Brandon so do$(document)ajaxComplete
binding中的
。它根本就没有进入那个完整的函数吗?在$(document).ready()中有绑定吗?我假设afterLoad函数是在ajax完成之前定义的。正确,并且它没有命中afterLoad()
。我在Chrome中的函数中有一个断点,每当加载完整视图时,该断点就会出现。在我在文章中提到的情况下,$(文档).ready()中没有其他内容
.hmm..很有趣…我快速地更新了答案。也许我不明白我有一个简单的jQuery函数,它可以在表单上找到所需的输入字段,然后找到相关的标签并添加一个CSS类,这样所需的字段就会突出显示给用户。在site.js文件中,这在每个页面上都可以正常工作。但是,如果e user单击一个按钮,该按钮通过Ajax打开一个弹出窗口,上面有另一个表单,site.js不会重新加载(根据需要)从部分视图,但我仍然希望函数将类添加到所需的标签中。这也有其他用途,例如在Ajax请求后加载淘汰函数。该函数是不正确的…它在Ajax调用之后和部分视图在DOM中之前执行。我希望它等到它们在DOM中,以便'受影响。:)在将获取的数据输入DOM后,我还必须全局处理运行函数的其他哪些选项?请尝试使用完整回调,检查我编辑的答案,谢谢。我在OP中没有提到它,但我尝试过;使用complete不会触发后加载()一点也不。我觉得这很奇怪。根据。.load应该对您有效。但我看到另一条评论,您提到它不起作用。您的呼叫是否成功返回?是的,呼叫总是返回部分视图;.load()
工作正常。我只是想找到一种方法,在部分视图进入DOM后,运行父视图已经加载的jQuery。@布兰登:您是否仍然有ajaxSetup
代码?删除它,然后尝试我的更新。这当然行得通。唯一的问题是,我想找到一种方法,让开发人员的使用我正在使用的框架,您不需要知道“嘿,每当我调用Ajax时,我也需要调用此函数。”我希望将其自动化。您的实际需求是“不在Ajax上完成”,而是“在Ajax完成后加载dom”。前者可以