2012-12-21 13 views
7

Ok, ho provato a fare ricerche, ma. Ho un compito, in cui ho bisogno di caricare alcuni js usando l'Ajax e così via. Per farla breve, ho bloccato.Fare clic per ottenere l'indice dell'elemento di matrice con jquery

Prima un codice script.js (che devo caricare e che non riesco a modificare):

var divs = [ 
    '<div class="item">Lorem ipsum 0</div>', 
    '<div class="item">Lorem ipsum 1</div>', 
    '<div class="item">Lorem ipsum 2</div>', 
    '<div class="item">Lorem ipsum 3</div>', 
    '<div class="item">Lorem ipsum 4</div>', 
    '<div class="item">Lorem ipsum 5</div>', 
    '<div class="item">Lorem ipsum 6</div>', 
    '<div class="item">Lorem ipsum 7</div>' 
]; 
delete(divs[3]); 

Poi il mio script per caricarlo

$.getScript('script.js', function() { 
    $('.a').append('<div class="yep">' + divs.join('') + '</div>'); 
    $('.item').each(function() { 
     $(this).click(function() { 
      console.log($('.item').index(this)); 
     }); 
    });  
}); 

Il problema è che il fare clic su Ho bisogno di ottenere l'indice dell'elemento nell'array, cioè se clicco su "Lorem ipsum 4" la console dovrebbe stampare "4", non "3" come succede ora (a causa dell'elemento cancellato che non appare in dom). C'è un modo per ottenere il risultato giusto usando jQuery?

Ok, devo dire che è un compito. Ed ecco la cosa: non posso semplicemente modificare script.js. Diciamo che è sul server e non ho accesso ad esso fino a quando non capisco. Ma ho bisogno dell'indice di un elemento che ha nell'array originale.

+0

Una possibile soluzione sarebbe quella di memorizzare l'indice con l'elemento div in un attributo di dati, ad esempio: '

Lorem Ipsum 3
' –

+0

Sì, è necessaria una soluzione alternativa. Perché il div è stato eliminato prima di eseguire un .each(); quell'elemento e il suo indice sono spariti. Dovresti salvarlo in un altro modo come con un attributo dati come menzionato sopra. – Syon

+0

Non riesco a modificare il file script.js e non ho bisogno di rimuovere elementi dalla matrice. Ho bisogno di ottenere l'indice giusto solo – kibin

risposta

2

provare qualcosa di simile:

http://jsfiddle.net/YjNAL/1/

var divs = [ 
    '<div class="item">Lorem ipsum 0</div>', 
    '<div class="item">Lorem ipsum 1</div>', 
    '<div class="item">Lorem ipsum 2</div>', 
    '<div class="item">Lorem ipsum 3</div>', 
    '<div class="item">Lorem ipsum 4</div>', 
    '<div class="item">Lorem ipsum 5</div>', 
    '<div class="item">Lorem ipsum 6</div>', 
    '<div class="item">Lorem ipsum 7</div>' 
]; 
delete(divs[3]); 

var yep = $('<div class="yep"></div>'); // Changed (from edit) 

for (var i = 0; i < divs.length; i++) { 
    if (divs[i]) { // Don't operate on undefined items 
     var theDiv = $(divs[i]).data("idx", i); // Changed (from edit) 

     yep.append(theDiv); // Changed (from edit) 
    } 
} 

$(".a").append(yep); // Changed (from edit) 

$('.item').on("click", function() { 
    console.log($(this).data("idx")); 
}); 

Nota come la matrice originale non viene modificata.

Ogni elemento nell'array viene modificato e crea un oggetto jQuery prima di essere aggiunto. < - Sono sicuro che la parte potrebbe essere eseguita in modo più efficiente, stavo solo cercando di mettere insieme qualcosa.

Memorizza il proprio indice nell'array dal ciclo for, in modo che sia accurato.

Tutte le voci non definite (eliminate) vengono ignorate.

+0

Ok, +1 per l'ingegno. Spero che sia quello che sta facendo il codice reale dell'OP, comunque. – Blazemonger

+1

@Blazemonger Grazie :) È l'unico modo in cui potrei pensare di non toccare il primo blocco di codice nell'OP ma preservare ancora l'indice senza alcun attacco inaffidabile. Ci sono ancora alterazioni che potrebbero essere fatte. E vero, chissà cosa viene effettivamente utilizzato ... potrebbe essere molto più difficile da fare – Ian

+0

È proprio quello di cui ho bisogno, grazie! – kibin

4

Stai chiedendo l'INDICE dell'elemento selezionato. Il tuo codice sta facendo esattamente quello che dovrebbe fare. jQuery non ha modo di sapere se hai cancellato elementi dalla lista originale, può solo vedere cosa c'è attualmente.

