Osadź SVG bezpośrednio w swoim HTML
Możesz osadzić SVG bezpośrednio w pliku HTML, eliminując potrzebę stosowania zewnętrznego pliku .svg. Dzięki HTML5 Twoje elementy SVG mogą znajdować się w tym samym DOM, co HTML, i usuniesz niektóre bariery związane z oddzielnym zarządzaniem dwoma bazami kodu. SVG jest potężny i może być dość złożony, tworząc nieograniczone ilustracje i animacje za pomocą prostego języka opartego na XML. Ale w niektórych przypadkach możesz mieć tylko prostą ilustrację, która nie wymaga rygoru zewnętrznego pliku do zarządzania kodem. Tak jak HTML5 umożliwia umieszczanie obrazów bezpośrednio w znacznikach, tak również SVG można osadzać bezpośrednio w kodzie HTML. Patrząc na kod, który jest z tym związany, możesz zobaczyć, że jest to dokładnie to, czego się spodziewałeś. Mamy naszą stronę HTML i zamiast używać tagu
Zapewnij możliwość przeciągania treści w swojej aplikacji
Zaledwie kilka wierszy kodu może zamienić dowolny element na stronie w element do przeciągania. HTML5 sprawia, że funkcja "przeciągnij i upuść" jest obywatelem pierwszej klasy dzięki łatwej implementacji i zupełnie nowym funkcjom, które pomagają dokładnie wiedzieć, co dzieje się z Twoją aplikacją internetową. Dawno minęły czasy pisania setek wierszy kodu, aby umożliwić użytkownikom przeciąganie elementu z jednej części strony do drugiej. HTML5 wykorzystał ten pomysł i przedstawia nam nowoczesną wersję tej odwiecznej interakcji. Dzięki HTML5 implementacja jest łatwa, a dane wokół niej są bogate. Zacznijmy od przyjrzenia się, jak łatwo jest umożliwić przeciąganie dowolnego elementu na stronie:
< div id = "myDraggableItem" draggable = "true" >
to jest treść, którą chcę przeciągać po ekranie
< /div >
I masz to! Czy nie powiedziałem, że to było łatwe? OK, gdyby to było wszystko, co trzeba zrobić z przeciąganiem i upuszczaniem, ten hack byłby skończony. Czytaj dalej, a zobaczysz, że ten hack dostarcza mnóstwa informacji, które ułatwią Ci zaimplementować tę funkcję w swoich aplikacjach już dziś.
Włączanie przeciągania
Przeciąganie i upuszczanie może nie być tak obce dla użytkowników. W wielu przeglądarkach funkcja przeciągania i upuszczania jest domyślnie włączona dla niektórych elementów strony, głównie tagów kotwic i tagów graficznych. Te dwie pozycje mają wyraźne wskazówki do zasobów, z którymi są powiązane. Znacznik zakotwiczenia ma href, który może łatwo stać się zakładką po przeciągnięciu przez pasek zakładek lub skrótem po przeciągnięciu do systemu operacyjnego. Skrót tworzony po przeciągnięciu łącza na pulpit. Obrazy mają podobne zachowanie. Ponieważ znacznik obrazu jest powiązany bezpośrednio z plikiem, można go również przeciągać. Pamiętaj, że nie każdy obraz w aplikacji internetowej jest tagiem obrazu. Wiele obrazów jest osadzonych w CSS z obrazami tła lub jest tworzonych za pomocą tagów SVG lub Canvas. Ten nieodłączny atrybut, który można przeciągać, odnosi się konkretnie do znacznika obrazu. Dodanie tego zachowania do dowolnego elementu jest łatwe. Po prostu dodajesz atrybut draggable do elementu strony i nagle staje się on "przeciągalny"! Przenieśmy tę możliwość na wyższy poziom i spójrzmy na wszystkie wydarzenia, które są publikowane, gdy chwytamy się tego elementu. Potem coś zrobimy z tymi wydarzeniami. Zacznijmy od kilku standardowych znaczników. Będziemy mieć kilka okręgów na stronie, które są tworzone przez dodanie fantazyjnych CSS do niektórych elementów div oraz "kosza na śmieci" utworzonego z innego fantazyjnego elementu div. Oto znaczniki, których używamy:
< div class = "row" >
< div class = "span-6 dragTarg" > < /div >
< /div >
< div class = "row" >
< div class = "span-6 dragItems" >
< div draggable = "true" class = "red" > < /div >
< div draggable = "true" class = "green" > < /div >
< div draggable = "true" class = "blue" > < /div >
< /div >
< /div >
To całkiem proste, a kiedy dodamy CSS. W tym momencie możemy podnieść cele i przeciągnąć je po stronie, ale gdy tylko je upuścimy, wrócą do swoich pierwotnych pozycji. Bez słuchaczy, którzy mogliby złapać, co się dzieje, nie ma się czym hakować. Słuchanie tych wszystkich wspaniałych wydarzeń HTML5 naprawdę przenosi zdarzenia DOM (Document Object Model) na wyższy poziom, dostarczając dogłębne zdarzenia dotyczące wszystkich interakcji. Samo przeciągnij i upuść ma powiązane z nim następujące zdarzenia:
dragstart
drag
dragenter
dragleave
dragover
drop
dragend
Przyjrzyjmy się kilku z tych wydarzeń, stosując słuchaczy. Aby to osiągnąć, dodamy kilka wierszy JavaScript do tagu skryptu na naszej stronie. Zaczniemy od dodania kilku słuchaczy do elementów, które będzie można przeciągać:
var circle = document.querySelectorAll ('. dragItems div');
for (var i = 0; i
circle [i] .addEventListener ('dragstart', startDrag, false);
circle [i] .addEventListener ('dragend', endDrag, false);
}
Zaczęliśmy od selektora zapytania, który tworzy kolekcję naszych kręgów, a następnie przejrzeliśmy każdy z nich, aby dodać do nich dwóch różnych detektorów: pierwszy nasłuchuje zdarzenia, które jest publikowane, gdy po raz pierwszy zaczynamy przeciągać element, a drugi nasłuchuje zdarzenia, gdy przestajemy przeciągać element. Każdy słuchacz wywoła swoją odpowiednią funkcję:
function startDrag (event) {
this.style.border = '5px jednolity różowy';
}
function endDrag (event) {
this.style.display = 'none';
}
Tutaj dodaliśmy trochę dodatkowego kontekstu do elementów podczas przeciągania, aby podkreślić, który element jest przenoszony. W tym przypadku, kiedy zaczynamy przeciągać nasz okrąg, zmieniamy obramowanie na różową przerywaną linię, a kiedy kończymy przeciąganie, dodajemy display = 'none' do elementu div, aby wyglądał, jakby zniknął z DOM. Pamiętaj, że te zdarzenia są powiązane z przeciąganymi elementami. Mamy również do czynienia z dodatkowym elementem strony, koszem na śmieci. Ustawimy ten div jako cel przeciągania. Oto kod JavaScript, którego będziemy potrzebować:
var dragTarg = document.querySelector ('. dragTarg');
dragTarg.addEventListener ('dragenter', function (e) {
this.style.border = '3px #aaa przerywana'});
dragTarg.addEventListener ('dragleave', function (e) {
this.style.border = 3px jednolicie czarny ''});
Ta interakcja jest dość prosta. Identyfikujemy nasz element za pomocą selektora zapytania, a następnie dodajemy do niego dwa detektory. Pierwsza określa, co się dzieje, gdy przeciągamy element, dowolny element, na element, a druga określa, co się dzieje, gdy publikowane jest zdarzenie, które mówi, że przeciągany element nie znajduje się już nad naszym elementem. Wszystko, co robimy w okresie pomiędzy tymi wydarzeniami, to zmiana koloru i stylu obramowania wokół zewnętrznej strony div. To daje użytkownikowi wizualną wskazówkę, że przeciąga element na stronie. Zapamiętaj, strona może zawierać inne elementy do przeciągania (takie jak obraz lub link), które po przeciągnięciu nad koszem na śmieci aktywują zdarzenia dragenter i dragleave. Kiedy łączymy ten kod razem, mamy kilka elementów na stronie, które wchodzą ze sobą w interakcje, gdy je przeciągamy. Na przykład, możemy przeciągnąć dowolne kółko dookoła strony, a kiedy przekroczy kosz, kosz zmieni swój stan; a kiedy puścimy przeciągany element, znika on ze strony. Zrobiliśmy to wszystko za pomocą zaledwie kilku wierszy kodu. Kto nie lubi HTML5!
Zaktualizuj DOM za pomocą obiektu transferu danych typu "przeciągnij i upuść"
Przeciąganie i upuszczanie HTML5 zapewnia prawdziwą relację między przeciągniętym elementem a strefą upuszczania. Ten hack pokazuje, jak przesyłać dane między nimi za pomocą przeciągania danych, a następnie aktualizować DOM na podstawie przesyłanych informacji. Jak można się domyślić, przeciąganie i upuszczanie HTML5 zapewnia znacznie bogatszą interakcję niż to, co było dostępne w przeszłości przy użyciu samego JavaScript. HTML5 publikuje mnóstwo zdarzeń DOM, które mówią nam, co się dzieje po drodze. Wiele razy przeciągasz element, aby przenieść go w inne miejsce na stronie. Wymaga to, aby przeciągany przedmiot i strefa upuszczania mogły przekazywać odpowiednie informacje. Na szczęście HTML5 ma do tego interfejs API! W przypadku tego hacka zaczniemy od czterech elementów na stronie: upuszczanego (do którego chcemy upuścić elementy), który ma wyglądać jak mój kosz na śmieci oraz trzech elementów do przeciągania, które mają wyglądać jak kolorowe kulki. Spójrzmy na znaczniki:
< div class="row" >
< div class="span-6 dragTarg" >< /div >
< /div >
< div class="row" >
< div class="span-6 dragItems" >
< div draggable="true" class="red" >< /div >
< div draggable="true" class="green" >< /div >
< div draggable="true" class="blue" >< /div >
< /div >
< /div >
Zauważ, że wszystkie nasze elementy div stylizowane na kolorowe kulki mają atrybut draggable ustawiony na true. Umożliwia to przeciąganie ich po stronie. Zdarzenia odgrywają dużą rolę w tej interakcji (aby uzyskać więcej informacji na temat wydarzeń, które są publikowane podczas przeciągania i upuszczania, przeczytaj "Umożliwianie przeciągania dowolnej zawartości w aplikacji"). Aby uchwycić wydarzenia, które są publikowane podczas przeciągania elementów, dodajemy kilku słuchaczy do strony:
function startDrag(event) {
this.style.border = '5px solid pink';
}
function endDrag(event) {
this.style.border = '';
}
var circles = document.querySelectorAll('.dragItems div');
for(var i=0;i
circles[i].addEventListener('dragstart', startDrag, false);
circles[i].addEventListener('dragend', endDrag, false);
}
Jest to dość prosty skrypt, który dodaje słuchaczy do początku i końca przeciągania każdego elementu. Funkcja startDrag zmienia obramowanie elementu podczas jego przeciągania, a funkcja endDrag zmienia ją z powrotem po zakończeniu. Kontynuujmy i dodajmy kilku słuchaczy do naszego bloku śmieci, który wyznaczyliśmy jako naszą strefę zrzutu:
var dragTarg = document.querySelector('.dragTarg');
dragTarg.addEventListener('dragenter', function(e){
this.style.border = '3px #aaa dashed'});
dragTarg.addEventListener('dragleave', function(e){
this.style.border = '3px solid black'});
Te dwa odbiorniki zostaną dodane do strefy upuszczania. Ponownie zmieniają tylko wygląd przedmiotów (nie dodano jeszcze żadnej dodatkowej funkcjonalności). Strefa upuszczania zmienia się podczas przeciągania (w tym przypadku z ciągłej ramki na przerywaną) i zmienia się z powrotem, gdy element nie jest już nad nią. Kiedy połączymy cały ten kod razem, mamy ładny, ładny obraz scenariusza przeciągania.
Przychodzące: obiekt transferu danych
W tym momencie możesz nie być zadowolony z tego hackowania: prawdopodobnie doszedłeś do wniosku, że możesz dobrze przeciągnąć element, ale ta możliwość nie jest zbyt imponująca, jeśli nie możesz go gdzieś upuścić. Chcemy, aby elementy DIV z kolorowych kulek zmieniały pozycję w DOM, gdy są przeciągane i upuszczane. Aby tak się stało, musimy mieć element do przeciągania, który może przekazywać informacje do strefy upuszczania. Wchodzi obiekt transferu danych. Autorzy specyfikacji HTML5 pomyśleli o wszystkim, nawet o tym, jak przesyłać dane między obiektem przeciągania a strefą upuszczania. Obiekt transferu danych przechowuje dane, które są wysyłane w zdarzeniu przeciągania. Element nasłuchujący przeciągany element ustawia transfer danych w zdarzeniu dragstart; dane są odczytywane w przypadku upuszczenia. Wykonujemy proste wezwanie, aby ustawić dane:
e.dataTransfer.setData (format, data)
Powoduje to ustawienie zawartości obiektu na typ MIME i ładunek danych przekazany jako jego argumenty. W naszym przypadku chcemy, aby te dane identyfikowały informacje o samym elemencie przeciągania, abyśmy mogli przenieść go do DOM, gdy nastąpi faktyczne upuszczenie. Wróćmy do naszego przykładowego kodu i zobaczmy, czy możemy podłączyć to do naszego zdarzenia przeciągania:
function startDrag(event) {
this.style.border = '5px solid pink';
event.dataTransfer.setData("text", this.className);
}
function endDrag(event) {
this.style.border = '';
}
var circles = document.querySelectorAll('.dragItems div');
for(var i=0;i
circles[i].addEventListener('dragstart', startDrag, false);
circles[i].addEventListener('dragend', endDrag, false);
}
Wszystko, co tu naprawdę zrobiliśmy, to dodanie jednej linii kodu. Ustawiamy typ MIME na tekst (ponieważ przekazujemy ciąg znaków), a następnie mamy element przekazujący dane o sobie - w tym przypadku o nazwie klasy. Użyjemy nazwy klasy do identyfikacji obiektu w DOM. Publikowanie danych nie jest zbyt przydatne, jeśli nic ich nie odczytuje. Więc naszym następnym krokiem jest przeniesienie zawartości po wykonaniu upuszczenia. W tym celu skonfigurujemy detektor zdarzenia drop. Ten słuchacz trafia do strefy upuszczania. Mamy już zdarzenie dragenter i dragleave w naszej strefie upuszczania, ale potrzebujemy słuchacza, aby dołączyć do zdarzenia drop. Oto nasz dodatkowy kod:
function dropit(event){
event.preventDefault()
var myElement = document.querySelector('.dragItemsB .'
+event.dataTransfer.getData('text');
this.appendChild(myElement), false);
};
dragTarg.addEventListener('dragover', function(e){
e.preventDefault();
});
dragTarg.addEventListener('drop', dropit, false);
Być może zauważyłeś, że obsłużyliśmy dwóch różnych słuchaczy. Najpierw dodaliśmy detektor dragover, którego jedynym celem jest zapobieganie domyślnej akcji dragover. Jest to konieczne, aby ujawnić zdarzenie upuszczania, które ponownie jest jedynym miejscem, w którym możesz mieć dostęp do obiektu przesyłania danych, który opublikowałeś w swoim dragstart.
Funkcjonalność jest dość prosta. Używamy nazwy klasy, którą wyciągnęliśmy z obiektu transferu danych, aby znaleźć nasz element do przeciągania w DOM. Następnie wykonujemy prostą metodę appendChild, aby umieścić ten element w strefie upuszczania. Gdy znajdzie się w strefie zrzutu, nasz CSS włącza się, aby zamienić tę kolorową piłkę w kolorową płaską linię. Po upadku strefa zrzutu.
Atrybut strefy zrzutu
Oto dodatkowa ciekawostka na temat przeciągania i upuszczania. Chociaż może to być dla użytkowników przyjemny i intuicyjny sposób pracy z aplikacją, wielu użytkowników może uzyskiwać dostęp do witryny w inny sposób, na przykład za pomocą czytnika ekranu. HTML5 dodał atrybut, który zapewni dodatkową przejrzystość tym użytkownikom. Dodano atrybut dropzone, aby zidentyfikować obszary dokumentu, w których można upuszczać towary. Pomaga to nietradycyjnym interfejsom zrozumieć, gdzie można umieścić elementy na stronie. Zaktualizujmy naszą strefę zrzutu, aby z niej skorzystać
< div class="row" >
< div class="span-6 dragTarg" dropzone="true" >< /div >
< /div >
Nie ekscytuj się zbytnio - dodanie tego atrybutu w żadnym wypadku nie sprawia, że ten element div jest bardziej strefą upuszczania niż był. Wciąż potrzebujemy do tego naszych słuchaczy. Ten atrybut dostarcza raczej dodatkowych informacji i sprawia, że nasza strona jest znacznie bardziej dostępna.
Przeciągaj pliki do i z aplikacji internetowej
Nie jesteś już ograniczony ograniczeniami okna przeglądarki. Przeciąganie i upuszczanie HTML5 może przenosić pliki z chmury na komputer, a pliki z komputera do chmury - wszystko za pomocą zaledwie kilku wierszy JavaScript. HTML5 ma moc przetwarzania danych bezpośrednio w przeglądarce, bez wchodzenia na serwer. Od tekstu po obrazy i wideo - HTML5 ma moc. Oprócz tego funkcja przeciągania i upuszczania HTML5 zapewnia nam łatwy interfejs do pobierania danych do i z przeglądarki. Po prostu pobieramy dane z naszego systemu operacyjnego i umieszczamy je w naszej przeglądarce. W tym hacku będziemy przesyłać pliki do systemu operacyjnego z naszej przeglądarki, a następnie z powrotem do naszej przeglądarki z systemu operacyjnego. Zacznijmy od przeciągnięcia danych do naszego systemu operacyjnego z przeglądarki.
Przywracanie plików do domu
Możliwość przeciągania treści z przeglądarki do naszego systemu operacyjnego zaczyna się od pojedynczego elementu w naszej aplikacji. Każdy plik, który chcemy ściągnąć z chmury, musi być powiązany z elementem w takiej czy innej formie. W przypadku tego hacka zaczniemy od trzech elementów div na naszej stronie, wszystkich stylizowanych na kolorowe kulki. Każdy element zostanie powiązany z plikiem tekstowym w chmurze. Spójrzmy na nasze znaczniki:
< div class = "span-6 dragItemsC" >
< div class = "red" draggable = "true" data-downloadurl = "application / octet-stream: colorRed.txt:
to jest kolor czerwony " >
< /div >
< div class = "green" draggable = "true" data-downloadurl = "aplikacja / strumień oktetu: colorGreen.txt: http://chapter6.boyofgreen.c9.io/assets/test.txt " >
< /div >
< div class = "blue" draggable = "true" data-downloadurl = "application / octet-stream: test.txt: http: //thecssninja.com/gmail_dragout/Eadui.ttf " >
< /div >
< /div >
Znaczniki są dość proste i renderowane w naszej przeglądarce.
Przyjrzyjmy się nieco naszym atrybutom. Pierwszym atrybutem każdego elementu div jest atrybut draggable, ustawiony na true. Jest to podstawowy atrybut funkcji przeciągnij i upuść, ponieważ umożliwia nam wybranie elementu ze strony i przeciągnięcie go. Niektóre elementy, takie jak obrazy i href, są domyślnie przeciągane. W rzeczywistości, jeśli przeciągniemy obraz lub href do systemu operacyjnego, pojawi się plik. W przypadku obrazu kopiowałby obraz z chmury, a dla href stanowiłby skrót do strony internetowej, na którą wskazywał tag linku. W naszym przypadku używamy elementów div, więc atrybut jest konieczny. Drugi atrybut, który widzimy, to data-downloadurl, a każdy z tych atrybutów wskazuje na adres URL pliku, który chcemy pobrać z chmury. Jeśli przeczytałeś niektóre z wcześniejszych hacków, możesz rozpoznać format "data-" jako niestandardowy atrybut danych. To kolejna funkcja HTML5, która pozwala nam dodawać dodatkowe dane do dowolnego elementu w naszym DOM. W tym przypadku używamy go do przechowywania naszego adresu URL. Gdybyś załadował tę stronę teraz, byłbyś w stanie przeciągnąć te elementy div po stronie, ale gdybyś spróbował przeciągnąć je na pulpit, nic by się nie stało. Aby umożliwić przesyłanie plików danych, musimy dodać kilka słuchaczy typu "przeciągnij i upuść". Dodamy do naszej strony kilka wierszy kodu JavaScript, który dodaje detektory do każdego elementu div. Słuchacze uruchomią prostą funkcjonalność, aby pomóc naszemu dropowi wiedzieć, co upuścić.
function startDrag (event) {
event.dataTransfer.setData ("DownloadURL", this.getAttribute ("data-downloadurl"))
};
var circle = document.querySelectorAll ('. dragItems div');
for (var i = 0; i
circle [i] .addEventListener ('dragstart', startDrag, false);
};
Przejdźmy przez to, co się tutaj dzieje. Słuchacze przyłączają się do zdarzenia dragstart. Zdarzenie dragstart jest ważne w tym procesie, ponieważ jest to jedyny punkt przeciągania i upuszczania, w którym można dodać dane do obiektu dataTransfer. (Aby uzyskać więcej informacji na temat obiektu przesyłania danych, zobacz [Hack # 56].) W tym przypadku dołączamy detektor, który odpala funkcję startDrag. Ta funkcja zawiera tylko jeden wiersz kodu, który pobiera ciąg data-downloadurl z każdego elementu i dodaje go do atrybutu obiektu dataTransfer o nazwie DownloadURL. Aby to osiągnąć, używamy prostej metody setData. Gdy mamy już tę wartość w obiekcie dataTransfer, przejmuje ją nasza przeglądarka obsługująca HTML5. Zobaczmy teraz, co się stanie, gdy przeciągniemy jeden z tych elementów poza okno przeglądarki. Zamiast otrzymywać symbol "niedozwolone" podczas przeciągania, otrzymujemy symbol wskaźnika, który mówi nam, że wszystko jest w porządku w świecie przeciągania i upuszczania. Jeszcze lepiej, kiedy już upuścisz element poza okno przeglądarki, widzimy, że plik tekstowy z chmury pojawia się w naszym systemie plików OS (w tym przypadku na pulpicie). To magia przeciągania i upuszczania!
Przywracanie plików z powrotem do przeglądarki
Wow, teraz, gdy mamy możliwość przenoszenia plików z chmury do naszego systemu operacyjnego, wykorzystajmy część tej mocy HTML5, aby przenieść do przeglądarki pliki, które zapisaliśmy lokalnie. Należy pamiętać, że następnym krokiem nie jest przeniesienie plików do chmury; wymagałoby to innego hackowania. To, co tutaj robimy, to przenoszenie plików z systemu operacyjnego do przeglądarki, abyśmy mogli manipulować tymi danymi. Zaczniemy od pliku tekstowego o nazwie coolKid.txt, który znajduje się na pulpicie. W tym pliku ext jest prosta linia, która mówi: "Jeff to naprawdę fajny dzieciak"; w tym momencie chcesz umieścić ten tekst w polu tekstowym w naszej aplikacji, abyśmy mogli pracować z tekstem w przeglądarce. Tym razem znaczniki, od których zaczniemy, są bardzo proste. To jest obszar tekstowy:
< div class = "row" >
< textarea id = "showDrop" > < /textarea >
< /div >
Jedynym atrybutem w tym obszarze tekstowym jest id, a zgadłeś, dodamy do niego słuchaczy. Przejdźmy od razu do JavaScript, w którym dodajemy słuchaczy:
var showDrop = document.getElementById ('showDrop');
showDrop.addEventListener ('dragover', function (e) {
e.preventDefault ()
});
showDrop.addEventListener ('drop', readData, false);
Gdybyśmy nie dodali JavaScript do tej strony i przeciągnęlibyśmy nasz plik tekstowy na nasz obszar tekstowy, przeglądarka potraktuje przeciągnięty plik jako hiperłącze i spróbuje załadować go w oknie przeglądarki. W naszym przypadku opuścilibyśmy aplikację i załadowalibyśmy naszą linię tekstu, która mówi: "Jeff to naprawdę fajny dzieciak". Jak widać w poprzednim kodzie, dodajemy dwa detektory do tego elementu. Pierwszy to nasłuchiwanie przeciągania, które istnieje tylko z jednego powodu: aby zapobiec wystąpieniu domyślnej akcji. Bez detektora zdarzenie drop nigdy nie zostanie uruchomione. Następny detektor wywołuje funkcję, która zajmie się przeniesieniem danych do naszej aplikacji HTML5:
var readData = function (e) {
e.stopPropagation (); // Powstrzymuje niektóre przeglądarki przed przekierowaniem.
e.preventDefault ();
var filelist = e.dataTransfer.files;
if (! filelist) {return}
var filelist = event.dataTransfer.files;
if (filelist.length> 0) {
var plik = filelist [0];
var filereader = nowy FileReader ();
filereader.myTarg = document.getElementById ('showDrop');
var myData = function (event) {
this.myTarg.value = this.result
};
filereader.onloadend = myData;
filereader.readAsText (file);
};
};
Ta funkcja wydaje się stosunkowo złożona w porównaniu z jedną linijką kodu, która wymagała przeniesienia pliku na nasz pulpit, więc przejdźmy przez to, co się dzieje. Pierwszą rzeczą, którą musimy zrobić, jest powstrzymanie przeglądarki przed próbą załadowania pliku w oknie przeglądarki. Mamy do tego dwie metody, ponieważ niektóre przeglądarki wymagają obu:
e.stopPropagation (); // Powstrzymuje niektóre przeglądarki przed przekierowaniem.
e.preventDefault ();
Następnie zbudujemy wskaźnik (użyjemy tego odniesienia kilka razy) do naszego obiektu dataTransfer, który prawdopodobnie będziesz pamiętać, kiedy sprowadziłeś plik do systemu operacyjnego. W tym obiekcie powinna znajdować się tablica o nazwie files, która będzie zawierała listę wszystkich plików (tak, możemy mieć więcej niż jeden), które są przeciągane do tego elementu:
var filelist = e.dataTransfer.files;
Nie wszystko, co jest przeciągane i upuszczane w oknie, jest plikiem, więc następnym krokiem jest sprawdzenie, czy przesyłamy plik; jeśli tak, długość tej tablicy będzie wynosić co najmniej 1. Owijamy resztę naszego kodu w tym warunku if, ponieważ jeśli nie ma pliku w przeciągnięciu, nie pozostaje nic innego do zrobienia:
if (filelist.length> 0)
.....
}
W następnym kroku wywołamy metodę, która pomoże nam odczytać plik i wydobyć z niego potrzebne nam dane. Nazywa się to metodą FileReader, więc wywołamy ją jako zmienną o nazwie filereader:
var filereader = new FileReader ();
Kilka następnych wierszy kodu dotyczy czytnika plików. Pierwszą rzeczą, którą zrobimy, jest zbudowanie odniesienia do miejsca, w którym chcemy, aby tekst pojawił się - w tym przypadku naszego obszaru tekstowego - w obiekcie filereader. Ułatwi to późniejsze odniesienie.
filereader.myTarg = document.getElementById ('showDrop');
To jest prawdopodobnie najtrudniejsza część: zamierzamy ustawić zamknięcie, które jest w zasadzie częściowo wykonaną funkcją, której będziemy używać po pełnym załadowaniu pliku w przeglądarce. Ta metoda przyjmuje inną wartość, którą dodamy do obiektu filereader, zwaną wynikami. Wartość wyniku będzie w rzeczywistości tekstem z naszego pliku, który za chwilę wyciągniemy.
var myData = function (event) {this.myTarg.value = this.result};
Ostatnie dwa wiersze kodu uruchamiają zamknięcie o nazwie myData w zdarzeniu loadEnd, a następnie uruchamiają metodę readAsText, która ma odniesienie do rzeczywistego pliku w środku:
filereader.onloadend = myData;
filereader.readAsText (filelist [0]);
Istnieją nieskończone możliwości, co można zrobić z plikami lokalnymi po umieszczeniu ich w przeglądarce. W takim przypadku mogę przesłać te dane na serwer lub mogę je jeszcze bardziej edytować i ponownie przeciągnąć lokalnie. HTML5 przenosi funkcjonalność, która wcześniej była ograniczona do serwera, bezpośrednio do Twojej przeglądarki.
Dowolny element na swojej stronie może być dostosowywany przez użytkownika dzięki zawartości do edycji
Wprowadzane dane przez użytkownika były kiedyś ograniczone do elementów formularza, takich jak dane wejściowe i obszary tekstowe, ale dzięki funkcji Edytowalna zawartość HTML5 każdy element strony może stać się edytowalny. Użyj tej funkcji, aby umożliwić użytkownikom dostosowywanie swoich stron. HTML5 otwiera drzwi do ostatecznego dostosowania dla naszych użytkowników. Jedną z nowych funkcji, która to szczególnie ułatwia, jest zawartość edytowalna. Może to być również jedna z najprostszych funkcji do zaimplementowania. W tym hacku chcemy, aby nasi użytkownicy mogli dostosowywać zawartość swoich stron - spersonalizować ich stronę, jeśli chcesz. Aby było to możliwe, udostępnimy główną zawartość strony do edycji. Spójrzmy na nasze znaczniki:
< div contenteditable = "true" class = "row" id = "editable" >
< p >
To naprawdę świetna książka.
Tak się cieszę, że to czytam, ponieważ:
< /p >
< ul >
< li > to jest dowcipne < /li >
< li > Jestem teraz dobrze poinformowany o HTML5 < /li >
< li > autorzy to świetni faceci < /li >
< /ul >
< /div >
Być może zauważyłeś nowy atrybut w naszym module div kontenera, który mówi, że contenteditable = "true"; ten atrybut jest wszystkim, czego potrzebujemy, aby nasze treści były dostosowywane przez użytkowników. Tak, jakby pisali w polu tekstowym, nasi użytkownicy mogą teraz edytować tę sekcję strony internetowej bezpośrednio w przeglądarce, bez konieczności stosowania dodatkowych narzędzi. HTML jest na tyle inteligentny, że wie, jaką część znaczników edytuje i dopasowuje nową zawartość do elementów, w których się znajdują. Na przykład, jeśli użytkownik znajduje się na nieuporządkowanej liście (ul) i naciśnie klawisz Return, doda kolejną li do listy. Naciśnięcie klawisza Return w akapicie tworzy nowy akapit i tak dalej. Teraz, w tym momencie, jeśli użytkownik odświeży stronę, cała zaktualizowana zawartość zniknie i zostanie ponownie załadowana z serwera. Należy zauważyć, że zawartość edytowalna nie jest tylnymi drzwiami do aktualizacji zawartości na serwerze. Nie chcemy aktualizować danych w chmurze, ale chcemy, aby pozostały one dla tego użytkownika, więc przejdziemy do innego narzędzia z zestawu narzędzi HTML5, zwanego pamięcią lokalną. Pamięć lokalna umożliwia nam zapisywanie danych bezpośrednio w przeglądarce. W przeciwieństwie do plików cookie, które z czasem są usuwane, lokalna pamięć jest przechowywana do momentu, gdy Ty (twórca aplikacji) lub użytkownik celowo ją usuniesz. Przeniesiemy zawartość zaktualizowaną przez użytkownika w tym edytowalnym obszarze i zapiszemy ją w pamięci lokalnej, abyśmy mogli jej ponownie użyć. Aby to osiągnąć, wyciągniemy kilka wierszy JavaScript:
var myEdit = document.getElementById('editable');
var setEditMemory = function(content){
localStorage.setItem("myContent", myEdit.innerHTML);
};
myEdit.addEventListener('blur',setEditMemory);
Zasadniczo dodajemy odbiornik do zdarzenia rozmycia naszego edytowalnego elementu div. Zwykle elementy div nie mają zdarzeń rozmycia (ponieważ nie mogą one naturalnie skupiać się na fokusie), ale ponieważ udostępniliśmy nasz element div do edycji, automatycznie przejmuje fokus i dlatego po wyjściu z edytowalnej zawartości jest uruchamiane zdarzenie rozmycia. Ten odbiornik po prostu pobiera zawartość z div i przechowuje ją jako ciąg w pamięci lokalnej pod nazwą wartości myContent. Pomyślnie zapisaliśmy zawartość; teraz musimy go tylko użyć do zaktualizowania zawartości strony, gdy użytkownik ponownie odwiedzi naszą stronę. W tym celu dodamy kilka dodatkowych wierszy JavaScript podczas ładowania strony:
if(localStorage.getItem("myContent")){
myEdit.innerHTML = localStorage.getItem("myContent");
}
Po prostu sprawdzamy, czy nasza wartość myContent została utworzona. Jeśli tak, wiemy, że użytkownik odwiedził wcześniej tę stronę i mógł zaktualizować tę zawartość. Więc pobieramy wartość myContent z lokalnej pamięci i aktualizujemy nasz edytowalny div z zawartością. Teraz użytkownik zobaczy zaktualizowaną zawartość za każdym razem, gdy wróci na tę stronę. Magiczny!
Czarujące!
Kolejną fajną funkcją, która jest dostępna w edytowalnej treści, jest sprawdzanie pisowni. Zgadza się, wbudowane sprawdzanie pisowni. Podobnie jak w edytorze tekstu na komputerze, jeśli błędnie wpiszesz słowo w HTML5, pojawi się pod nim falista linia, a jeśli klikniesz to słowo prawym przyciskiem myszy, możesz wybrać słowo zastępcze z wbudowanego słownika przeglądarki. Jeśli z jakiegoś powodu zdecydujesz, że nie chcesz tej funkcji w swoim dokumencie, możesz ją po prostu wyłączyć, ustawiając atrybut sprawdzania pisowni na fałsz:
< div class="row" id="editable" contentEditable="true" spellcheck="false" >...< /div >
HTML5 dał nam większość edytora tekstu bezpośrednio w naszej przeglądarce! Pomyśl tylko o możliwościach.
Zmień swoją stronę internetową w edytor WYSIWYG
Ułatw aktualizowanie zawartości strony internetowej bez opuszczania przeglądarki. Kilka prostych linii kodu może zmienić twoją stronę internetową w edytor stron internetowych. Kiedyś redaktorzy WYSIWYG byli wściekli. Niestety, przejście od tego, co widziałeś w swoim edytorze do tego, co widziałeś w przeglądarce, było zawsze trudne. HTML5 zapewnia klucz do działania.
Udostępnij stronę do edycji
Pierwszym krokiem do przekształcenia strony internetowej w edytor stron internetowych jest umożliwienie edycji całej zawartości strony internetowej. Podczas poprzednich hacków rozmawialiśmy o tym, co jest potrzebne, aby udostępnić sekcję naszej strony do edycji, i równie łatwo jest udostępnić do edycji całą naszą stronę. Zajmuje tylko jedną linię kodu:
document.designMode = "on"
Aby więc nieco kontrolować tę funkcję, zaczniemy od strony internetowej z fantastyczną zawartością. Użyjemy dodanych elementów sterujących, aby włączyć i wyłączyć tryb projektowania naszego dokumentu oraz wyeksportować kod. Spójrzmy na znaczniki naszych elementów sterujących strony:
< div class="row" >
< p >
use this button to make your entire document editable or turn it off:
< /p >
< p >< button class="btn" id="makeEdit" >toggle design mode< /buton >< /p >
< p >use this button to show the markup< /p >
< p >< button class="btn" id="showMarkup" >show my markup< /buton >< /p >
< p >< textarea id="exportContent" >< /textarea >< /p >
< /div >
Zasadniczo mamy tekst, dwa przyciski i obszar tekstowy. Przyciski będą wymagały słuchaczy, aby mieć funkcjonalność. Spójrzmy na JavaScript, który mamy dla tej aplikacji:
var button = document.getElementById ('makeEdit');
button.addEventListener ('click', function (e) {
if (document.designMode === "off") {
document.designMode = "on"
}else{
document.designMode = "off"
}
});
var showMarkup = document.getElementById ('showMarkup');
showMarkup.addEventListener ('click', function (e) {
var str = '< HTML >' + document.documentElement.innerHTML + '< /HTML >'
document.getElementById ('exportContent'). value = str;
});
Pierwszy przycisk służy do przełączania widoku projektu. Mamy detektor dołączony do zdarzenia kliknięcia przycisku, który wykonuje prosty JavaScript. Sprawdza, czy tryb projektowania jest wyłączony, a jeśli tak, włącza go. Jeśli tryb projektowania jest włączony, wyłącza go. Drugi przycisk ma również detektor, który uruchamia funkcjonalność eksportu zawartości strony. Logika jest dość prosta. W dowolnym momencie można kliknąć ten przycisk, a my uruchomimy JavaScript, który skopiuje całą zawartość (HTML, wszelkie skrypty wbudowane itp.) Z elementu documentElement. To daje nam całą zawartość wewnątrz znaczników HTML jako ciąg. Pobierany jest ciąg treści, tagi HTML i znacznik
Przejmij kontrolę nad przyciskami historii przeglądarki dzięki historii sesji HTML5
HTML5 zapewnia elegancki sposób programowego sterowania stosem historii w aplikacji internetowej. Ile razy byłeś w świetnej aplikacji internetowej, tylko po to, by kliknąć przycisk Wstecz w przeglądarce, myśląc, że cofnie ostatnią nawigację, ale zamiast tego przeniesie Cię z powrotem do ostatniej witryny? Historia sesji HTML5 zapewnia łatwy interfejs do zarządzania historią w aplikacji. W przeszłości programiści robili trudne rzeczy z aplikacjami, aby im to umożliwić i "oszukać" zachowanie historii przeglądarki, używając znaczników hash w adresie URL. Zwykle programista dodaje coś w rodzaju "#mynewurl" na końcu adresu URL swojej strony i dodaje to nową pozycję na stosie historii. Za każdym razem, gdy dodajesz "#" do adresu URL, jest on traktowany jako pozycja na stronie i nie opuszcza strony po kliknięciu przycisku Wstecz. Historia sesji umożliwia zaprogramowanie tego zachowania bezpośrednio w aplikacji. Możesz nawet zaktualizować adres URL swojej strony bez odświeżania strony (jednak zachowaj ostrożność;
nie chcesz tworzyć adresów URL, których serwer nie może rozwiązać, na wypadek, gdyby użytkownik dodał je do zakładek lub próbował wrócić później czas). Dla tego hacka mamy tag < canvas >, na którym zbudujemy uśmiechniętą buźkę. Wykonamy każdy krok procesu kompilacji, klikając przycisk Wstecz w przeglądarce.
Uśmiechnij się, to historia!
Zaczniemy od strony, która nie ma nagłówka i zawiera tylko trochę treści. Zwykle kliknięcie przycisku Wstecz w tym momencie spowoduje powrót do strony, na której byłeś przed odwiedzeniem tej witryny. Więc dodamy kilka nowych wpisów do naszego stosu historii, abyśmy mogli zacząć:
window.history.pushState ('leftEye', 'makeLeftEye');
window.history.pushState ('rightEye', 'makeRightEye');
window.history.pushState ('mouth', 'makeMouth');
window.history.pushState ('face', 'makeface');
window.history.pushState ('ready', 'letsgo');
Tutaj wprowadziliśmy pięć nowych wpisów do naszego stosu historii. W tym momencie, gdybyśmy odświeżyli naszą stronę, moglibyśmy kliknąć przycisk Wstecz pięć razy, zanim przeniesie nas z powrotem do poprzedniej witryny. Jednak nic się nie zmieni na stronie po kliknięciu przycisku Wstecz. W tym celu musimy ustawić słuchacza:
window.addEventListener ("popstate", drawStack, false);
Ten detektor będzie uruchamiał funkcję drawStack po każdym kliknięciu przycisku Wstecz. Ponieważ jest to zdarzenie, po prostu automatycznie przekaże obiekt zdarzenia jako zdarzenie kliknięcia:
var drawStack = function(){
switch(window.history.state)
{
case 'leftEye':
makeLeftEye();
break;
case 'rightEye':
makeRightEye();
break;
case 'mouth':
makeMouth();
break;
case 'face':
makeFace();
break;
default: break
}
};
Wewnątrz tej metody faktycznie widzimy instrukcję switch. Ta instrukcja switch służy do określenia, który krok naszego procesu jest wywoływany za każdym razem, gdy kliknięty zostanie przycisk Wstecz, oraz jaka metoda zostanie uruchomiona w celu obsługi funkcji. Jeśli spojrzysz wstecz, kiedy dodaliśmy wpisy do stosu historii, zobaczysz, że każdy z nich wszedł z nazwą wartości i wartością. Ta instrukcja switch sprawdza nazwę wartości, aby określić, w której pozycji stosu się znajdujemy. Każdy przypadek w tej instrukcji uruchamia jedną z następujących funkcji:
var mySmile = document.getElementById('mySmile2')
var smileCtx = mySmile.getContext('2d');
var makeFace = function(){
smileCtx.beginPath();
smileCtx.fillStyle = '#F1F42E';
smileCtx.arc(100,100,99,0,Math.PI*2); // head
smileCtx.stroke();
smileCtx.fill();
};
var makeMouth = function(){
smileCtx.beginPath();
smileCtx.moveTo(170,100);
smileCtx.arc(100,100,70,0,Math.PI); // Mouth
smileCtx.stroke();
};
var makeLeftEye = function(){
smileCtx.beginPath();
smileCtx.fillStyle = 'black';
smileCtx.moveTo(60, 65);
smileCtx.arc(60,65,12,0,Math.PI*2); // Left eye
smileCtx.fill();
};
var makeRightEye = function (){
smileCtx.beginPath();
smileCtx.fillStyle = 'black';
smileCtx.moveTo(140,65);
smileCtx.arc(140,65,12,0,Math.PI*2); // Right eye
smileCtx.fill();
};
Każda faza rysuje coś nowego. Jeśli ponownie odświeżymy stronę i klikniemy przycisk Wstecz, zobaczymy teraz żółte kółko na stronie. Jeśli nadal będziemy klikać przycisk Wstecz, zostanie narysowany uśmiech, następnie prawe oko, a następnie lewe oko. Po czterokrotnym kliknięciu przycisku Wstecz będziemy mieli pełną uśmiechniętą buźkę.
Jeśli masz bystre oko, być może zauważyłeś, że czterokrotnie kliknęliśmy przycisk Wstecz, ale umieściliśmy pięć wpisów w stosie historii. Możesz pomyśleć, że nadal masz jeden dodatkowy przycisk Wstecz, klikając tę stronę, zanim wrócisz do poprzedniej strony. Mylisz się. Dodatkowy wpis faktycznie obsługuje początkowe ładowanie strony. Zdarzenie uruchamiane dla stanu popstate ma miejsce przy zmianie historii, a nie po kliknięciu przycisku wstecz, więc w rzeczywistości jest uruchamiane po załadowaniu strony, ponieważ ładowanie strony dodaje się do historii.
Inne funkcje historii
Historia sesji ma dużo więcej do zaoferowania niż tylko pojedyncze wydarzenie popowe. Oto kilka podstawowych metod, które można wywołać na stosie historii strony:
window.history.length
Liczba wpisów w historii sesji.
window.history.state
Aktualny stan obiektu.
window.history.go (n)
Przechodzi do tyłu lub do przodu o określoną liczbę kroków. Jeśli podana wartość wynosi 0, załaduje ponownie bieżącą stronę.
window.history.back ()
Cofa się o jeden krok.
window.history.forward ()
Przechodzi do przodu o jeden krok.
window.history.pushState (dane, tytuł [, url])
Wypycha dane określone w argumentach do historii sesji.
window.history.replaceState (dane, tytuł [, adres URL])
Aktualizuje bieżący wpis w historii sesji.
Osadź dane binarne we wbudowanym adresie URL
Adresy URL danych stanowią alternatywę dla odwoływania się do zewnętrznych zasobów za pomocą tagów obrazu i linków. Najbardziej typowy scenariusz obejmuje obrazy, do których można odwoływać się bezpośrednio z dokumentu HTML lub pojedynczego arkusza stylów. Wcześniej zbadaliśmy kompromisy wydajnościowe między sprite′ami CSS i wykorzystaniem identyfikatorów URI danych w zewnętrznych arkuszach stylów. W tym hacku skupimy się na usuwaniu danych obrazu w naszych znacznikach HTML, a nawet zobaczymy kilka różnych sposobów, aby to zrobić, używając różnych implementacji szablonów po stronie serwera. Adresy URL danych są podtypem schematu Uniform Resource Identifier (URI), który osadza dane zasobów w adresie URL jako ciąg zakodowany algorytmem Base64. W przeciwieństwie do tradycyjnych adresów URL wskazujących na zasoby zewnętrzne, takie jak obrazy, arkusze stylów i kod JavaScript, przeglądarka nie wysyła żądania HTTP do zawartości zdalnej. Czasami możemy poprawić wydajność aplikacji internetowych, wykorzystując technikę - na przykład w środowisku, w którym przepustowość połączenia może być ograniczona, na przykład połączenie internetowe na pokładzie amerykańskiego okrętu wojennego. W mobilnych aplikacjach internetowych często korzystne jest również zmniejszenie liczby żądań HTTP poprzez osadzanie mniejszych obrazów na stronie. Ponadto przypadki, w których możesz chcieć dynamicznie generować obrazy po stronie serwera na podstawie unikalnego profilu, pory dnia lub lokalizacji odwiedzającego witrynę, mogą również uzasadniać osadzony obraz. Adresy URL danych mają następującą składnię:
data:[mimetype][;base64],[data]
W tagu Images
W przypadku tego najpierw skorzystamy z usługi online, ręcznie przesyłając obraz do dataurl.net. Po skopiowaniu ciągu danych zakodowanego w Base64 z obszaru tekstowego po lewej stronie, możemy wkleić go do naszego dokumentu (poniższy kod jest skrócony dla zwięzłości, ale pamiętaj, że im większy obraz, tym dłuższy ciąg danych będzie):
< img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD//gA ... / >
W zewnętrznym arkuszu stylów
Teraz użyjemy składni url () w selektorze CSS, podobnie jak w przypadku wywołania zewnętrznego obrazu tła:
#backg {
height: 326px;
background-image:
url("data:image/jpeg;base64,/9j/4SJnRXhpZgAATU0AKgAAAAgADAEAAAMA ...
}
Nie zapomnij odpowiedniego znacznika:
< div id = "backg" >
Przekonwertuj identyfikator URI danych na obiekt BLOB i dołącz go do danych formularza za pomocą XHR2
HTML5 zmienił przeglądarkę internetową w pełnoprawne środowisko wykonawcze. Przy całej tej nowej funkcjonalności klienta potrzebne są sposoby bezpiecznego i programowego przesyłania danych z powrotem na serwer. Ten hack pokazuje, jak to zrobić. Wyobraź sobie, że tworzysz interfejs w witrynie mediów społecznościowych, który umożliwia użytkownikom tworzenie motywów strony profilu z formularza, który dynamicznie generuje style. Chcesz zachować te style w bazie danych na serwerze, przesyłając obrazy w tle za pośrednictwem XMLHttpRequest i ładując je na dodatkowe żądania stron. Aby to zrobić, możesz skorzystać z XHR2 i nowej funkcji, która umożliwia przesyłanie obiektów blob i plików przez dołączenie ich do obiektu FormData. Zanim przejdziemy do szczegółów FormData i XHR2, stwórzmy prosty obiekt Blob. Najpierw wywołamy new w klasie Blob, a następnie przekażemy dane do Bloba. A może prosty styl, w którym nasz tekst jest czerwony?
var stylesblob = new Blob (['body {color: red;}'], {type: 'text / css'});
Teraz utworzymy nowy link, ustawimy kilka atrybutów i dołączymy go gdzieś w dokumencie:
var stylesblob = new Blob(['body{color:red;}'], {type:'text/css'});
Teraz utworzymy nowy link, ustawimy kilka atrybutów i dołączymy go gdzieś w dokumencie:
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = window.URL.createObjectURL(stylesblob);
document.body.appendChild(link);
To jest prosta demonstracja narzędzia Blob, ale co, jeśli musimy dołączyć te dane do formularza i przesłać je na zdalny serwer? Najpierw musimy zająć się formularzem:
< form enctype="multipart/form-data" method="post" name="profileStyle" >
< label >username:< /label >
< input type="email" autocomplete="on" autofocus name="userid" placeholder="email" required/ >
< label >Styles to save!< /label >
< input type="file" name="file" required / >
< /form >
Należy tu zwrócić uwagę na kilka ważnych kwestii. Atrybut enctype wskazuje, że dane będą musiały zostać podzielone na wieloczęściowy element danych. Zauważ też, że wykorzystujemy kilka nowych atrybutów: autofocus i required.
function sendForm() {
var data = new FormData(document.forms.namedItem("profileStyle "));
data.append("myfile", stylesblob);
var req = new XMLHttpRequest();
req.open("POST", "/styleStore", true);
req.onload = function(oEvent) {
if (req.status == 200) {
console.log("Styles Saved!");
} else {
console.log("Error "+req.status+" occurred uploading your file")
};
req.send(data);
}
Wymagania naszej aplikacji obejmują również przesłanie obrazu do oddzielnej zdalnej usługi internetowej. Obraz jest dostępny jako adres URL danych i chcielibyśmy dołączyć go do FormData i wysłać żądanie w tle.
var durl = $("#carter_small").attr("src")
var blob = dataURItoBlob(durl);
Aby więc dalej zademonstrować, najpierw przekonwertujmy nasz dataURI na obiekt Blob, abyśmy mogli dołączyć go do FormData. Przyjrzyjmy się bliżej dataURItoBlob():
function dataURItoBlob(dataURI) {
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0){
byteString = atob(dataURI.split(',')[1]);
}else{
byteString = unescape(dataURI.split(',')[1]);
}
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
var bb = new Blob([ab], {type: mimeString});
return bb;
}
Po przekazaniu referencji do naszej funkcji dataURItoBlob () sprawdzamy, czy jest ona zakodowana w URLE i cofamy ją, jeśli to konieczne. Następnie ustawiamy odniesienie do typu MIME, zapisujemy bajty ciągu do ArrayBuffer i przekazujemy ArrayBuffer do nowego Bloba, wraz z wartością MIME ustawioną na właściwość type. Teraz generujemy nowe FormData i dołączamy blob jako canvasImage:
var fd = new FormData (document.forms [0]);
fd.append ("canvasImage", blob);
Użyj interfejsu API WebStorage, aby utrwalić dane użytkownika
Aplikacje internetowe często potrzebują sposobu na przechowywanie danych. Dzięki interfejsom API LocalStorage i SessionStorage w HTML5 możesz w prosty sposób przechowywać dane w łatwym w użyciu interfejsie API. Trwałość danych w pierwszych dniach aplikacji internetowych opierała się na jednej podstawowej technologii: plikach cookie. Chociaż pliki cookie były serwisowalne, obarczone były obawami dotyczącymi prywatności i ograniczeniami (w zakresie rozmiaru pamięci masowej i ich wpływu na wydajność sieci). Na szczęście HTML5 zapewnia znacznie ulepszony sposób obsługi trwałego przechowywania danych: LocalStorage. Technicznie nazywany WebStorage API, większość ludzi nazywa go LocalStorage. Istnieje również odpowiedni interfejs API o nazwie SessionStorage, który omówimy później.
Podstawy
LocalStorage to na podstawowym poziomie zbiór par nazwa-wartość. Na przykład mogę mieć nazwę "Ulubione piwo" z wartością "Abita Amber". W ten sposób przypominają ciasteczka. W przeciwieństwie do plików cookie same dane nie są wysyłane do serwera na każde żądanie. Zamiast tego JavaScript ma dostęp do pobierania, ustawiania lub usuwania tych wartości w razie potrzeby. Wartości LocalStorage są przechowywane na domenę. Oznacza to, że jeśli foo.com ustawi wartość LocalStorage o nazwie "FavoriteBeer", a goo.com spróbuje odczytać tę wartość, nie będzie w stanie tego zrobić. Goo.com może ustawić własną wartość o nazwie "FavoriteBeer", ale będzie ona istnieć w swoim własnym zbiorze danych i nie będzie zakłócać ani zastępować wartości LocalStorage ustawionych w innych witrynach. Na koniec powinieneś wiedzieć, że LocalStorage jest zapisywane w fizycznym pliku na komputerze użytkownika. Ma to dwie konsekwencje. Po pierwsze, całkowita ilość danych, które można przechowywać w LocalStorage, jest ograniczona. Ten limit różni się w zależności od przeglądarki, ale większość z nich włącza 5 MB (IE 8 pozwala na 10 MB danych użytkownika). Po drugie, odczyt i zapis w LocalStorage to jednowątkowa operacja we / wy na plikach. Zasadniczo "rozsądne" korzystanie z LocalStorage powinno wystarczyć. Podobnie jak pliki cookie były przydatne do przechowywania ustawień i podstawowych zestawów danych, LocalStorage może również pełnić tę samą rolę. Pamiętaj, że nie chcesz przechowywać dużych bloków danych. W tym celu możesz zamiast tego rozważyć interfejs API natywnego systemu plików. Prawdopodobnie najlepszą rzeczą w LocalStorage jest to, jak dobrze jest obsługiwana w różnych przeglądarkach, zarówno stacjonarnych, jak i mobilnych. Według caniuse.com wsparcie to obecnie 88,73%.
API
Masz dwie główne opcje pracy z LocalStorage. Możesz zapisywać i ustawiać wartości, korzystając z bezpośredniego dostępu do obiektu window.localStorage. Oto kilka przykładów:
window.localStorage.favoriteBeer = "Abita";
window.localStorage["favoriteBeer"] = "Abita";
Lub możesz użyć jednej z następujących metod:
setItem(key, value);
getItem(key);
removeItem(key);
clear();
Założę się, że wiesz, co robią pierwsze dwa. Trzeci, removeItem, umożliwia całkowite usunięcie wartości z LocalStorage. I wreszcie, wyczyść usunie wszystkie wartości. Ponownie jednak pamiętaj, że operacje na LocalStorage są specyficzne dla domeny. Wywołanie window.localStorage.clear () podczas odwiedzania foo.com nie spowoduje wyczyszczenia elementów, które zostały ustawione w goo.com. Spójrzmy na prosty przykład.
< !doctype html >
< html >
< head >
< script >
function init() {
//Do we have a value yet?
if(!localStorage.getItem("visits")) localStorage.setItem("visits",0);
//Get and increment the value
var visits = Number(localStorage.getItem("visits")) + 1;
//Display it
document.querySelector("#resultDiv").innerHTML = "You have been here"
+visits + " time(s).";
//And store it back
localStorage.setItem("visits", visits);
}
< /script >
< /head >
< body onload="init()" >
< div id="resultDiv" >< /div >
< /body >
< /html >
Ten szablon uruchamia prostą funkcję, init, po załadowaniu strony. Zaczynamy od sprawdzenia, czy klucz odwiedzin istnieje w localStorage. Jeśli tak nie jest, przyjmujemy wartość domyślną 0. Następnie pobieramy i zwiększamy wartość. Ponieważ wszystko jest przechowywane jako ciąg, zawijamy wywołanie w konstruktorze Number(), aby upewnić się, że operacja matematyczna działa. Następnie aktualizujemy DOM i wyświetlamy liczbę odwiedzin. Na koniec przechowujemy wartość z powrotem w localStorage. Wynik netto to prosta strona internetowa, która może śledzić, ile razy ją odwiedziłeś. Jeśli otworzysz go w przeglądarce i ponownie załadujesz kilka razy, zobaczysz, że licznik zwiększy się o jeden . Jeśli zamkniesz przeglądarkę i ponownie otworzysz plik HTML, będzie on kontynuowany od miejsca, w którym został przerwany. Wierz lub nie, ale to naprawdę wszystko, co jest potrzebne do API.
Pamięć lokalna i złożone dane
Jedną z rzeczy, nad którymi możesz się zastanawiać, jest sposób przechowywania złożonych danych, takich jak tablice i obiekty. Wartość przekazana do setItem musi być ciągiem. Jak więc przechowywać bardziej złożone wartości? To proste: najpierw serializujesz obiekt. Serializacja odnosi się do konwersji złożonego obiektu na prostszą formę, w naszym przypadku na ciąg. Oczywiście oznacza to, że musisz później deserializować łańcuch z powrotem do jego pierwotnej formy. Sposób serializacji danych zależy od Ciebie. Możesz zbudować własny kod, aby pobrać złożone dane i przekształcić je w ciągi. Na przykład tablice mają natywną metodę toString, która konwertuje dane na ciąg. Niektórzy wolą używać JSON do obsługi tych operacji. Działa z prawie każdą formą danych i podobnie jak localStorage ma przyzwoitą obsługę przeglądarki. (A dla tych z Was, którzy martwią się nieobsługiwanymi przeglądarkami, istnieje wiele bibliotek JSON). W następnym przykładzie formularz z wieloma wartościami jest konwertowany na jeden prosty obiekt, który jest przechowywany w localStorage. Rzućmy okiem na kod, a następnie przejdziemy przez poszczególne części.
< !doctype html >
< html >
< head >
< script >
function init() {
//If we have old data, load it
var oldData = localStorage.getItem("formdata");
if(oldData) {
var realData = JSON.parse(oldData);
document.querySelector("#yourname").value = realData.name;
document.querySelector("#yourage").value = realData.age;
document.querySelector("#youremail").value = realData.email;
document.querySelector("#yourphone").value = realData.telephone;
}
//listen for changes in our form fields
document.querySelector("#myForm").addEventListener("input",
function() {
//get all the fields
var data = {name:document.querySelector("#yourname").value,
age:document.querySelector("#yourage").value,
email:document.querySelector("#youremail").value,
telephone:document.querySelector("#yourphone").value
};
console.dir(data);
localStorage.setItem("formdata", JSON.stringify(data));
},false);
}
< /script >
< /head >
< body onload="init()" >
< form id="myForm" >
< p >
< label for="yourname" >Your Name< /label >
< input type="text" id="yourname" >
< /p >
< p >
< label for="yourage" >Your Age< /label >
< input type="number" id="yourage" min="0" >
< /p >
< p>
< label for="youremail" >Your Email< /label >
< input type="email" id="youremail" >
< /p >
< p >
< label for="yourphone" >Your Phone Number< /label >
< input type="tel" id="yourphone" >
< /p >
< /form >
< /body >
< /html >
Zaczynając od dołu, możesz zobaczyć prosty formularz z czterema unikalnymi polami: imię i nazwisko, wiek, adres e-mail i telefon. Interesująca część jest na szczycie w JavaScript. Funkcja init ma teraz dwie główne części. W pierwszej sekcji szukamy wartości LocalStorage o nazwie formdata. Jeśli istnieje, zakłada się, że jest to wersja JSON naszych danych. Używamy JSON API, aby przeanalizować to z powrotem na "rzeczywiste" dane, które możemy następnie przypisać do naszych pól formularza. Druga połowa zajmuje się przechowywaniem danych formularza. Używamy zdarzenia input dla formularzy, które jest uruchamiane za każdym razem, gdy wprowadzana jest zmiana. Bierzemy po kolei wszystkie pola i przypisujemy je do nowego obiektu o nazwie data. To jest następnie serializowane przy użyciu JSON.stringify i przechowywane w LocalStorage. Z około 10 wierszami kodu stworzyliśmy formularz, który będzie automatycznie zapisywał i przywracał wartości. Jeśli przeglądarka użytkownika ulegnie awarii lub przypadkowo zamknie przeglądarkę, żadne zmiany nie zostaną utracone. (Jeśli jesteś ciekawy, możesz użyć removeItem w module obsługi przesyłania, aby wyczyścić pola formularza).
Korzystanie z SessionStorage
Do tej pory skupialiśmy się na LocalStorage, trwałym interfejsie API do przechowywania danych w aplikacjach JavaScript. Dostępny jest również półtrwały system przechowywania o nazwie SessionStorage. Działa dokładnie tak samo, jak LocalStorage, z wyjątkiem tego, że jest oparty na sesjach, co można po prostu powiedzieć, że działa z "jednym typowym zastosowaniem" aplikacji internetowej. Gdy użytkownik zamyka przeglądarkę lub nie wchodzi w interakcję z witryną w określonym czasie można bezpiecznie założyć, że wartość zostanie zamknięta. Jak właśnie powiedziałem, API jest dokładnie takie samo. Po prostu zamień każde wywołanie localStorage na sessionStorage:
window.sessionStorage ["favouriteBeer"] = "Abita";
Obawy dotyczące bezpieczeństwa
Powinno być oczywiste, że nie należy ufać żadnym danym po stronie klienta, w tym LocalStorage. Podobnie jak nie ufasz bezwarunkowo danych przesyłanych przez XHR do twojego serwera, powinieneś założyć, że każda wartość LocalStorage może być widziana i manipulowana przez użytkowników w ich przeglądarkach.
Wypełnij LocalStorage za pomocą YepNope.js i Storage.js
Chociaż interfejs API WebStorage jest szeroko obsługiwany we wszystkich głównych przeglądarkach, nadal istnieje potrzeba obsługi wypełniaczy w IE 7. Jednym z najpopularniejszych i najłatwiejszych w obsłudze programów ładujących skrypty polyfill jest YepNope.js. Remy Sharp definiuje wypełniacze w następujący sposób:
Wypełniacz polyfill lub polifiller to fragment kodu (lub wtyczka) zapewniający technologię, której programista oczekuje od przeglądarki w sposób natywny. Spłaszczenie krajobrazu API, jeśli chcesz.
Shim, polyfill i fallback to terminy używane do opisania skryptów używanych do załatania brakującego interfejsu API w określonej przeglądarce, aby programista mógł napisać przyjazny dla przyszłości kod, który działa we wszystkich głównych przeglądarkach. W tym hacku użyjemy dwóch fantastycznych bibliotek, które pozwolą nam osiągnąć 100% wsparcie dla lokalnego przechowywania we wszystkich głównych przeglądarkach: YepNope.js, jak wspomniano w streszczeniu hackowania, oraz Modernizr, biblioteka JavaScript, która współpracuje z YepNope. js do wykrywania funkcji.
Modernizr
Aby rozpocząć, najpierw potrzebujemy sposobu, aby wykryć, czy LocalStorage jest obsługiwany. Modernizr to biblioteka JavaScript, która wykrywa funkcje HTML5 i CSS3 w przeglądarce użytkownika. Zacznijmy od dodania Modernizr do strony:
< script src = "/ i / js / modernizr.com-custom-2.6.1-01.js" > < /script >
Uruchamia serię wykrywania obiektów podczas ładowania strony, zwraca wartość logiczną dla każdego testu i przechowuje dane w obiekcie JavaScript (). Modernizr zawiera YepNope.js jako opcję warunkowego ładowania zewnętrznych zasobów.js i .css. Jest to bardzo przydatne do zarządzania obsługą wypełniaczy w aplikacji.
Korzystanie z YepNope
YepNope jest opisywany jako "asynchroniczny warunkowy program ładujący zasoby, który jest superszybki i pozwala ładować tylko te skrypty, których potrzebują użytkownicy". Cóż, jak powiedziałem wcześniej, jedynym skryptem, którego potrzebujemy, jest polyfill do lokalnego przechowywania w IE 6 i 7 oraz Firefox w wersjach 2 i 3. Więc najpierw zadzwonimy do yepnope, który zawiera odniesienie do właściwości Modernizr dla localstorage. Ustawimy wartość tej właściwości do przetestowania. Jeśli test się powiedzie, przejdziemy do jego zakończenia, co spowoduje wykonanie naszego kodu aplikacji. Jeśli to się nie powiedzie, wywoła wbudowany moduł ładujący skrypt yepnope, aby pobrać plik storage.js. Funkcja wywołania zwrotnego, do której odwołuje się complete będzie również wywołana.
yepnope ({
test: Modernizr.localstorage,
nope: ['../../js/storage.js'],
complete: function (url, result, key) {
if (url === '../../js/storage.js') {
console.log('polyfill loaded');
}
// applications code
}
});
Korzystanie z Storage.js
Storage.js to biblioteka napisana przez Bretta Wejrowskiego. Skrypt wykorzystuje dane userData dla IE 6 i 7 oraz globalStorage dla Firefoksa w wersjach 2 i 3, aby zaimplementować polyfill dla localStorage, gdy nie jest on obsługiwany.
UWAGA
Zawartość pliku storage.js można wyświetlić w serwisie GitHub. Aby zademonstrować skuteczność naszego modułu ładującego wypełniacze, zaimplementujemy prosty licznik przechowujący zwiększoną wartość w localStorage. Do przycisku uruchamiającego licznik dołączymy odbiornik zdarzenia kliknięcia:
< button id = "counter" type = "button" > Kliknij mnie! < /buton >
Teraz dodamy logikę licznika do pełnego wywołania zwrotnego naszego skryptu YepNope:
yepnope({
test: Modernizr.localstorage,
nope: ['../../js/storage.js'],
complete: function (url, result, key) {
if (url === '../../js/storage.js') {
console.log('polyfill loaded');
}
function counter(){
var c = (localStorage.clickcount) ? localStorage.clickco
unt++ : localStorage.clickcount=1;
var str = "clicked " + c + " times"
$("#clicks").html(str);
}
$("#counter").on("click", function(){counter()});
}
});