507 Stimmen

jQuery Tipps und Tricks

Syntax

Datenspeicherung

Optimierung

Sonstiges

19voto

OneNerd Punkte 6352

Asynchrone Funktion each()

Wenn Sie eine wirklich komplexe Dokumente wo das jquery ausgeführt wird jede() Funktion sperrt den Browser während der Iteration, und/oder Internet Explorer zeigt die ' Wollen Sie dieses Skript weiter ausführen? Nachricht, wird diese Lösung den Tag retten.

jQuery.forEach = function (in_array, in_pause_ms, in_callback)
{
    if (!in_array.length) return; // make sure array was sent

    var i = 0; // starting index

    bgEach(); // call the function

    function bgEach()
    {
        if (in_callback.call(in_array[i], i, in_array[i]) !== false)
        {
            i++; // move to next item

            if (i < in_array.length) setTimeout(bgEach, in_pause_ms);
        }
    }

    return in_array; // returns array
};

jQuery.fn.forEach = function (in_callback, in_optional_pause_ms)
{
    if (!in_optional_pause_ms) in_optional_pause_ms = 10; // default

    return jQuery.forEach(this, in_optional_pause_ms, in_callback); // run it
};

Die erste Möglichkeit der Verwendung ist die gleiche wie bei each():

$('your_selector').forEach( function() {} );

Eine Mit dem optionalen 2. Parameter können Sie die Geschwindigkeit/Verzögerung zwischen den Iterationen festlegen was für Animationen nützlich sein kann ( das folgende Beispiel wartet 1 Sekunde zwischen den Iterationen ) :

$('your_selector').forEach( function() {}, 1000 );

Da dies asynchron geschieht, können Sie sich nicht darauf verlassen, dass die Iterationen vor der nächsten Codezeile abgeschlossen sind:

$('your_selector').forEach( function() {}, 500 );
// next lines of code will run before above code is complete

Ich habe dies für ein internes Projekt geschrieben, und obwohl ich mir sicher bin, dass es verbessert werden kann, hat es für unsere Zwecke funktioniert, und ich hoffe, dass einige von Ihnen es nützlich finden. Danke -

18voto

cllpse Punkte 20838

Syntaktische Abkürzung - Sugar-thing - Zwischenspeichern einer Objektsammlung und Ausführen von Befehlen in einer Zeile:

Anstelle von:

var jQueryCollection = $("");

jQueryCollection.command().command();

Das tue ich:

var jQueryCollection = $("").command().command();

Ein einigermaßen "realer" Anwendungsfall könnte etwa so aussehen:

var cache = $("#container div.usehovereffect").mouseover(function ()
{
    cache.removeClass("hover").filter(this).addClass("hover");
});

15voto

Ben Crouse Punkte 8210

Ich erkläre gerne einen $this Variable am Anfang von anonymen Funktionen, damit ich weiß, dass ich auf eine jQueried this verweisen kann.

Etwa so:

$('a').each(function() {
    var $this = $(this);

    // Other code
});

14voto

Nathan Long Punkte 117688

Speichern von jQuery-Objekten in Variablen zur Wiederverwendung

Wenn Sie ein jQuery-Objekt in einer Variablen speichern, können Sie es wiederverwenden, ohne das DOM nach ihm durchsuchen zu müssen.

(Wie von @Louis vorgeschlagen, verwende ich jetzt $, um anzuzeigen, dass eine Variable ein jQuery-Objekt enthält).

// Bad: searching the DOM multiple times for the same elements
$('div.foo').each...
$('div.foo').each...

// Better: saving that search for re-use
var $foos = $('div.foo');
$foos.each...
$foos.each...

Ein komplexeres Beispiel: Sie haben eine Liste von Lebensmitteln in einem Geschäft und möchten nur diejenigen anzeigen, die den Kriterien eines Benutzers entsprechen. Sie haben ein Formular mit Kontrollkästchen, von denen jedes ein Kriterium enthält. Die Kontrollkästchen haben Namen wie organic y lowfat , und die Produkte haben entsprechende Klassen - .organic , usw.

var $allFoods, $matchingFoods;
$allFoods = $('div.food');

Jetzt können Sie mit diesem jQuery-Objekt weiterarbeiten. Jedes Mal, wenn ein Kontrollkästchen angeklickt wird (um ein Häkchen zu setzen oder zu entfernen), beginnen Sie mit der Hauptliste der Lebensmittel und filtern nach den angekreuzten Kästchen:

// Whenever a checkbox in the form is clicked (to check or uncheck)...
$someForm.find('input:checkbox').click(function(){

  // Start out assuming all foods should be showing
  // (in case a checkbox was just unchecked)
  var $matchingFoods = $allFoods;

  // Go through all the checked boxes and keep only the foods with
  // a matching class 
  this.closest('form').find("input:checked").each(function() {  
     $matchingFoods = $matchingFoods.filter("." + $(this).attr("name")); 
  });

  // Hide any foods that don't match the criteria
  $allFoods.not($matchingFoods).hide();
});

11voto

cllpse Punkte 20838

Zugriff auf jQuery-Funktionen wie auf ein Array

Hinzufügen/Entfernen einer Klasse basierend auf einem booleschen...

function changeState(b)
{
    $("selector")[b ? "addClass" : "removeClass"]("name of the class");
}

Ist die kürzere Version von...

function changeState(b)
{
    if (b)
    {
        $("selector").addClass("name of the class");
    }
    else
    {
        $("selector").removeClass("name of the class");
    }
}

Hierfür gibt es nicht viele Anwendungsfälle. Nichtsdestotrotz; ich finde es toll :)

Update

Für den Fall, dass Sie nicht der kommentarlesende Typ sind, weist ThiefMaster darauf hin, dass die toggleClass akzeptiert einen booleschen Wert die bestimmt, ob eine Klasse hinzugefügt oder entfernt werden soll. Was meinen obigen Beispielcode angeht, wäre dies also der beste Ansatz...

$('selector').toggleClass('name_of_the_class', true/false);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X