如何在不修改提供的 Rails.js 的情况下覆盖 Rails 3 不显眼的 javascript 函数?
我的 Javascript 不太符合要求,我正在努力重写提供的 rails.js
中的函数。
我想修改 a[data-confirm]
的处理方式,使用 jQuery UI 模式对话而不是普通的 javascript confirm()
。
Rails.js 中的相关函数是allowAction(element)。如果我在另一个文件中定义它,我可以从 firebug 控制台成功调用它,但仍从具有 data-confirm
属性的锚点调用 rails.js
版本。
我认为这是因为整个 rails.js
文件包含在:
(function($) {
...
})( jQuery );
是否有一种明智的方法来重写此函数,无需修改提供的 rails.js?
编辑:
rails.js
中对 allowAction
的调用包含在 .live
调用中:
$('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) {
var link = $(this);
if (!allowAction(link)) return false;
if (link.attr('data-remote')) {
handleRemote(link);
return false;
} else if (link.attr('data-method')) {
handleMethod(link);
return false;
}
});
我也尝试过包括我的 javascript 在 rails.js
之前和之后都无济于事。
编辑:
因此,如果我调用 .die('click.rails')
我可以重新定义整个 click.rails
事件,但是原始 handleRemote()
和 handleMethod()
函数不会被调用。
My Javascript isn't quite up to scratch and I'm struggling to override a function in the supplied rails.js
.
I want to modify the way that a[data-confirm]
are handled, using a jQuery UI modal dialogue rather than the vanilla javascript confirm()
.
The relevant function in rails.js
is allowAction(element)
. If I define this in another file, I can call it from the firebug console successfully, but the rails.js
version is still called from anchors with a data-confirm
attribute.
I think it's because the whole rails.js
file is wrapped in:
(function($) {
...
})( jQuery );
Is there a sensible way to override this function, without modifying the supplied rails.js
?
Edit:
The call in rails.js
to allowAction
is wrapped in a .live
call:
$('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) {
var link = $(this);
if (!allowAction(link)) return false;
if (link.attr('data-remote')) {
handleRemote(link);
return false;
} else if (link.attr('data-method')) {
handleMethod(link);
return false;
}
});
I also tried including my javascript before and after the rails.js
, to no avail.
Edit:
So, if I call .die('click.rails')
I can then redefine the entire click.rails
event, but the original handleRemote()
and handleMethod()
functions are not called.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
仅供参考,我刚刚向 Rails jquery-ujs 添加了一个外部 API 来完成此类事情。现在,您可以通过插入(并重写 1 行)
$.rails.allowAction
函数来使rails.js 使用自定义确认方法。请参阅我的文章 Rails jQuery UJS:现在交互式,了解带有示例的完整解释。
编辑:现在,从此提交开始
确认
可以用同样的方式覆盖对话框函数。例如FYI, I just added an external API to the Rails jquery-ujs for exactly this sort of thing. You can now make rails.js use a custom confirm method by plugging into (and re-writing 1 line of) the
$.rails.allowAction
function.See my article, Rails jQuery UJS: Now Interactive, for a full explanation with examples.
EDIT: And now, as of this commit the
confirm
dialog function can be overridden in the same way. E.g.像这样?
编辑:
函数的作用域处于封闭作用域内。所以你将无法按照你的意愿对它们采取行动。
Like this?
EDIT:
The scope on the functions are in a closed scope. So you will be unable to act on them as you wish.
我刚刚检查了
rails.js
代码(我使用的是 Rails 3.0.3 和 jquery-rails 0.2.7),以及它调用confirm()
的点方法和你的不一样。我的看起来更容易替换:也许你可以升级你的
jquery-rails
gem(并重新运行rails生成jquery:install
)?I just checked the
rails.js
code (I'm using Rails 3.0.3 and jquery-rails 0.2.7), and the point where it calls theconfirm()
method is different than yours. Mine look a lot easier to replace:Maybe you can upgrade your
jquery-rails
gem (and re-runrails generate jquery:install
)?