Jquery:live('load',...)或live('ready',...)不适用于加载ajax的元素!怎么办?

时间:2011-10-21 18:33:14

标签: ruby-on-rails ajax jquery

假设:

1)我已完全加载html页面

2)我点击链接向Rails发送GET请求

3)Rails的答案是一个小部分有一些标签(fx。选择国家)我应用jquery插件SelectMenu(或任何其他Jquery UI插件)调用"$(myselect).selectmenu()",这使我的原始看起来更好。 / p>

想要我的部分不包含Jquery代码,我想在js文件中的某处放置“$(myselect).selectmenu()”并以某种方式将它附加到我的select元素。

我尝试了"$(myselect).live('load',function(){...})""$(myselect).load()"...但是正如文档所说,它仅适用于具有网址的元素。 'ready'事件仅适用于主页加载。

1)我不想在我的ajaxy加载部分包含这个js文件,但是它包含在加载的主页面中。

2)我不想在jQuery.ajax'成功'回调中加入"$(myselect).selectmenu()"作为一些SO主题的答案建议。

live()适用于“更改”或“点击”等事件,但我无法根据自己的需要找到合适的事件。 “准备好”和“加载”事件不起作用。

是否有一些常见的做法可以达到"live('load',...)"效果?

3 个答案:

答案 0 :(得分:1)

我处理此问题的方法是将live()事件添加到您自己创建的自定义触发器中。然后,当ajax响应请求时,只需使用.triggerHandler()讨论的here来触发该自定义触发器。这意味着您的所有ajax必须包含triggerHandler()代码。它并不理想,但它处理的是缺少所有元素类型的load()函数。

答案 1 :(得分:0)

只需在GET回调中执行$(myselect).selectmenu()即可。在默认条件下,只有在GET成功时才会发生。

编辑:

我被提醒OP明确表示他不想在AJAX回调中包含上述代码。我认为这是最好的方法,但如果禁止的话,让我采取另一种方法:

大多数元素都没有“onload”事件。 jQuery只识别它images, scripts, frames, iframes, and the window object.所以没有什么可以绑定的。除了回调之外,你真的没有优雅的方法来确定加载新内容的成功。

因此,您唯一的选择是使用setInterval设置循环,检查您的内容是否已添加,并在此时运行selectmenu()。像这样:

window.loadingmyselect = setInterval(function () {
        if ($(myselect).length) {
            clearInterval(window.loadingmyselect);
            $(myselect).selectmenu();
            …
        }
    }, 300 /* or whatever */);

当然,这是一种令人讨厌的方法,但只有你知道OP为什么必要的真正原因。

答案 2 :(得分:-2)

将此代码添加到您的请求的成功回调中。