在覆盖后恢复本机转义函数的方法?

时间:2010-06-24 06:13:23

标签: javascript

我不知道你能做到这一点,直到我在一个棘手的bug上碰到我的头撞墙,最后发现我们失败了因为一些jquery插件覆盖了逃生功能。所以这会提出一个警告和docwrite null:

escape = function(a){alert(a)}
document.write(escape("Need tips? Visit W3Schools!"));

酷! (不)。

有没有办法恢复本机转义功能?

3 个答案:

答案 0 :(得分:13)

创建一个iframe并从中获取函数:

function retrieveNative(native) {
  var iframe = document.createElement('iframe');
  document.body.appendChild(iframe);
  var retrieved = iframe.contentWindow[native];
  document.body.removeChild(iframe);
  return retrieved;
}

window.escape = retrieveNative('escape');

答案 1 :(得分:2)

扔掉那个插件,因为你不知道那里潜藏着什么邪恶。如果你不能这样做,那么最优的解决方案是在转义之前建立一个var关键字,这样它就不会泄漏到全局范围并保持在插件函数中。

$.fn.naughtyJQueryPlugin = function() {
    var escape = function() { .. };
};

<击> 如果你无法修改插件源代码,那么请在插件周围包装代码以保留对原始转义的引用,以便稍后修复。

var origEscape = escape;

$.fn.naughtyJQueryPlugin = function() {
    ...
};

escape = origEscape;

<击>


感谢@Tim指出,如果你可以包装插件源,这里有一个更强大的技术:

(function(escape) {
    $.fn.naughtyJQueryPlugin = function() {
        // any change to escape (not window.escape) will affect the parameter
        // we passed in the outer function to which we have a reference 
        // through a closure.
        // This avoids manipulating the plugin's source, and still have both
        // versions intact.
    };
})(escape); // pass the global escape as a parameter

// should call the global escape
escape("hello");

// when plugin is called, overridden escape should be called
$("div").naughtyJQueryPlugin("message");

参见示例here。这两个版本应该和平共存。

答案 2 :(得分:0)

如果您可以在插件之前添加代码 - 您可以“保存”原始功能:

oldescape = escape;
function fix() {
    escape = oldescape;
}