2010-08-01 13 views
12

Ich bin Affe-Patching einige der Dragable Code jQuery *.Überschreiben Sie "private" -Funktion in JavaScript

Ziel ist es, die ursprünglichen Quelldateien nicht zu verändern und dynamisch eine der internen Funktionen zu patchen.

Die Funktion _generatePosition wird wie folgt erklärt:

(function($) { 

    $.widget("ui.draggable", $.ui.mouse, { 
     ... 
     _generatePosition: function(event) { 
      ... 
     } 
    } 
})(jQuery); 

Ist es möglich, den dynamischen Austausch von ihm zu erreichen?


* So sie das Einschnappen grid relativ zu der Oberseite des Elternelements berechnet und nicht in Bezug auf die Oberseite des Elementes gezogen wird. Weitere Informationen finden Sie unter here.

Antwort

11

können Sie einzelne Instanzen manipulieren:

.draggable().data("draggable")._generatePosition = function() {}; 

oder den Prototyp ändern, um alle Instanzen zu beeinflussen:

$.ui.draggable.prototype._generatePosition = function() {}; 
+0

Modifizieren Prototyp ist definitiv ein Sieg über .data(), danke! – Art

+1

Ich mochte eigentlich die Manipulation der Instanz, wenn ich in einem Framework (wie WordPress) arbeite, wo man nie weiß, welche anderen Prozesse auf Draggable zählen, wenn sie so arbeiten, wie ursprünglich angegeben. –

+0

Haben Sie eine Bronzemedaille. –

3

Einfüg.Nummer unten Kommentare: Es scheint, Sie können bearbeiten diese (nach dem letzten Widget neu zu schreiben), aber ich würde immer noch klar lenken. Here's an example of the base method, können Sie von dort aus ändern, wenn Sie möchten, aber denken Sie daran, diese kann und wird wahrscheinlich brechen in einer zukünftigen Version. Auch alle "Erben" des Widgets werden diese Änderungen nicht übernehmen, nicht sicher, ob das ein Problem ist.


Als Grund, Ihnen den Zugriff zu verweigern, ist nicht der Grund wirklich (nicht in diesem Fall). In Bibliotheksfällen wie diesem ist es mehr sauber zu sein, als Ihnen den Zugriff zu verweigern, oder, weil die Bibliothek die Architektur später vielleicht ändern möchte und immer noch so wenige Leute wie möglich bricht ... damit Sie nur auf die "Öffentlichkeit" zugreifen können "Mitglieder ihres Codes geben den Autoren mehr Flexibilität bei der Änderung von" privat ".

Fall in Punkt: jQuery UI 1.8 bewegte eine Menge Code in die position utility, so dass eine Menge von privaten Code-Bereinigung, die Sie nicht sehen passieren, da es alles privat war, bevor dies eine ziemlich große Optimierung/Code-Reduzierung erlaubt ohne Leute links und rechts zu brechen.

+1

Es hat einen führenden Unterstrich, sollte also als privat behandelt werden ... aber sind Sie sicher, dass Sie das Objekt nicht ausgraben und die Eigenschaft auf eine andere Funktion setzen können? Es ist nicht privat wie [dies] (http://www.crockford.com/javascript/private.html) ...? – sje397

+2

@ sje397 - Es ist privat nicht nur das '_' in der Front, das ist nur Konvention, um es als privat zu erkennen (ziemlich konsistent durch die Bibliothek). Es wird in den Widget-Ersteller übergeben, der den Objekten verschiedene private Methoden zuweist (wiederum wie * sie * es tun).Wenn Sie in den Code schauen, muss er über 'this._generatePosition' aufgerufen werden :) –

+0

Sie sind nicht wirklich privat, wenn Sie auf sie zugreifen können (siehe meinen anderen Beitrag), sie sind einfach unzugänglicher :) – peol

3

Sie können diese tatsächlich ändern, aber nur auf einer pro-Element-Basis, soweit ich weiß. Aber Sie könnten Ihre eigenen $ .fn.draggable Wrapper einfach erstellen, und rufen Sie die Originalverpackung auf und führen diese: draggableElement.data('draggable')._generatePosition = fn

  • Als Jörn Zaefferer wies darauf hin, Sie könnten auch die ziehbar Prototyp ändern, durch $.ui.draggable.prototype._generatePosition = fn mit
Verwandte Themen