2011-03-20 3 views
2

Мой Javascript не совсем до нуля, и я изо всех сил пытаюсь переопределить функцию в поставляемом rails.js.Как я могу переопределить функции ненавязчивого javascript Rails 3 без изменения поставляемого rails.js?

Я хочу изменить способ обработки a[data-confirm] с использованием модального диалога jQuery UI, а не ванильного javascript confirm().

Соответствующая функция в rails.js: allowAction(element). Если я определяю это в другом файле, я могу вызвать его из консоли firebug успешно, но версия rails.js по-прежнему вызывается из привязок с атрибутом data-confirm.

Я думаю, это потому, что все rails.js файл упаковывается в:

(function($) { 
... 
})(jQuery); 

Есть ли разумный способ отключить эту функцию, без модифицирующих прилагаемого rails.js?

Edit:

Звонок в 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, но безрезультатно.

Edit:

Так что, если я называю .die('click.rails') я могу затем переопределить все click.rails событие, но оригинальная handleRemote() и handleMethod() функции не называется.

ответ

7

FYI, я просто добавил внешний API для Rails jquery-ujs для такого рода вещей. Теперь вы можете сделать rails.js, используя специальный метод подтверждения, подключив (и переписав 1 строку) функцию $.rails.allowAction.

См. Мою статью, Rails jQuery UJS: Now Interactive, для полного объяснения примерами.

EDIT: И теперь, начиная с this commit, функция диалога confirm может быть переопределена таким же образом. Например.

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

Только что увидел это в Hacker News - хорошая работа! – nfm

+0

Еще лучше, я только что перевел диалог 'confirm' в объект' $ .rails', поэтому еще проще использовать другой диалог подтверждения. См. Обновленный ответ. – jangosteve

+0

Мне было интересно, как вы собираетесь получить доступ к элементу, который вызвал подтверждение, чтобы вы могли настроить диалог на основе этого? –

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

РЕДАКТИРОВАТЬ: Область на функции находятся в закрытом объеме. Таким образом, вы не сможете действовать по своему усмотрению.

+0

Не повезло, что ведет себя так же, как и то, что я пытался. Обновленный вопрос с дополнительной информацией – nfm

+0

Если вы переопределяете событие click.rails, то не можете ли вы сделать его так же, как оригинал, чтобы вызывали handleRemote() и handleMethod() *? – mattsven

+0

Вот что я сделал - скопировал и вставил всю анонимную функцию .live' и заменил вызов 'allowAction'' myAllowAction'. Функции 'handleRemote' и' handleMethod' не были определены, когда я попытался вызвать их в скопированном коде. – nfm

0

Я только что проверил код rails.js (я использую Rails 3.0.3 и jquery-rails 0.2.7), а точка, где он вызывает метод confirm(), отличается от вашего. Mine выглядеть намного проще заменить:

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

Может быть, вы можете обновить jquery-rails камень (и повторно запустить rails generate jquery:install)?

+0

Чтобы подтвердить, ваша функция 'allowAction' является тем же, что и в моем' rails.js'. Код, который я скопировал и вставил, является обработчиком события, который вызывает функцию 'allowAction' при щелчке ссылки. – nfm

 Смежные вопросы

  • Нет связанных вопросов^_^