2015-06-16 11 views
5

ho schede come questo:non possono contare su indici in chrome.tabs.move

  • linguetta A
  • scheda B
  • scheda C
  • scheda D
  • scheda E

per spostare scheda A dopo scheda C Io uso

chrome.tabs.move(tabA.id, {'index': tabC.index+1}); 

ma ottengo dopo scheda D
Se mi muovo ogni scheda dal basso verso l'alto nella lista, funziona benissimo, ma se scheda "superiore" si sposta verso il basso, gli indici get incasinato (linguetta superiore viene rimosso dalla lista degli indici e l'indice di riferimento è dalla 1)
devo comparazione qualche modo spostato indice di tabulazione e l'indice di riferimento e sulla base di tale calcolo risultante indice (se a < C) o c'è una soluzione facile per Questo?

risposta

0

ottengo dopo scheda D

Questo perché si sta cercando di passare a tabC.index+1 che è 4, quindi rimuovendo scheda A, i risultati in B, C, D, E e si muovono per indicizzare 4 risultati in B, C, D, A, E quali è A dopo D. ha senso?

Quindi, se la scheda che si desidera spostare dopo la scheda C si trova prima della scheda C, non utilizzare il bit +1, altrimenti è necessario utilizzarlo.

+0

sì, capisco perché sta succedendo, ma non so come risolverlo. Quindi il tuo consiglio è di testarlo se la scheda mossa proviene da qualche parte SU e quindi calcolare l'indice? – kl123

1

Ho avuto alcune esperienze con l'API Chrome troppo, e se c'è una cosa che ho imparato, allora è che l'API appena si comporta come lo fa.
Se nuovi indici vengono assegnati alle schede prima di quella corrente è inserito, ma dopo che è stata rimossa, allora questo è proprio questo.
E 'probabilmente meglio andare solo con un assegno come da te suggerito:

function moveAfter(what, target) 
{ 
    target = (typeof target === 'number' target : target.index) + 1; 
    if(what.constructor === Array.prototype.constructor) 
    { 
     var w = []; 
     var t = target; 
     for(var i = 0; i < what.length) 
     { 
      if(what[i].index < target) 
      { 
       t--; 
      } 
      w.push(what[i].id); 
     } 
     what = w; 
     target = t; 
    } 
    else 
    { 
     if(what.index < target) 
     { 
      target--; 
     } 
     what = what.id; 
    } 
    chrome.tabs.move(what, {index: target}); 
} 

what può essere un oggetto Tab o un array di Tab s.
target può essere un oggetto Tab o un indice di scheda (senza +1).

+0

questo test sembra carino. Funzionerà se metto array (tabs.move accetta array per gli ID spostati). EDIT: no ofc non funzionerà – kl123

+0

@ kl123 Modificato il mio snippet. 'what' può essere una singola' Tab' o una matrice di tale, ma non una matrice di ID, poiché anche gli indici delle schede sono obbligatori. – Siguza

+0

Ho pensato qualcosa di simile. Ho impostato il contatore dell'indice di destinazione e in un ciclo sto testando gli indici spostati rispetto all'indice di destinazione Se è inferiore all'obiettivo I diminuisci il valore del contatore e utilizza quel contatore comeindice: contatore + 1. Finora nel test va tutto bene (anche con la matrice) – kl123

1

questo è quello che ho finito con:
ho array chiamato spostato in cui ho oggetti

moved = [{id, index}, {id, index}.....] 

posso impostare quello che voglio su azione dell'utente quando mossa avvia, quindi sono la raccolta di id e gli indici

Nella scheda di destinazione in cui il mio spostato scheda (s) dovrebbe andare (dopo) ho questo:

var counter = this.index; 
    for (var i=moved.length-1; i>=0; i--) { 
     if (moved[i].ix < counter) { 
      counter--; 
      chrome.tabs.move(moved[i].id, {'index': counter+1});  
     } else if (moved[i].ix > counter) chrome.tabs.move(moved[i].id, {'index': counter+1}); 
    } 

in realtà è molto semplice e funziona bene

Problemi correlati