2016-04-21 9 views
0

S/O!

Ich brauche eine zuverlässige Möglichkeit zu erkennen, ob $(window).on('resize') durch Benutzerinteraktion oder durch einen jQuery .trigger Aufruf ausgelöst wurde.

Ich habe folgendes versucht, aber ich scheine nicht die Parameter wieder in den Funktionsaufruf zu erhalten:

$(window).trigger('resize',[true]); 

function prepareOnResize(e, triggered){ console.dir(triggered); } 
$(window).on('resize',prepareOnResize); 

Triggered die Breite des Bildschirms zurückzukehren scheint, so habe ich versucht, die folgende, auch ohne Erfolg:

$(window).trigger('resize',[true]); 

function prepareOnResize(e, width, height, triggered){ console.dir(triggered); } 
$(window).on('resize',prepareOnResize); 

In diesem Fall ausgelöst kommt zurück undefined.

Ich bin hier ratlos - jede Hilfe wäre sehr willkommen. Vielen Dank!

+1

Das erste Beispiel sollte funktionieren. [Es funktionierte ok für mich] (https://jsfiddle.net/0wqrq0z5/1/) – Andy

Antwort

1

jQuery legt eine Eigenschaft isTrigger im Ereignisobjekt, mit dem Sie testen können:

function prepareOnResize(e){ 
    if (e.isTrigger) { 
     console.log('resize via jQuery trigger'); 
    } else { 
     console.log('resize by user'); 
    } 
} 

Alternativ können Sie e.originalEvent verwenden, die nur jQuery das native Ereignisobjekt hat, wie erwähnt here:

function prepareOnResize(e){ 
    if (!e.originalEvent) 
     console.log('resize via jQuery trigger'); 
    } else { 
     console.log('resize by user'); 
    } 
} 
+0

Ich versuchte dies auch, aber für das 'resize' Ereignis scheint es immer auf' 3' gesetzt zu werden: \ scheint die ' resize'-Ereignis wird von Browsern anders behandelt als typische Ereignisse wie 'click' oder' mouseover' –

+0

Kann Browser-abhängig sein, weil es für mich funktioniert. Ich habe in meiner Antwort eine Alternative hinzugefügt. – trincot

+0

Versuchte OriginalEvent - kommt jedes Mal wieder undefiniert zurück, egal wie das Ereignis ausgelöst wurde. –

2

Sie könnten Folgendes versuchen;

Javascript ... auf dom bereit ...

var $window = $(window); 

$window.on('resize', function(event, param1) { 

    console.log("Window resized event triggered by..."); 

    if (typeof param1 === 'undefined') // could also do if(param1) to test for false 
    console.log("System Event"); 
    else 
    console.log("User Event"); 

    // Another way to check is to check the originalEvent property 
    // if (e.originalEvent === undefined) alert ('triggered by code'); 
    // else alert ('triggered by system'); 

}); 

setTimeout(function() { 
    $window.trigger("resize", ["Custom"]); 
}, 2000); 

Dies ist mehr oder weniger, was Sie in Ihrem Code versucht, und es werden die zwei Arten von Ereignissen zu unterscheiden.

Ich habe auch eine jsFiddle damit Sie sehen können: https://jsfiddle.net/sysdevcode/4w3b8e14/

Um es auf Ihrem Code

$(window).trigger('resize',[true]); 

function prepareOnResize(e, width, height, triggered){ console.dir(triggered); } 
$(window).on('resize',prepareOnResize); 

Sie die Reihenfolge des params auf der prepareOnResize() Funktion ändern müssen dafür arbeiten, als $(window).trigger('resize',[true]); entspricht dem [true], der als "width" -Parameter in Ihrer Funktion gesendet wird. Sie Wold tun müssen, zum Beispiel:

var $window = $(window); 
$window.trigger('resize',[ $window.width(), $window.height(), true ]); 

dann

function prepareOnResize(e, width, height, triggered){ ... } 

wird funktionieren, aber wenn Sie keine params übergeben müssen, dann ist die e.isTrigger des Codes oben ist wahrscheinlich ein bisschen mehr elegent.

+0

Du hast einen Fehlercode. Überprüfen Sie 'console.log (Window ...)' – Robert

+0

Danke Robert, war Kopie von Geige und bemerkte nicht .. behoben –

+0

Danke für die Info, @DevOps! Mir war das Bestellverhalten von Parametern nicht bekannt. Gut zu wissen :) Falls jemand sich wunderte, habe ich 'e.originalEvent' verwendet, um dieses Problem zu behandeln. Nach dem Nixen dieses störenden Plugins, das mein natives Resize-Event gekidnappt hat, funktioniert alles jetzt viel sauberer :) –