Ich entwickle eine App auf einer Seite, die jQuery 1.2.6 verwendet, aber ich würde gerne jQuery 1.4.2 für meine App verwenden. Ich mag es wirklich nicht, mehrere Versionen von jQuery wie diese zu verwenden, aber die Kopie auf der Seite (1.2.6) ist etwas, das ich nicht kontrollieren kann. Ich habe beschlossen, meinen Code wie folgt zu isolieren:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<script type="text/javascript" src="jquery-1.2.6.min.js>
<script type="text/javascript" src="pageStuff.js"></script>
</head>
<body>
Welcome to our page.
<div id="app">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="myStuff.js"></script>
</div>
</body></html>
Die Datei myStuff.js enthält meinen eigenen Code, der jQuery 1.4.2 verwenden soll, und er sieht wie folgt aus:
(function($) { //wrap everything in function to add ability to use $ var with noConflict
var jQuery = $;
//my code
})(jQuery.noConflict(true));
Dies ist eine stark vereinfachte Version, aber ich hoffe, Sie können sich vorstellen, was ich gemacht habe. Eine Zeit lang funktionierte alles gut. Ich beschloss jedoch, ein jQuery-Plugin in einer separaten Datei zu verwenden. Ich testete es und es verhielt sich komisch. Nach einigen Experimenten fand ich heraus, dass das Plugin die alte Version von jQuery verwendet, obwohl ich wollte, dass es die neue Version verwendet. Weiß jemand, wie man eine js-Datei aus dem Kontext innerhalb der Funktion, die den Code in myStuff.js umhüllt, importieren und ausführen kann?
Falls es jemanden interessiert, hier ist, woher ich weiß, dass das Plugin die alte Version verwendet, und was ich getan habe, um das Problem zu lösen: Ich habe eine Datei namens test.js erstellt, die aus dieser Zeile besteht:
alert($.fn.jquery);
Ich habe versucht, die Datei in einem Skript-Tag zu referenzieren, so wie externes Javascript normalerweise eingebunden wird, unterhalb von myStuff.js, und sie wurde als 1.2.6 angezeigt, wie ich erwartet hatte. Ich habe dann das Script-Tag entfernt und diese Zeile in myStuff.js eingefügt:
$.getScript("test.js");
und es kam immer noch als 1.2.6 zurück. Das war keine große Überraschung - laut Dokumentation von jQuery Skripte, die auf diese Weise eingebunden werden, werden im globalen Kontext ausgeführt. Ich habe dann versucht, dies stattdessen zu tun:
var testFn = $.proxy($.getScript, this);
testFn("test.js");
und es kam immer noch als 1.2.6 zurück. Nach einigem Herumprobieren habe ich herausgefunden, dass sich das Schlüsselwort "this" auf das Fenster bezieht, was vermutlich den globalen Kontext meint. Ich suche nach etwas, das ich anstelle von "this" einsetzen kann, um auf den Kontext der umschließenden Funktion zu verweisen, oder nach einer anderen Möglichkeit, den Code in der Datei von der umschließenden Funktion aus ausführen zu lassen. Ich habe bemerkt, dass es gut funktioniert, wenn ich den Code kopiere und einfüge, aber es ist ein großes Plugin, das an vielen Stellen verwendet wird, und ich würde es vorziehen, meine Datei nicht mit ihrem Code zu überladen. Mir sind die Ideen ausgegangen. Weiß jemand anders, wie man das macht?