2012-03-06 5 views
5

Ho il seguente codice che funziona ogni volta un cambiamento elemento accade nel mio modulo web:Come usare jQuery e 'cio' di catturare elemento forma modificata valore

<!-- 

jQuery.support.cors = true; // needed for ajax to work in certain older browsers and versions 

$(document).ready(function(){ 

    $(this).change(function(){ 
     alert('form element changed!'); 
    }); 

}); // end .ready() 

//--> 

Quello che ho lottato con è come catturare l'elemento di campo formaid, nome e valore modificato quando l'evento di modifica viene attivato.

Qualcuno può darmi una mano su questo?

Grazie!

** ** file JavaScript

// Sarfraz 
$(this).change(function(){ 
    var id, name, value; 
    id = this.id, name = this.name, value = this.value; 
    alert('id=' + id); // this returns 'undefined' 
    alert('name=' + name); // this returns 'undefined' 
    alert('value=' + value); // this returns 'undefined' 
}); 
// 

// rjz 
$(this).change(function(){ 
    var $this = $(this), 
    id = $this.attr('id'), 
    name = $this.attr('name'), 
    value = $this.val(); 

    alert(id); // this returns 'undefined' 
    alert(name); // this returns 'undefined' 
    alert(value); // this returns blank 
}); 

// Jamie 
$(this).change(function(){ 
    var id = $(this).attr('id'); 
    var name = $(this).attr('name'); 
    var value = $(this).attr('value'); 

    alert('id=' + id); // this returns 'undefined' 
    alert('name=' + name); // this returns 'undefined' 
    alert('value=' + value); // this returns 'undefined' 
}); 
// 

//James Allardice 
$(this).change(function(e) { 
    var elem = e.target; 
    alert('elem=' + elem); // this returns 'objectHTMLTextAreaElement' 
}); 
// 

// Surreal Dreams 
$("#my-form input").change(function(){ 
    alert('form element changed!'); 
    var value = $(this).val(); 
    var id = $(this).attr("id"); 
    var name = $(this).attr("name"); 

    alert(id); // nothing happens 
    alert(name); // nothing happens 
    alert(value); // nothing happens 
}); 
// 

//Jamie - Second Try 
$('.jamie2').each(function() { 
    $(this).change(function(){ 
     var id = $(this).attr('id'); 
     alert(id); // nothing happens 
    }); 
}); 
// 
+1

Qual è 'this' nel tuo esempio? – jrummell

+0

"questo" è una parola riservata in javascript, corretta? –

+0

Sì, ma il significato è contestuale. – jrummell

risposta

4

Per quanto ho capito, this si riferisce ad un elemento form e si desidera ottenere un riferimento al discendente dell'elemento form che ha attivato l'evento.

Se è vero, è possibile utilizzare la proprietà target dell'oggetto evento:

$(this).change(function(e) { 
    var elem = e.target; 
}); 

Ecco un working example.

Nel codice precedente, elem si riferirà all'elemento che ha attivato l'evento.È quindi possibile accedere alle proprietà di tale elemento, come ad esempio id:

$(this).change(function(e) { 
    var elemId = e.target.id; 
}); 
+0

Ho ricevuto "objectHTMLTextAreaElement" quando ho provato il vostro campione. Vedi il codice che ho aggiunto alla mia domanda. –

+0

@ Dr.DOT - Prova 'alert (e.target.id);'. 'e.target' ti dà l'elemento reale. È quindi possibile accedere alle proprietà di esso. Ho aggiornato la mia risposta con un altro esempio. –

+0

YAHOO @JamesAllardice. Mi hai preso il più vicino finora. Ho appena visto il nome dell'ID. Ho intenzione di giocarne alcuni con il tuo campione. Ti riporto. Sei una stella. Così sono tutti gli altri che sono intervenuti qui. Grazie a tutti!!! –

5

penso che potrebbe essere un problema fin dall'inizio:

$("#myform input").change(function(){ 
    alert('form element changed!'); 
    var value = $(this).val(); 
    var id = $(this).attr("id"); 
    var name = $(this).attr("name"); 
}); 

che non si desidera iniziare con $ (questo), è è necessario selezionare gli ingressi che si desidera monitorare. Quindi puoi usare $ (this) all'interno della funzione change().

James Allardice ha sottolineato che si potrebbe fare riferimento al modulo con $ (questo) e l'evento change() potrebbe rilevare tutte le modifiche nel modulo. Ti suggerirei di indirizzare gli elementi modificati in modo più specifico in modo da non rilevare gli eventi di modifica sugli elementi che non ti servono o che desideri, il che potrebbe eliminare comportamenti imprevisti. Potresti scegliere come target un selettore di classe o modulo come :input.

+0

