我可以将所有JavaScript调用都置为$

时间:2010-05-11 02:22:06

标签: javascript jquery

我需要现有网站scripts.js内的一些脚本。

此网站已上网多年,我无法触及脚本文件。

我将其标准地包含在另一页中。脚本文件中有许多jQuery调用。我包含它的地方没有jQuery。

我想取消所有$()类型的内容。我试过这个......

$ = function() { };

在我加入scripts.js之前它似乎没有用。我仍然遇到像

这样的错误
  

$(文件)未定义

有没有办法取消所有这些jQuery调用?

由于

3 个答案:

答案 0 :(得分:2)

即使你确实这样做了,你仍然会遇到问题,因为代码是在假设存在jQuery的情况下编写的。是的,你可以在这样的行上避免$ is null or not defined错误:

$('div.foo');

只是写这一行没有意义:返回的对象总会有动作:

$('div.foo').html('blah');

在NOP jQuery函数之后,您将收到"html" is not a function错误,依此类推。你可以做到的唯一方法是填写每个可能的jQuery方法的框架,确保每个方法在适当时返回自己。

...或者只是正确地重写它......

答案 1 :(得分:1)

尝试

window.$ = function(selector, context) {alert('eating the calls to $');}
您在scripts.js文件之前包含的文件中的

。这是它在jquery中定义的方式,因此应该注意选择器语法。

您可能需要定义其他覆盖以满足$.method()类型调用

答案 2 :(得分:1)

嗯,$(document)未定义并不奇怪,因为您没有从占位符函数返回值。因此,$(document).ready(function(){});之类的东西自然会出错。

基本上,如果我理解正确,你需要$成为一个什么都不做的函数,并返回另一个调用任何成员函数什么都不做的对象。此外,$ self本身的成员函数(例如$.ajax())应具有相同的行为。

您可以使用__noSuchMethod__执行此操作,但不幸的是,这是非标准的:

window.$ = function()
{
    var doNothingObj = new (function() 
    {
        this.__noSuchMethod__ = function() 
        { 
            return doNothingObj; 
        } 
    })();
    return doNothingObj;
};
window.$.__noSuchMethod__ = window.$;

这将允许任意链:

$(document).ready(function(){});
$("#foo").animate().animate();
$.ajax({ url: "file.html"});

当然,一个更安全的解决方案是重构使用jQuery的代码。