2015-06-16 14 views
5

mam karty tak:nie może powołać się na indeksy chrome.tabs.move

  • tab
  • zakładka B
  • C języczka
  • zakładka D
  • zakładka E

do przenoszenia zakładka A po zakładka C używam

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

ale dostać go po karcie D
Jeśli przenieść dowolną kartę z dołu do góry na liście, to działa dobrze, ale jeśli zakładka „górny” jest przesuwany w dół, indeksy dostać pomieszany (górna karta jest usuwana z listy indeksów, a indeks docelowy jest mniejszy o 1)
Czy muszę jakoś porównać indeks przeniesionych kart i indeks docelowy i na tej podstawie obliczyć wynikowy indeks (jeśli A < C) lub czy jest łatwiejsze rozwiązanie dla to?

Odpowiedz

0

rozumiem po karcie D

To dlatego, że starają się przenieść do tabC.index+1 który jest 4, a następnie usunięcie JOT skutkuje B, C, D, E i przeniósł się do indeksu 4 wyniki w B, C, D, A, E który jest A po D. ma to sens?

Tak więc, jeśli zakładka, którą chcesz przesunąć po naciśnięciu klawisza C, znajduje się przed tabulatorem C, nie używajmy bitu +1, w przeciwnym razie powinieneś go użyć.

+0

Tak, rozumiem, dlaczego tak się dzieje, tylko nie wiem, jak to naprawić. Więc twoją radą jest przetestowanie go, jeśli przeniesiona karta jest gdzieś w górze, a następnie obliczyć indeks? – kl123

1

Mam też pewne doświadczenia z interfejsem API Chrome. Jeśli jest jedna rzecz, której się nauczyłem, to znaczy, że interfejs API zachowuje się tak jak on.
Jeśli nowe indeksy zostaną przypisane do kart przed wstawieniem bieżącego, ale po jego usunięciu, to właśnie to.
To chyba najlepiej po prostu iść z czekiem jak zasugerował:

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 może być Tab przedmiot lub tablicą Tab s.
target może być obiektem Tab lub indeksem tabulacji (bez +1).

+0

ten test wygląda ładnie. Czy to zadziała, jeśli przeniesię tablicę (tabs.move akceptuje tablicę dla przeniesionych identyfikatorów). EDYCJA: nie ofc to nie zadziała – kl123

+0

@ kl123 Zmieniono mój fragment. "co" może być pojedynczą 'Tabą 'lub tablicą takich, ale nie tablicą identyfikatorów, ponieważ wymagane są również indeksy kart. – Siguza

+0

Wyobraziłem sobie coś podobnego. Ustawiam przeciwnik do indeksu docelowego iw jednej pętli testuję indeksy przesuwane względem indeksu docelowego Jeśli jest on niższy niż cel zmniejszam wartość licznika i używam tego licznika asindex: licznik + 1. Do tej pory w testowaniu wszystko jest w porządku (również z tablicą) – kl123

1

to, co skończyło się z:
Mam tablica o nazwie przeniósł, w którym mam obiektów

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

mogę ustawić co chcę na działania użytkownika, gdy rozpoczyna ruch, więc jestem gromadzenie identyfikatorów i indeksów

Na karcie docelowej, gdzie moja przeniósł kartę (y) powinien przejść (po niej) mam to:

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}); 
    } 

To jest naprawdę bardzo proste i działa dobrze

Powiązane problemy