覆盖核心 drupal JS 函数 要删除行为,我应该编辑属性,还是将覆盖函数留空?



我们有一个用例,我们需要阻止Drupal的核心ajax错误处理提醒用户(我们正在自己处理错误报告)。之前另一个开发人员注释掉了核心 ajax.js 文件中的一行,以防止 Drupal 生成警报框,但我想在不接触核心的情况下处理它。

从核心来看,drupal.js:

/**
* Displays a JavaScript error from an Ajax response when appropriate to do so.
*/
Drupal.displayAjaxError = function (message) {
// Skip displaying the message if the user deliberately aborted (for example,
// by reloading the page or navigating to a different page) while the Ajax
// request was still ongoing. See, for example, the discussion at
// http://stackoverflow.com/questions/699941/handle-ajax-error-when-a-user-
// clicks-refresh.
if (!Drupal.beforeUnloadCalled) {
alert(message);
}
};

我目前的解决方法是覆盖Drupal.displayAjaxError函数并更改确定是否提醒错误的Drupal.beforeUnloadCalled属性:

var ajax_error_backup = Drupal.displayAjaxError;
Drupal.displayAjaxError = function (message) {
Drupal.beforeUnloadCalled = true;
ajax_error_backup(message);
};

我的问题是,这是否是一个合适的解决方案?我知道我也可以覆盖该函数并将其留空 - 成本更少,并且不调用对原始函数的另一个调用(并通过在ajax_error_backup中备份原始函数来保存我创建的对象)。 我是在增加复杂性以保持整洁,还是应该覆盖:

Drupal.displayAjaxError = function (message) {
//empty
};

澄清一下 - 愿望是永远不要发生这个 ajax 警报,所以我希望保持整洁和只是用空白函数覆盖函数之间没有功能差异 - 没有希望这个警报成功的情况。

提前感谢您帮助这只老狗以新鲜的眼光思考一些事情。

在这种情况下,似乎没有一个选项明显优于另一个选项。它应该根据具体情况进行处理,在这种情况下,任何一种方法都足够了。

我个人选择使用稍微昂贵的方法来覆盖函数并将其召回,因为我觉得它可能更面向未来:

var ajax_error_backup = Drupal.displayAjaxError;
Drupal.displayAjaxError = function (message) {
Drupal.beforeUnloadCalled = true;
ajax_error_backup(message);
};

如果Drupal将来要扩展功能,可能会有另一个我们不想覆盖的条件。

用空函数覆盖是最便宜的,但也可能会有点沉重。

似乎这两种方法都是有效的,并且可能最好逐案处理。

最新更新