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

发布于 2024-10-23 20:48:08 字数 1224 浏览 0 评论 0原文

我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

还给你自由 2024-10-30 20:48:08

仅供参考,我刚刚向 Rails jquery-ujs 添加了一个外部 API 来完成此类事情。现在,您可以通过插入(并重写 1 行)$.rails.allowAction 函数来使rails.js 使用自定义确认方法。

请参阅我的文章 Rails jQuery UJS:现在交互式,了解带有示例的完整解释。

编辑:现在,从此提交开始确认 可以用同样的方式覆盖对话框函数。例如

$.rails.confirm = function(message) { return myConfirmDialog(message); };

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.

$.rails.confirm = function(message) { return myConfirmDialog(message); };
舂唻埖巳落 2024-10-30 20:48:08

像这样?

//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;
*/

编辑:
函数的作用域处于封闭作用域内。所以你将无法按照你的意愿对它们采取行动。

Like this?

//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;
*/

EDIT:
The scope on the functions are in a closed scope. So you will be unable to act on them as you wish.

汹涌人海 2024-10-30 20:48:08

我刚刚检查了 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 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 the confirm() method is different than yours. Mine look a lot easier to replace:

function allowAction(element) {
    var message = element.data('confirm');
    return !message || (fire(element, 'confirm') && confirm(message));
}

Maybe you can upgrade your jquery-rails gem (and re-run rails generate jquery:install)?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文