如何在不修改提供的rails.js的情况下覆盖Rails 3不显眼的javascript函数?

时间:2011-03-20 01:43:56

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

我的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.jsallowAction的来电包含在.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()函数。

3 个答案:

答案 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)?