Sono d'accordo con questo fino a quando il Dr. DOT fornisce informazioni aggiuntive per il motivo per cui si farebbe vuoi associare il cambiamento a "questo" piuttosto che a input particolari. ;-) Non riesco a pensare a un buon caso d'uso per '$ (this) .change()', ma questo non significa che non ce ne sia uno. –

+0

@GregPettit - Dal 'this' si riferisce ad un elemento' form', è possibile associare un gestore di 'change' eventi ad esso e sarà catturare gli eventi di modifica innescato da qualsiasi discendente di esso (in quanto saranno bolla fino al' form'). Come usare 'on' con un argomento selettore. Vedi la mia risposta. –

+0

Se Dr. DOT fornisce alcuni chiarimenti, farò un aggiornamento. Lancia un commento qui sotto Dott. DOT, così prendo un appunto per controllarlo. –

1

Si potrebbe fare qualcosa di simile al seguente all'interno del vostro cambiamento

var ELEMEMT = $('#IDOFELEMENT').val(); 
+0

Grazie mille per avermi aiutato. Sono stato in grado di ottenere ciò che ho impostato anche tramite la risposta di 'e.target.id' di James Allardice. Apprezzo molto la tua assistenza. I migliori saluti. –

1

È possibile accedere alle proprietà direttamente come segue:

$(this).change(function(){ 
    var id = this.id, 
    name = this.name, 
    value = this.value; 
}); 

In alternativa, jQuery fornisce funzioni di supporto per recuperare questi oggetti di prima elemento in una raccolta jQuery:

$(this).change(function(){ 
    var $this = $(this), 
    id = $this.attr('id'), 
    name = $this.attr('name'), 
    value = $this.val(); 
}); 
+0

Il tuo primo esempio è identico a Sarfraz. Anche il tuo secondo esempio l'ho provato. Entrambi i campioni ritornano indefiniti. Vedi il mio codice JS nella mia domanda. –

+0

Grazie mille per avermi aiutato. Sono stato in grado di ottenere ciò che ho impostato anche tramite la risposta di 'e.target.id' di James Allardice. Apprezzo molto la tua assistenza. I migliori saluti. –

1

TRY con jQuery 1,7

$(document).on('change','#myID',function(){ 
    alert('Id:'+this.id+'\nName:'+this.name+'\nValue:'+this.value); 
});​ 

DEMO

+0

Ho presupposto che #myID sia in riferimento all'ID di tag

. Corretta? Se è così, nulla è tornato quando ho stancato il tuo suggerimento. –

+0

Grazie mille per avermi aiutato. Sono stato in grado di ottenere ciò che ho impostato anche tramite la risposta di 'e.target.id' di James Allardice. Apprezzo molto la tua assistenza. I migliori saluti. –

1

Ecco come:

$(this).change(function(){ 
    var id, name, value; 
    id = this.id; name = this.name; value = this.value; 
}); 
+0

Grazie @Sarfraz. Ho provato la tua versione qualche giorno fa, ma ho dato un altro colpo. Vedi il mio codice che si aggiunge alla mia domanda. Tutti e tre gli elementi restituiscono "indefinito". –

+0

@ Dr.DOT: È necessario chiarire anche a cosa si riferisce "questo" nel proprio codice, quale elemento html e come raggiunge fino a quel codice. – Sarfraz

+0

"questo" è una parola riservata in javascript, corretta? –

2

Per poter utilizzare $ (questo), è necessario disporre di un oggetto JavaScript predefinito. Ecco perché si chiama questo.

quindi è necessario fare qualcosa di simile:

$('.class_name').each(function() { 
    $(this).change(function(){ 
     var id = $(this).attr('id'); 
    }); 
}); 

o

$('.class_name').click(function() { 
    $(this).change(function(){ 
     var id = $(this).attr('id'); 
    }); 
}); 

In breve, è necessario selezionare un elemento e creare un oggetto prima di poter utilizzare $ (questo).

+0

@Jaimie. ogni codice di esempio restituisce 'indefinito'. Vedi il codice che ho aggiunto alla mia domanda. –

+0

Ho modificato la mia domanda – hohner

+0

Grazie a @Jaimie ... ma ancora senza fortuna. Vedi il mio codice che ho aggiunto alla mia domanda. –

0

bene, sono in ritardo alla festa se non in forma di commenti, ma solo per i posteri: ecco la mia estensione dell'approccio surreali Dreams':

$("#myform").on('change', input, (function(){ 
    alert('form element changed!'); 
    var $this = $(this); 
    var value = $this.val(); 
    var id = $this.attr("id"); 
    var name = $this.attr("name"); 
}); 

#myform ascolto per le modifiche su ingressi all'interno. Ho anche memorizzato nella cache il jQuery-wrapped this. Ecco!