2010-07-30 9 views
10

Wie funktionieren kann ich übergeben Sie die $ this (das Selbst Schlüsselwort) auf eine Funktion in Jquery

$(document).ready(function() { 

    $('.nav a').click(function() { 
     var direction = $(this).attr("name"); 
     submit_form($(this)) 
    }); 

    function submit_form(this) 
    { 
     // do some stuff with 'this' 
    }  
}); 
+4

Sie tun es bereits richtig. Benenne einfach die Variable in 'function submit_form (this) {}' in etwas anderes wie 'function submit_form (element) {}'. –

+1

Bitte verwenden Sie Javascript so, wie es verwendet werden soll (keine Notwendigkeit, den Kontext als Parameter zu übergeben): 'submit_form.call (this)', 'submit_form.apply (this)', oder sogar jQuery, wenn das die einzige Sache ist Sie verstehen: 'jQuery.proxy (submit_form, this)' –

Antwort

16

es in $() Verpackung macht es zu einem jQuery Objekt. Sie möchten etwas wie

tun
submit_form(this); 

function submit_form(obj) 
{ 
    // Work with `obj` as "this" 
    // Or wrap it in $() to work with it as jQuery(this) 
} 
+1

$ (wichtiger Punkt!) –

1

Try this:

$(document).ready(function() 
    { 
     $('.nav a').click(function() { 
      var direction = $(this).attr("name"); 
      submit_form(this); 
     }); 

     function submit_form(myObject) 
     { 
      // do some stuff with 'myObject' 


     }   

    }); 
0

Pass es einfach als normale Variable?

5

Das Schlüsselwort this kann nicht in JavaScript festgelegt werden. Es wird automatisch von JavaScript generiert und "bezieht sich immer auf den" Eigentümer "der Funktion, die wir gerade ausführen, oder vielmehr auf das Objekt, für das eine Funktion eine Methode ist".
http://www.quirksmode.org/js/this.html

Sie haben ein Problem in Ihrem Code (versuchen, den Parameter des submit_form() -Funktion diese zu nennen). Die Art und Weise, in der Ihr Code angelegt wird, macht jedoch nicht deutlich, ob Sie den angeklickten Anker als jQuery-Objekt oder als DOM-Knoten für den Anker übergeben möchten.

$(document).ready(function() { 
    $('.nav a').click(function() { 
     $anchor = $(this);      // Capture the jQuery-wrapped anchor for re-use; 'this' is an anchor because it matched $('.nav a') 
     var direction = $anchor.attr("name"); // $variable_name is a standard pattern in jQuery to indicate variables that are jQuery-wrapped instead of DOM objects 

     submit_form_jquery($anchor);   // Providing versions of submit_form function for passing either jQuery-wrapped object or DOM object 
     submit_form_dom(this);     // Pick the one you prefer and use it 
    }); 

    function submit_form_jquery($my_anchor) { // Function with well-named parameter expecting a jQuery-wrapped object 
     // do some stuff with '$my_anchor' 
     // $my_anchor here is assumed to be a jQuery-wrapped object 
    } 

    function submit_form_dom(anchor) {   // Function named expecting a DOM element, not a jQuery-wrapped element 
     // do some stuff with 'anchor' 
     // anchor here is assumed to be a DOM element, NOT wrapped in a jQuery object 
    } 
}); 

Auf einem meist in keinem Zusammenhang zur Kenntnis, werden Sie wahrscheinlich wollen return false; entweder oder verwenden Event.preventDefault() von der Seite zu halten, die href auf dem Anker folgende, auf den geklickt wurde. Sie können das wie folgt tun:

$(document).ready(function() { 
    $('.nav a').click(function(event) { 
     event.preventDefault(); 
     // And now do what you want the click to do 
    }); 
}); 
1

Hier ist, was für mich arbeitete.

$(document).ready(function() 
{ 
    $('.nav a').click(function() { 
     submit_form(this) 
    }); 

    function submit_form(thisObject) 
    { 
     var direction = $(thisObject).attr("name"); 
    }  
}); 
1

Ja, diese kann leicht eingestellt werden. Siehe Function.call() und Function.apply().