我的Javascript还不太准确,我正在努力覆盖提供的rails.js
中的函数。
我想使用jQuery UI模式对话而不是vanilla javascript a[data-confirm]
来修改处理confirm()
的方式。
rails.js
中的相关功能是allowAction(element)
。如果我在另一个文件中定义它,我可以成功从firebug控制台调用它,但仍然从具有rails.js
属性的锚点调用data-confirm
版本。
我认为这是因为整个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;
}
});
我也尝试在rails.js
之前和之后加入我的javascript,但无济于事。
修改
因此,如果我致电.die('click.rails')
,我可以重新定义整个click.rails
事件,但不会调用原始的handleRemote()
和handleMethod()
函数。
答案 0 :(得分:7)
仅供参考,我刚刚在Rails jquery-ujs中添加了一个外部API,正是为了这类。您现在可以通过插入(并重写1行)$.rails.allowAction
函数来使rails.js使用自定义确认方法。
请参阅我的文章Rails jQuery UJS: Now Interactive,获取有关示例的完整说明。
编辑:现在,从this commit开始,confirm
对话框功能可以用同样的方式覆盖。 E.g。
$.rails.confirm = function(message) { return myConfirmDialog(message); };
答案 1 :(得分:1)
喜欢这个吗?
//Backup our original function just in case
var backupFunc = allowAction;
//Your replacement function
var myFunc = function(element){
//Have it your way, badabababa :)
};
//Override default 'allowAction' function
allowAction = myFunc;
/*
Restore it the way it was before: allowAction = backupFunc;
*/
修改强> 功能范围在封闭范围内。因此,您将无法按照自己的意愿对其采取行动。
答案 2 :(得分:0)
我刚检查了rails.js
代码(我正在使用Rails 3.0.3和jquery-rails 0.2.7),它调用confirm()
方法的点与你的不同。我看起来更容易更换:
function allowAction(element) {
var message = element.data('confirm');
return !message || (fire(element, 'confirm') && confirm(message));
}
也许你可以升级你的jquery-rails
宝石(并重新运行rails generate jquery:install
)?