在ajax post之后执行document.ready

时间:2011-04-10 07:20:13

标签: jquery ajax ruby-on-rails-3 post document-ready

我有一个custom.js文件,其中有几个元素,其中包含click和其他绑定方法。整个文件封装在document.ready()中,一切正常。但是,当我做一个AJAX帖子时,显然document.ready()永远不会再为当前页面触发。无论如何我可以再次触发document.ready()或者我需要让命名函数中的所有内容从我的create.js.erb中调用它们吗?

6 个答案:

答案 0 :(得分:35)

您可以随时将所有内容放在一个函数中(命名为loadfunction或其他内容),并在文档加载时调用该函数,并在加载ajax时再次调用该函数。虽然它是一个被黑客攻击的解决方案,但它应该可以运行得很好。

然后在$(document).onready(function () {及其结束括号}之间取一切 并将其放在以function OnloadFunction () {结尾的}中。 然后放$document.onready(OnloadFunction);

实施例:

$(document).ready(function () {alert("test");});

它会变成:

function OnloadFunction ()
{
    alert("test");
}
$(document).ready(OnloadFunction);

然后,您可以随时拨打OnloadFunction

答案 1 :(得分:18)

结合Ben和fotanus'我创建了以下模式:



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

$(document).ajaxComplete(function () {
    AjaxInit()
});

function AjaxInit() {
    alert("test");
}




答案 2 :(得分:17)

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

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

答案 3 :(得分:2)

我成功使用了以下模式:

首先我们必须定义一个.query()插件。

// jQuery.fn.query() emulates the behavior of .querySelectorAll() 
// by allowing a full/complex selector to be matched against
//a small slice of the dom. 
$.fn.query = function ( selector ) {
    var scopeElms = this,
        scopeIsDoc = scopeElms.length === 1  &&  scopeElms.is('html') ,
        // check for obviously simple selectors.... (needs more elegance)
        isComplexSelector = /\s/.test( selector.replace(/\s*([|~*$\^!]?=|,)\s*/g, '$1') ),
        elms;
    if ( scopeIsDoc  ||  isComplexSelector )
    {
      elms = $(selector);
      if ( scopeElms[0] )
      {
        elms = elms.filter(function(){
            var i = scopeElms.length;
            while (i--) {
              if ( scopeElms[i] === this || $.contains(scopeElms[i], this) )
              {
                return true;
              }
            }
            return false;
          });
      }
    }
    else
    {
      elms =  scopeElms.filter( selector )
                  .add( scopeElms.find(selector) );
    }
    return $(elms);
  };

然后我们编写init函数并将其绑定到“ready”事件,并将其绑定到我们的自定义“domupdated”事件。在init函数中,我们使用.query()从整个文档或仅更新的片段中查找元素......

// Here we define our DOM initializations
$(document).bind('ready domupdated', function (e, updatedFragment) {
    var root = $( updatedFragment || 'html' );

    // Begin imaginary initialization routines
    root.query('form').validate();
    root.query('.sidebar .searchform input#search').autocomplete();
    // etc...

  });

然后每当我们将新元素块注入DOM时(比如Ajax请求完成时),我们就会触发domupdated事件并将更新的DOM片段作为参数传递 - 如下所示:

...
var ajaxedDom = $(xhr.resultText).find('#message');
ajaxedDom.appendTo( '#modal' );

$(document).trigger('domupdated', [ajaxedDom]);

对我来说,这个设置可以解决启动DOM的所有麻烦。它允许我维护一组初始化例程,并专注于有趣的事情。

答案 4 :(得分:0)

我使用了一些技巧。 ;) 所有代码都在文件的加载部分(ajax)中。 我没有使用任何成功'完成'等等。扩展了jquery ajax load的函数。

首先我们必须建立任何功能。 例如:_autostart();

function _autostart() {

  ... all code here ....

}

在正文中,我们将粘贴所有js代码,以便在ajax加载结束时执行。

然后我们只是通过时间触发执行此功能。 ;)

setTimeout("_autostart();",0000);

这就是全部。完成。 :)

当然我们可以在ajax之后的html代码中的任何事件上使用js代码函数。 例如:' onchange',' onclick'等。 它的工作也是如此。 :)

答案 5 :(得分:0)

对Ken Mc的回答略有改动。无论出于何种原因,除非将ajaxComplete嵌套在document.ready中,否则它不会触发。将其嵌套在里面,仍然呼唤对我有用。

mpg <- mpg %>%
    distinct(model, year, .keep_all = TRUE)

ggplot(mpg, aes(x=year, y=hwy))+
    geom_point()+
    facet_wrap(~model) + theme(aspect.ratio=2)