覆盖核心 Drupal JS 函数以删除行为,我应该编辑 属性,还是将覆盖函数留空?
Overriding Core Drupal JS Function To Remove Behavior, Should I Edit Property, Or Leave Override Function Empty?
我们有一个用例,我们需要阻止 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
//
// 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 警报发生,所以我想保留东西 neat/tidy 和只是用一个空白的函数覆盖函数之间没有功能上的区别——没有希望此警报成功的情况。
在此先感谢您帮助这只老狗用新鲜的眼光思考问题。
在这种情况下,似乎没有一个选项明显优于另一个选项。应该具体情况具体处理,在这种情况下,这两种方法都可以。
我个人选择了覆盖函数再回调的稍微昂贵的方法,因为我觉得这样可能会多一些future-proof:
var ajax_error_backup = Drupal.displayAjaxError;
Drupal.displayAjaxError = function (message) {
Drupal.beforeUnloadCalled = true;
ajax_error_backup(message);
};
如果 Drupal 将来要在其端扩展该功能,可能会有另一个我们不想覆盖的条件。
用空函数覆盖是最便宜的,但也可能有点笨拙。
似乎这两种方法都是有效的,并且可能是最好的处理方式 case-by-case。
我们有一个用例,我们需要阻止 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
//
// 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 警报发生,所以我想保留东西 neat/tidy 和只是用一个空白的函数覆盖函数之间没有功能上的区别——没有希望此警报成功的情况。
在此先感谢您帮助这只老狗用新鲜的眼光思考问题。
在这种情况下,似乎没有一个选项明显优于另一个选项。应该具体情况具体处理,在这种情况下,这两种方法都可以。
我个人选择了覆盖函数再回调的稍微昂贵的方法,因为我觉得这样可能会多一些future-proof:
var ajax_error_backup = Drupal.displayAjaxError;
Drupal.displayAjaxError = function (message) {
Drupal.beforeUnloadCalled = true;
ajax_error_backup(message);
};
如果 Drupal 将来要在其端扩展该功能,可能会有另一个我们不想覆盖的条件。
用空函数覆盖是最便宜的,但也可能有点笨拙。
似乎这两种方法都是有效的,并且可能是最好的处理方式 case-by-case。