2017-06-14 5 views
1

ich eine Onclick Funktion haben von einer „Seite“ zu einem anderen zu navigieren (es eigentlich nicht ist die Navigation, ahmt es gerade):„this“ als Argument verwenden

$('.button').on('click', function(){ 
    $('.home').css('display','none'); 
    var newPage = $('.'+this.id); 
    goTo(newPage); 
}); 

goTo Referenz vereinfacht:

function goTo(page){ 
$(page).css('display', 'block'); 
} 

Das funktioniert einwandfrei. Alle Navigationsschaltflächen haben die Klasse der Schaltfläche und eine ID, die dem Klassenname der verschiedenen "Seiten" entspricht. Klicken Sie auf # page1, display.page1, usw.

Mein Problem ist jetzt, ich muss meinen Code neu schreiben, um das gleiche für andere Elemente zu tun - versuchen, dies mit Argumenten neu zu schreiben, funktioniert dafür nicht besonders.

Hier ist, was ich versuche:

function goToPage(link, destination){ 
link.click(function(){ 
    $('.home').css('display','none'); 
    goTo(destination); 
} 
} 

und nannte es als:

goToPage($('#page1'), $('.page1')); 

funktioniert gut, aber:

goToPage($('.button'), $('.'+this.id)); 

nicht.

Ich nehme an, ich verstehe nicht, wie "das" in diesem Zusammenhang funktioniert. Ich dachte, es würde nur bestimmen, was "das" ist, wenn das Argument aufgerufen wird.

Also meine Frage ist: kann "das" als ein Argument auf diese Weise verwendet werden, bin ich leicht mit der Logik oder bin ich ein kompletter Idiot?

Fiddle: https://jsfiddle.net/hek0ptca/13/

+0

Können Sie uns das Markup zeigen? – PeterMader

+1

Wo rufst du 'goToPage ($ ('. Button'), $ ('.' + This.id))' von, da 'dies 'im Zusammenhang mit der umgebenden Schließung steht. Sie müssen den Code veröffentlichen, der zeigt, dass wir den 'goToPage (...)' Aufruf machen. – Nope

+0

'goToPage (this, '.' + This.id);' –

Antwort

1

ausdrücklich Ihre Frage zu beantworten, nein, kann this nicht als Argument in diesem Fall verwendet werden, da es so gut wie nichts hindeutet.

goToPage($('.button'), $('.'+this.id)); 

In diesem Zusammenhang this Punkte auf "undefiniert". Versuchen Sie console.log(this.id); im selben Umfang des oben erwähnten Codes laufen zu lassen und überprüfen Sie die Konsole Ihres Browsers. Es gibt "undefined" zurück.

Eine gute Möglichkeit zum Nachdenken über this ist, dass Sie etwas brauchen, um es zu referenzieren. Umfang zählt. Wenn es nichts gibt, worauf zu referenzieren, erhalten Sie immer "undefined" als Wert. Typischerweise wird this innerhalb einer Funktion verwendet, wo ein Objekt bereits zum Beispiel verwiesen wurde, in Ihren Event-Handler:

$('.button').click(function(){ 
    $('#home').css('display', 'none'); 
    goTo($('.'+this.id)); 
}); 

Dies wird in diesem Fall arbeiten, weil this zurück auf das Objekt beziehen, die auf betrieben wird, die .button-Klasse.

+0

Danke dafür. Ich habe das schon kurz nach dem Posten verstanden. Ich bin aber trotzdem ratlos, wenn ich dies als $ $ ('. Button') bezeichnen würde. Click (function() { goToPage ($ (this), $ ('.' + This.id)); }); Es würde funktionieren, aber ich müsste doppelt klicken (verständlicherweise - einmal, um die Funktion aufzurufen, und ein anderes Mal für die Funktion). Kennen Sie eine Möglichkeit, diese Funktion für dieses Objekt ohne ein Ereignis aufzurufen? –

+0

Der Grund, warum Sie doppelklicken müssen, ist, dass JQuery in der von Ihnen bereitgestellten Fidel das erste Klick-Ereignis von '$ ('. Button') registriert. Click (function() {goToPage ($ (this), $ ('.') + this.id));}); 'Aber dann haben Sie ein anderes Klickereignis in der Funktion goToPage(). Und ja, Sie können Ereignisse mit der Funktion .trigger() erzwingen. Lesen Sie hier: http://api.jquery.com/trigger/ Oder Sie können einfach die Funktion aufrufen und übergeben Sie die ID des Elements, das Sie versuchen, eine Operation durchzuführen, wie 'goToPage ('# page1',. ..); ' – KyleS