Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Zmiana koloru po wypełnieniu któregoś elementu z atrybutem contenteditable
Forum PHP.pl > Forum > Przedszkole
Grandalf00
Witajcie! Mam na stronie tabelę gdzie zawartość można edytować. Każda komórka ma unikalny id. Chciałbym aby pole, które zostanie wedytowane (np onchange) zmieniło tło na wybrany. Myślałem zrobić to za pomocą skryptu, który będzie "nasłuchiwał" po załadowaniu się strony czy nie nastąpiło "onfocus". Tylko nie wiem czy dla przeglądarki samo kliknięcie w pole to już "onfocus" czy muszę mimo wszystko dopisać to zdarzenie w kodzie każdego pola?

Wolałbym posłużyć się już istniejącym id, które będzie przechwytywał skrypt w momencie edycji któregokolwiek pola.
Puszy
Zakładam że tabela zaweira <input> w każdej komórce. Poniższy skrypt podświetla na niebiesko komórkę która jest obecnie edytowana i na żółto gdy została edytowana. Mam nadzieję że taki efekt chciałeś osiągnąć.

  1. <!DOCTYPE html>
  2. <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
  3. td{
  4. width: 150px;
  5. height: 150px;
  6. border: 1px solid #C3C3C3;
  7. }
  8. .currently-editing{
  9. background-color: #E0E8FF;
  10. }
  11.  
  12. .edited{
  13. background-color: #F7E741;
  14. }
  15. </style>
  16. </head>
  17.  
  18. <tr>
  19. <td>
  20. <input type="text" data-edited="false" value="foo" />
  21. </td>
  22. <td>
  23. <input type="text" data-edited="false" />
  24. </td>
  25. </tr>
  26. <tr>
  27. <td>
  28. <input type="text" data-edited="false" />
  29. </td>
  30. <td>
  31. <input type="text" data-edited="false" value="bar" />
  32. </td>
  33. </tr>
  34.  
  35. $(document).ready(function () {
  36.  
  37. $('input').focus(function () {
  38. $(this).closest('td').addClass('currently-editing');
  39. }).blur(function () {
  40. $(this).closest('td').removeClass('currently-editing');
  41. }).change(function () {
  42. $(this).closest('td').addClass('edited');
  43. $(this).attr('data-edited', 'true');
  44. });
  45.  
  46. });
  47.  
  48. </body>
  49. </html>
  50.  
vokiel
A samo https://developer.mozilla.org/en/docs/Web/CSS/:focus nie wystarczy?
Puszy
Oczywiście że wizualnie wystarczy, skrypt który pokazałem umożliwia rozbudowanie go o nie tylko dodanie/usunięcie klasy. Dodatkowo flaguje input jako zmieniony dzięki atrybutowi data co umożliwi Grandalf00owi np. wyświtlenie pod tabelą listy edytowanych inputów.

edit: :focus zadziała na background inputa nie komórki, z tego co pamiętam nie jest jeszcze możliwe w prosty sposób odwołać się do parenta w CSSie.
trueblue
Ale autor raczej nie ma tam inputa. Jak w tytule - ma tabelę w elemencie edytowalnym, czyli edytuje wizualnie kod html, a dokładnie, bezpośrednio zawartość komórki.
Grandalf00
Dokładnie jak napisał @trueblue - w moim przypadku chodzi dokładnie o komórkę w tabeli. :focus zmieni mi tylko kolor aktywnej komórki, a mi chodzi o to aby po edycji i np klinięciu w inną komórkę czy gdziekolwiek, komórka wyedytowana miała na stałe (do czasu przeładowania strony) inni kolor tła dla wiadomości użytkownika, że coś było zmienione.

Aktualnie komórki dziedziczą style, ale każda ma indywidualny ID.
trueblue
Może coś z tego: http://stackoverflow.com/questions/8694054...contenteditable
Grandalf00
Czytałem o tym smile.gif Nie wiem czemu, ale jakoś chce uniknąć dopisywania kolejnego zdarzenia do komórek - chociaż wtedy wiem jak to zrobić. Założyłem wątek, bo myślałem, że jest jakiś sposób na napisanie skryptu, który będzie "nasłuchiwał" i w przypadku zdarzenia np onChange na komórce, trwale zmieni kolor tła w bieżącym widoku.
trueblue
Nie rozumiem. Nie chcesz dopisywać kolejnych zdarzeń do komórek, ale chciałbyś nasłuchiwać zdarzenie onChange na komórce.
Grandalf00
Nie chce - w sensie w kodzie np <td onchange... Jeżeli da się wykorzystać akutalny ID komórki, to wolałbym takie rozwiązanie.

Jeżeli faktycznie się nie da inaczej niż przez dodatkowy kod onchange dla komórki, to temat można zamknąć smile.gif
trueblue
W drugim poście (najwyżej punktowana odpowiedź) jest kod z wykorzystaniem DOMCharacterModified. Ze zdarzenia możesz wyciągnąć info czy nadrzędny tag dla węzła tekstowego to <td>.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.