Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MVC局部视图在任何成功的Ajax请求后调用jQuery函数_Jquery_Ajax - Fatal编程技术网

如何使用MVC局部视图在任何成功的Ajax请求后调用jQuery函数

如何使用MVC局部视图在任何成功的Ajax请求后调用jQuery函数,jquery,ajax,Jquery,Ajax,我有jQuery代码,在渲染视图时运行良好。但是,我希望在Ajax请求成功后运行相同的代码。jQuery最初是在文档准备就绪时执行的,但我将其移动到了它自己的函数中,以便可以调用它。该函数向一些标签元素添加一些简单的类。以下是我到目前为止的情况: $(function () { afterLoad(); }); $.ajaxSetup({ success: function () { afterLoad(); } }); function afterL

我有jQuery代码,在渲染视图时运行良好。但是,我希望在Ajax请求成功后运行相同的代码。jQuery最初是在文档准备就绪时执行的,但我将其移动到了它自己的函数中,以便可以调用它。该函数向一些标签元素添加一些简单的类。以下是我到目前为止的情况:

$(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”。前者可以