Das $ in JS

Mmmh, da hast du wohl etwas falsch gemacht, auch mit jQueryUI geht das, kannst es gerne probieren:

Ja, es funktioniert.
Mein Problem ist immer noch: Warum?

Wenn ich mir nochmal folgende Zeile anschaue:
Code:
$('#date').datepicker();
Wie kommt es, dass sich die jQueryUI-Lib dafür zuständig fühlt?
Gut, diese hat offensichtlich eine function "datepicker()" im Bauch. Aber was, wenn eine andere Lib auch die function "datepicker()" hätte? Dann wäre das doch ein Problem? Oder?

Schöne Grüße,
Frank
 
Wenn ich mir nochmal folgende Zeile anschaue:
Code:
$('#date').datepicker();
Wie kommt es, dass sich die jQueryUI-Lib dafür zuständig fühlt?
Gut, diese hat offensichtlich eine function "datepicker()" im Bauch. Aber was, wenn eine andere Lib auch die function "datepicker()" hätte? Dann wäre das doch ein Problem? Oder?

Probiers doch aus :P Rein aus dem Bauch geraus würde ich sagen, das dass Framework, das zuletzt eingebunden wurde und die "$"-Funktion hat, aufgerufen wird.

Ich denke das beim Parsen des Dokuments vom Browser die JS Funktionen gespeichert werden und gegebenenfalls überschrieben werden wenn sie doppelt vorkommen.

Gruß
 
Es gibt keine $-Funktion! Das ist genau mein Verständnisproblem.
Die Funktion heisst "datepicker()".

Die Funktion $ gibt ein Objekt zurück, und dies zurückgegebene Objekt hat eine Methode namens datepicker:
Code:
function $(selektor)
{
  return {
            selektor:selektor,
            datepicker:function()
                       {
                        alert('Der Selektor ist '+this.selektor+
                             '\n und ich bin die Methode datepicker()'
                             );
                       }
         };
}

$('#irgendwas').datepicker();
 
Warum soll es dann krachen?
Code:
<!DOCTYPE html>
<html>
<head>
  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
  <style type="text/css">
    #draggable,#clickable { width: 100px; height: 130px; background: red;border:1px dotted #000; margin:12px;}
  </style>
  <script>
  jQuery.noConflict();  
  </script>
</head>
<body>
<div id="draggable">Drag me with jQuery <br/> or <br/>Doubleclick me with my own Method</div>
<script>
function $(id)
{
  var obj={
        node:document.getElementById(id),
        toggle:function()
                  {
                    alert('dblclick works!');
                    this.node.style.backgroundColor=
                      (this.node.style.backgroundColor=='white')
                        ?'red'
                        :'white'                    
                  }
      };
  obj.draggable=function()
                  {
                    this.node.ondblclick=function(){obj.toggle();}
                  };
  return obj;
}

jQuery("#draggable").draggable();
$("draggable").draggable();
</script> 
</body>
</html>
 
Zuletzt bearbeitet:
Warum probierst du es denn nicht einfach aus.
Wie kommt es, dass sich die jQueryUI-Lib dafür zuständig fühlt?
Dafür zuständig fühlen tut sich überhaupt niemand. Ein funktionsaufruf ist kein "In den Raum rufen und abwarten welches Framework es entgegen nimmt", sondern ein Aufruf einer Funktion die durch seinen Namen festgelegt wurde. In diesem Fall ist der Name der funktion ganz einfach $. Somit wird immer das zu letzt eingebundene Framework das $ verwenden angesprochen.

Hier noch ein Beispiel:
Javascript:
//jQuery Framework
var $ = function(selektor)
{
  return {
            selektor:selektor,
            datepicker:function()
                       {
                        alert('Ich bin die jQuery datepicker function');
                       },
			fooBar:function()
						{
						alert('ich bin die fooBar function die es nur in jQuery gibt');
						}
         };
}

//Irgendein anderes Framework z.B. mootools
var $ = function(selektor)
{
	return {
		selektor:selektor,
		datepicker:function()
			{
				alert('Ich bin die mootools datepicker function');
			}
	};	
}


$('#irgendwas').datepicker();
$('#irgendwas').fooBar();
Das gibt ein alert mit :
Ich bin die mootools datepicker function
Und eine Fehlermeldung mit:
Fehler: $("#irgendwas").fooBar is not a function
 
... sondern ein Aufruf einer Funktion die durch seinen Namen festgelegt wurde. In diesem Fall ist der Name der funktion ganz einfach $. Somit wird immer das zu letzt eingebundene Framework das $ verwenden angesprochen...

Genau. Das verstehe ich mittlerweile.
Aber wie Dein Beispiel zeigt, wird dort die erste Lib (jQuery Framework) ausgehebelt, da beide mit $ arbeiten.

Und genau das ist die Krux: Fast alle arbeiten mit $. Wahrscheinlich ist das cooler als ein klarer Name wie z.B. "xyzFramework"!?

Wie wir weiter oben ja sehen, macht es jQuery gut: Die bieten ein "noConflict()" an. Damit kann man dann nämlich klar adressieren (mit "jQuery.")

Wenn alle klare Namen verwenden würden statt $ würde es auch nicht diese "ich überschreibe die letzte Lib"-Effekte geben.

Oder bin ich da auf dem Holzweg?

Gruß,
Frank
 
Und genau das ist die Krux: Fast alle arbeiten mit $. Wahrscheinlich ist das cooler als ein klarer Name wie z.B. "xyzFramework"!?
Ob es dafür einen bestimmten Grund gibt kann ich dir nicht sagen. Eventuell liegt es ganz einfach daran das frameworks auch den Schreibaufwand reduzieren wollen. Oder sie haben gegenseitig abgeschaut und nachgemacht. Oder sie wollen mehr oder weniger dazu zwingen nur ihr framework zu benutzen.

Wie wir weiter oben ja sehen, macht es jQuery gut: Die bieten ein "noConflict()" an. Damit kann man dann nämlich klar adressieren (mit "jQuery.")

Wenn alle klare Namen verwenden würden statt $ würde es auch nicht diese "ich überschreibe die letzte Lib"-Effekte geben.

Oder bin ich da auf dem Holzweg?
Ja jQuery ist da vorbildlicher als seine Kollegen und nein du bist nicht auf dem Holzweg ;)
 
Zurück