Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何在不修改提供的Rails.js的情况下重写Rails 3不引人注目的javascript函数?_Jquery_Ruby On Rails 3_Overriding_Unobtrusive Javascript - Fatal编程技术网

Jquery 如何在不修改提供的Rails.js的情况下重写Rails 3不引人注目的javascript函数?

Jquery 如何在不修改提供的Rails.js的情况下重写Rails 3不引人注目的javascript函数?,jquery,ruby-on-rails-3,overriding,unobtrusive-javascript,Jquery,Ruby On Rails 3,Overriding,Unobtrusive Javascript,我的Javascript还没有达到标准,我正在努力覆盖所提供的rails.js中的函数 我想修改a[data confirm]的处理方式,使用jQuery UI模式对话,而不是普通的javascriptconfirm() rails.js中的相关函数是allowAction(元素)。如果我在另一个文件中定义了它,我可以从firebug控制台成功地调用它,但是rails.js版本仍然是从带有data confirm属性的锚点调用的 我认为这是因为整个rails.js文件被包装在: (functio

我的Javascript还没有达到标准,我正在努力覆盖所提供的
rails.js
中的函数

我想修改
a[data confirm]
的处理方式,使用jQuery UI模式对话,而不是普通的javascript
confirm()

rails.js
中的相关函数是
allowAction(元素)
。如果我在另一个文件中定义了它,我可以从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()
函数没有被调用。

像这样吗

//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;
*/
编辑:
函数上的作用域位于闭合作用域中。因此,您将无法按照自己的意愿对它们进行操作。

我刚刚检查了
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-generate-jquery:install
)?

仅供参考,我刚刚为rails-jquery-ujs添加了一个外部API,正是为了实现这类功能。现在,您可以通过插入(并重新写入)函数
$.rails.allowAction
使rails.js使用自定义确认方法

请参阅我的文章,以获取带有示例的完整解释

编辑:现在,从
确认
对话框功能可以用相同的方式覆盖。例如

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

运气不好,这和我试过的一样。更新了问题并提供了更多信息如果您正在重新定义click.rails事件,那么您就不能像原来那样调用handleRemote()和handleMethod()?这就是我所做的-复制并粘贴整个
.live
匿名函数,并用
myAllowAction
替换
allowAction
调用。当我试图在复制的代码中调用
handleRemote
handleMethod
函数时,它们没有定义。我不确定Ruby是如何工作的(我从未使用过)。所以我不确定我能帮上多少忙,但我认为你做不到。再加上范围已经关闭。你能详细说明一下“范围已经关闭”吗?它应该是独立于rails的——实际上它只是JS,但我将它标记为rails,以防任何使用此库的人以前都解决过这个问题。谢谢:)为了确认,您的
allowAction
函数与我的
rails.js
中的函数相同。我复制和粘贴的代码是事件处理程序,当单击链接时调用
allowAction
函数。更妙的是,我刚刚将
confirm
对话框移动到
$.rails
对象,因此使用其他确认对话框更容易。请参阅更新的答案。我想知道您将如何访问触发确认的元素,以便根据该元素自定义对话框?