我不知道你能做到这一点,直到我在一个棘手的bug上碰到我的头撞墙,最后发现我们失败了因为一些jquery插件覆盖了逃生功能。所以这会提出一个警告和docwrite null:
escape = function(a){alert(a)}
document.write(escape("Need tips? Visit W3Schools!"));
酷! (不)。
有没有办法恢复本机转义功能?
答案 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;
}