2010-07-27 16 views
10

Wie der Titel sagt, bekomme ich "undefined", wenn ich versuche, das ID-Attribut eines Elements zu bekommen, im Grunde, was ich tun möchte, ist ein Element zu ersetzen mit einem Eingabefeld, wenn der Wert "Other" ist. Hier

ist der Code:

function showHideOther(obj){ 

    var sel = obj.options[obj.selectedIndex].value; 
    var ID = $(this).attr("id"); 

    alert(ID); 


    if(sel=='other'){ 

     $(this).html("<input type='text' name='" + ID + "' id='" + ID + "' />"); 

    }else{ 
     $(this).css({'display' : 'none'}); 
    } 
} 

Die HTML:

  <span class='left'><label for='race'>Race: </label></span> 
      <span class='right'><select name='race' id='race' onchange='showHideOther(this);'> 
      <option>Select one</option> 
      <option>one</option> 
      <option>two</option> 
      <option>three</option> 
      <option value="other">Other</option> 
      </select> 
      </span> 

Es ist wahrscheinlich etwas klein, dass ich nicht zu bemerken, was mache ich falsch?

Vielen Dank im Voraus!

Antwort

2

Aufgrund der Art, wie die Funktion aufgerufen wird (d. H. Als einfacher Aufruf einer Funktionsvariablen), ist this das globale Objekt (für das window ein Alias ​​in Browsern ist). Verwenden Sie stattdessen den Parameter obj.

Außerdem ist das Erstellen eines jQuery-Objekts und die Verwendung der attr()-Methode zum Abrufen einer Element-ID ineffizient und unnötig. Verwenden Sie einfach die Eigenschaft id des Elements, die in allen Browsern funktioniert.

function showHideOther(obj){ 
    var sel = obj.options[obj.selectedIndex].value; 
    var ID = obj.id; 

    if (sel == 'other') { 
     $(obj).html("<input type='text' name='" + ID + "' id='" + ID + "' />"); 
    } else { 
     $(obj).css({'display' : 'none'}); 
    } 
} 
0

Was erwarten Sie von $(this)?

Meinst du vielleicht sel.attr("id"); vielleicht?

0

Im Funktionskontext "this" seine nicht auf das select-Element bezieht, sondern auf die Seite selbst

  • ändern var ID = $(this).attr("id"); zu var ID = $(obj).attr("id");

Wenn obj ist bereits ein jQuery-Objekt, entfernen Sie einfach die $() um ihn herum.

5

Ihre Verwendung this in einer Funktion, wenn Sie den Parameter verwenden sollten.

Sie nur $ (this) in Rückrufe verwenden ... von Auswahlen wie

$('a').click(function() { 
    alert($(this).href); 
}) 

Abschließend die richtige Art und Weise (Code am Beispiel) wäre dieses

obj.attr('id');

zu tun
+1

"Dies" bezieht sich immer auf das Objekt, an dem Sie arbeiten. Und es kann überall verwendet werden. Natürlich, wenn Sie wissen, was Sie tun. – GerManson

+1

anstelle von '$ (this) .href', könnte man einfach' this.href' und auch 'obj.id' ... btw,' obj.attr ('id'); 'sollte' $ (obj) sein .attr ('id'); 'basierend auf OP ... – Reigel

9

ändern

var ID = $(this).attr("id"); 

zu

var ID = $(obj).attr("id"); 

Auch können Sie es ändern jQuery Event-Handler zu verwenden:

$('#race').change(function() { 
    var select = $(this); 
    var id = select.attr('id'); 
    if(select.val() == 'other') { 
     select.replaceWith("<input type='text' name='" + id + "' id='" + id + "' />"); 
    } else { 
     select.hide(); 
    } 
}); 
+0

obj scheint, als ob es bereits ein jQuery-Objekt ist. – efritz

+0

Wenn es vom onchange = "" Attribut übergeben wird, wird es ein Verweis auf HTMLElement sein, kein jQuery Objekt – fantactuka

1

die inline event handler entfernen und tun es völlig unauffällig, wie

​$('​​​​#race').bind('change', function(){ 
    var $this = $(this), 
     id = $this[0].id; 

    if(/^other$/.test($(this).val())){ 
     $this.replaceWith($('<input/>', { 
      type: 'text', 
      name: id, 
      id: id 
     })); 
    } 
});​​​ 
+0

+1 für unauffällige Annäherung! –

+0

Warum ...........? –

+0

Es ist viel sauberer und wartbarer – fantactuka

0

empfehle ich Ihnen mehr über die this keyword zu lesen .

Sie können nicht erwarten, dass "this" in diesem Fall das "select" -Tag auswählt.

In diesem Fall möchten Sie obj.id verwenden, um die ID des ausgewählten Tags zu erhalten.

2

Sie könnten auch Ihre gesamte Funktion als jQuery-Erweiterung schreiben, also könnten Sie etwas in der Art von `$ ('# element') machen. ShowHideOther();

(function($) { 
    $.extend($.fn, { 
     showHideOther: function() { 
      $.each(this, function() { 
       var Id = $(this).attr('id'); 
       alert(Id); 

       ... 

       return this; 
      }); 
     } 
    }); 
})(jQuery); 

Nicht dass es Ihre Frage beantwortet ... nur Denkanstoß.

0

Sie können

onchange='showHideOther(this);'

Aber dann müssen Sie ersetzen auch obj mit this in der Funktion

onchange='showHideOther.call(this);'

statt

tun.

Verwandte Themen