我有一个 custom.js 文件,其中有几个元素绑定了 click 和其他方法。整个文件封装在 document.ready() 中,一切正常。但是,当我发布 AJAX 帖子时,显然 document.ready() 永远不会为当前页面再次触发。无论如何我可以让 document.ready() 再次触发,还是我需要让命名函数中的所有内容从我的 create.js.erb 中调用它们?
6 回答
您总是可以将所有内容放在一个函数中(名为 loadfunction 或其他),并在加载文档时调用该函数,并在加载 ajax 时再次调用。虽然它是一个组合在一起的解决方案,但它应该足够好用。
所以然后把所有的东西都放在它的$(document).onready(function () {
结尾括号之间,}
然后把它放在function OnloadFunction () {
结尾处}
。然后放$document.onready(OnloadFunction);
例子:你有
$(document).ready(function () {alert("test");});
它会变成:
function OnloadFunction ()
{
alert("test");
}
$(document).ready(OnloadFunction);
然后,您可以随时拨打电话OnloadFunction
。
结合 Ben 和 fotanus 的答案,我创建了以下模式:
$(document).ready(function () {
AjaxInit()
});
$(document).ajaxComplete(function () {
AjaxInit()
});
function AjaxInit() {
alert("test");
}
每次 ajax 调用后都会触发一个事件。它被称为ajaxComplete。
$( document ).ajaxComplete(function() {
$( ".log" ).text( "Triggered ajaxComplete handler." );
});
我已成功使用如下模式:
首先我们必须定义一个 .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 的所有痛苦。它允许我维护一组初始化例程,并专注于有趣的事情。
肯麦克的回答略有不同。无论出于何种原因,除非它嵌套在 document.ready 中,否则我的 ajaxComplete 不会触发。将它嵌套在里面并仍然呼唤对我有用。
$(document).ready(function () {
AjaxInit();
$(document).ajaxComplete(function () {
AjaxInit()
});
});
function AjaxInit() {
alert("test");
}
我使用了一些技巧。;) 所有代码都在文件(ajax)的加载部分内。我不使用 jquery ajax 加载的任何“成功”、“完成”等扩展功能。
首先,我们必须构建任何功能。例如:_autostart();
function _autostart() {
... all code here ....
}
在正文上,我们将粘贴在 ajax 加载结束时必须执行的所有 js 代码。
然后我们就通过时间触发器执行这个函数。;)
setTimeout("_autostart();",0000);
就这样。完毕。:)
当然,我们可以在ajax之后的html代码中的任何事件上使用js代码函数。例如:'onchange'、'onclick' 等。它也可以工作。:)