【问题标题】:Can I/How to bind jQuery events to form element load when loading Rails partials?加载 Rails 部分时,我/如何绑定 jQuery 事件以形成元素加载?
【发布时间】:2010-12-10 17:29:12
【问题描述】:

我想在加载某个类的表单元素(特别是隐藏字段)时调用一个函数。这个:

$('.has_other').ready(function(){
    alert($(this).value);
});

在初始页面加载时工作正常,但是当我重新加载包含具有“has_other”类元素的表单部分时(用于使用相同表单编辑元素),该事件不会再次被调用。 jQuery 中有没有一种方法可以在所有加载隐藏字段时调用此函数,包括重新加载/加载现有页面中的部分内容?

提前致谢!

编辑:我在我的控制器中呈现这样的部分:

page.replace_html 'secondary_publication_entry', :partial => 'publications/form'

编辑2:这里是更具体的代码:

$j('.has_other_hidden').live('ready', function(){
    alert($j(this).value);
});

也试过

$j('.has_other_hidden').ready(function(){
    alert($j(this).value);
});

$j('.has_other_hidden :hidden').live('ready', function(){
    alert($j(this).value);
});

其中唯一会导致任何警报的是 .ready(),它不会在部分加载/重新加载时导致警报,这是我希望发生的。

我想我可以在重新加载每个部分时再次调用一个调用 ready() 的函数 - 不过我不确定如何执行此操作(从 rails 控制器调用 jquery 函数)。

感谢您的回答!

编辑 3: 我试过 live('load',...) 和 live('ready',...)。在这里都不工作:(

【问题讨论】:

  • 我不确定,但您是否尝试将代码放在部分代码中?每次新的部分加载时都应该调用它
  • 我不确定如何从我加载部分的 Rails 控制器调用 jQuery 函数...帮助?
  • 不,不是来自控制器,只是将你的 js 代码放在 partial 我从来没有使用过原型,但如果是 jquery.get,你可以将你的 js 代码放在 action.js.erb 中,所以如果你将您的代码放在部分中并从控制器渲染部分代码将被执行并且新对象(已添加部分)也将被更新

标签: javascript jquery ruby-on-rails ruby-on-rails-3


【解决方案1】:

尝试查看 jQuery 库的 live 方法。我认为这会奏效

$('.has_other').live('load', function(){
    alert($(this).value);
});

如果这不起作用,请尝试在重新加载该部分的 ajax 请求之后触发事件。

【讨论】:

  • 我应该提到我已经尝试过 live()。不幸的是,即使最初加载主表单,也没有任何反应。
  • live 是您正在寻找的解决方案,您能否使用 .live 发布您正在寻找的代码?另外,您是否完全删除了原型/添加了 jQuery noConflict?
  • 查看我的更新 - 在这种情况下我对 live() 没有运气。我认为 live 不适用于“ready”/“load”?
【解决方案2】:

这有点恶心,但如果live() 不起作用,您可以手动撤消并重做所有绑定。示例:

function bindMyStuff() {
  $('a').unbind('click');
  $('a').click(funciton() {
    alert("I've been clicked!");
  }
}

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

然后你的部分可以在脚本标签中调用bindMyStuff()

【讨论】:

  • 哦,伙计。首先,当我只定义一个 bindMyStuff() 函数时,我得到一个“处理程序未定义”错误。不幸的是,当我尝试添加 unbind 和 .load() 而不是 .click() 时,bindMyStuff 函数没有做任何事情。从我的部分调用外部函数可能是我需要进入的方向,谢谢你的想法!
  • 好的,我在想我可以将 live() 与 .load() 一起使用,以便在加载原始类的另一个元素时(例如部分加载)该函数将被调用。
  • @Sarah:您是否尝试取消绑定和重新绑定 .ready() 而不是 .load()?
  • .ready() 做到了!所以我想我的答案是a)从部分加载调用函数和b)取消绑定并重新绑定.ready()。有点乱,但我会看看它是否能让我到达我要去的地方。非常感谢!!
  • @Sarah:再想一想……如果 live() 不适用于 ready(),它可能应该。考虑检查这是否是 jQuery 中的已知错误,如果不是,请使用您可以提供的示例的最简化版本提交票证。为开源做贡献!
【解决方案3】:

此字段是否隐藏?如果是 $('.has_other') 只会返回可见的字段。

$('.has_other :hidden')

应该得到隐藏的元素。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多