La soluzione migliore consiste nell'aggiungere un attributo HTML agli elementi originali e console.log invece dell'attributo .index. Come questo:

var divs = [ 
    '<div data-idx="0" class="item">Lorem ipsum 0</div>', 
    '<div data-idx="1" class="item">Lorem ipsum 1</div>', 
    '<div data-idx="2" class="item">Lorem ipsum 2</div>', 
    '<div data-idx="3" class="item">Lorem ipsum 3</div>', 
    '<div data-idx="4" class="item">Lorem ipsum 4</div>', 
    '<div data-idx="5" class="item">Lorem ipsum 5</div>', 
    '<div data-idx="6" class="item">Lorem ipsum 6</div>', 
    '<div data-idx="7" class="item">Lorem ipsum 7</div>' 
    ]; 
delete(divs[3]); 


$('.a').append('<div class="yep">' + divs.join('') + '</div>'); 

$('.item').each(function() { 
    $(this).click(function() { 
     console.log($(this).data('idx')); 
    }); 
});​ 

http://jsfiddle.net/mblase75/8NLGm/

+0

Non riesco a modificare l'array divs – kibin

+0

Non è possibile per il TUO codice sapere cosa è stato cancellato dall'array prima che tu possa accedervi. Hai bisogno di QUALCOSA per andare avanti. Potremmo analizzare il '.text()' delle tue div per estrarre il numero, ma dubito che sia il contenuto che stai usando veramente. – Blazemonger

-1

È possibile try this. Dare a tutti i div un ID, e ottenere che:

var divs = [ 
    '<div class="item" id="0">Lorem ipsum 0</div>', 
    '<div class="item" id="1">Lorem ipsum 1</div>', 
    '<div class="item" id="2">Lorem ipsum 2</div>', 
    '<div class="item" id="3">Lorem ipsum 3</div>', 
    '<div class="item" id="4">Lorem ipsum 4</div>', 
    '<div class="item" id="5">Lorem ipsum 5</div>', 
    '<div class="item" id="6">Lorem ipsum 6</div>', 
    '<div class="item" id="7">Lorem ipsum 7</div>' 
]; 
delete(divs[3]); 

$('.a').append('<div class="yep">' + divs.join('') + '</div>'); 
$('.item').each(function() { 
    $(this).click(function() { 
     console.log(this.id); 
    }); 
}); ​ 

I numeri in id?!?

Sì, lo so, in HTML4 id s a partire da numeri non consentiti. HTML5, tuttavia, ha rimosso questa restrizione.
Questi div verranno convalidati in base allo w3 validator.

+0

Grazie, ha funzionato! Puoi spiegare la tua soluzione? – kibin

+3

Nitpick: gli ID che iniziano con i numeri non sono HTML 4 validi, anche se di solito funzionano nei browser. – Blazemonger

+0

È piuttosto semplice: "questo" è l'elemento su cui si fa clic. 'this.id' è quell''elemento' id', come impostato in 'id =" 0 "' ect. @Blazemonger: Devo ancora vedere un browser che non può gestire id che iniziano con i numeri. Se chi mi ha ridimensionato avrebbe dato una ragione adeguata, forse potrei imparare da essa. – Cerbrus

-1

Se si preferisce avere un po 'dinamica, si potrebbe creare un elemento, aggiungere un campo di dati su di esso, quindi accedere a tale elemento:

var divs = [ 
    '<div class="item">Lorem ipsum 0</div>', 
    '<div class="item">Lorem ipsum 1</div>', 
    '<div class="item">Lorem ipsum 2</div>', 
    '<div class="item">Lorem ipsum 3</div>', 
    '<div class="item">Lorem ipsum 4</div>', 
    '<div class="item">Lorem ipsum 5</div>', 
    '<div class="item">Lorem ipsum 6</div>', 
    '<div class="item">Lorem ipsum 7</div>' 
    ]; 
var newdivs = $('<div class="yep">').append(divs.join("")); 
newdivs.find('.item').each(function() { 
    $(this).data("myindex", $(this).index()); 
}); 
var elementToDelete = 3 
delete(divs[elementToDelete]); 
newdivs.find('.item').eq(elementToDelete).remove(); 
$('.a').append(newdivs); 

$('.a').on('click','.item',function() { 
    $(this).css("background-color","lime"); 
    alert($(this).data("myindex")); 
}); 

vedere come funziona qui: http://jsfiddle.net/rZjNd/2/

+0

L'avviso di violino "non definito" per me. (Google Chrome) – Cerbrus

+0

Corretto, era un problema di sintassi su un refactoring del mio :) –

+0

In questa soluzione ho bisogno di cambiare lo script originale, che non posso fare – kibin

Problemi correlati