Generarea unui răspuns de la controlori
După ce controlorul a terminat de procesat cererea, de obicei trebuie să genereze un răspuns. Când creăm un controler de nivel scăzut prin implementarea directă a interfeței IController, trebuie să ne asumăm responsabilitatea pentru fiecare aspect al procesării unei cereri, inclusiv pentru generarea unui răspuns către client.
De exemplu, pentru a trimite un răspuns HTML, trebuie să creați și să compuneți datele HTML, apoi să le trimiteți clientului folosind metoda Response.Write (). De asemenea, pentru a redirecționa browserul utilizatorului către o adresă URL diferită, trebuie să apelați metoda Response.Redirect () și să îi transmiteți adresa URL necesară. Ambele abordări sunt demonstrate în codul de mai jos, care arată extensii la clasa BasicController pe care am creat-o într-un articol anterior folosind implementarea interfeței IController:
Utilizarea System.Web.Mvc; folosind System.Web.Routing; spațiu de nume ControllersAndActions.Controllers (clasa publică BasicController: IController (public void Execute (RequestContext requestContext)) (controller de șir = (șir) requestContext.RouteData.Values ["controller"]; șir de acțiune = (șir) requestContext.RouteData.Values ["acțiune "]; if (action.ToLower () ==" redirecționare ") (requestContext.HttpContext.Response.Redirect (" / Derived / Index ");) else (requestContext.HttpContext.Response.Write (string. Format (" Controller: (0), Metoda de acțiune: (1) ", controler, acțiune));))))
Aceeași abordare poate fi aplicată dacă controlerul moștenește din clasa Controller. Clasa HttpResponseBase care este returnată la citirea proprietății requestContext.HttpContext.Response în metoda Execute () este disponibilă prin proprietatea Controller.Response, așa cum se arată în exemplul de mai jos, care oferă extensii la clasa DerivedController, creată și mai devreme prin moștenire. din clasa Controller:
Utilizarea sistemului; folosind System.Web; folosind System.Web.Mvc; namespace ControllersAndActions.Controllers (clasa publică DerivedController: Controller (public ActionResult Index () (// ...) public void ProduceOutput () (dacă (Server.MachineName == "ProfessorWeb") Response.Redirect ("/ Basic / Index" ); else Response.Write ("Controller: Derivat, Metoda de acțiune: ProduceOutput");)))
Metoda ProduceOutput () folosește valoarea proprietății Server.MachineName pentru a decide ce răspuns să trimită clientului. ("ProfessorWeb" este numele mașinii mele de dezvoltare.)
În timp ce această abordare de a genera un răspuns către utilizator funcționează, există mai multe probleme cu aceasta:
Clasele de controler trebuie să conțină informații despre structura HTML sau URL, ceea ce face ca clasele să fie dificil de citit și de întreținut.
Un controler care generează un răspuns direct la ieșire este dificil de testat unitar. Va trebui să creați implementări simulate ale obiectului Response și apoi să puteți procesa ieșirea de la controler pentru a determina ce este. Aceasta poate însemna, de exemplu, nevoia de a implementa marcajul HTML de analiză pentru cuvintele cheie, care este un proces lung și obositor.
Această manipulare a micilor detalii ale fiecărui răspuns este complexă și predispusă la erori. Unii programatori le place controlul absolut oferit de construirea unui controler de nivel scăzut, dar acest lucru tinde să se complice foarte repede.
Din fericire, Cadrul MVC are un instrument la îndemână care rezolvă toate aceste probleme - rezultatele acțiunii. Următoarele secțiuni explică conceptul de rezultate ale acțiunii și arată căi diferite utilizarea sa pentru a genera răspunsuri de la controlori.
Rezultatele acțiunii
Rezultatele acțiunilor din cadrul MVC sunt folosite pentru a separa declarațiile de intenție de execuția intenției (ne pare rău pentru tautologie). Conceptul va părea simplu după ce te simți confortabil cu el, dar este nevoie de ceva timp pentru a înțelege din cauza unui anumit grad de indirect.
În loc să se ocupe direct de obiectul Response, metodele de acțiune returnează un obiect dintr-o clasă derivată din ActionResult, care descrie care ar trebui să fie răspunsul de la controler - de exemplu, redarea vizualizării sau redirecționarea către o adresă URL sau o metodă de acțiune diferită. Totuși (aceasta este aceeași indirectă) răspunsul nu este generat direct. În schimb, este creat un obiect ActionResult, pe care Cadrul MVC îl procesează pentru a obține rezultatul după ce metoda de acțiune a fost apelată.
Sistemul de rezultat al acțiunii este un exemplu de model de proiectare Command. Acest șablon reprezintă scenarii în care stocați și transmiteți obiecte care descriu operațiunile de efectuat.
Când Cadrul MVC primește un obiect ActionResult de la o metodă de acțiune, apelează Metoda ExecuteResult (). definite în clasa acestui obiect. Implementarea rezultatelor acțiunii funcționează apoi cu obiectul Response, generând rezultate care se potrivesc cu intenția dvs. Pentru a demonstra acest lucru la locul de muncă, să creăm un folder Infrastructură și să adăugăm un nou fișier de clasă numit CustomRedirectResult.cs cu o implementare ActionResult personalizată, prezentată în exemplul de mai jos:
Utilizarea System.Web.Mvc; spațiu de nume ControllersAndActions.Infrastructure (clasa publică CustomRedirectResult: ActionResult (șir public Url (get; set;) public override void ExecuteResult (context ControllerContext) (string fullUrl = UrlHelper.GenerateContentUrl (Url, context.HttpContext); context.HttpContext); context.HttpContext; )))
Această clasă se bazează pe modul în care funcționează clasa System.Web.Mvc.RedirectResult. Unul dintre beneficiile framework-ului open source MVC este capacitatea de a explora funcționarea interioară a oricărui lucru. Clasa CustomRedirectResult este mult mai simplă decât echivalentul său MVC, dar este suficientă pentru scopurile acestui articol.
La instanțierea clasei RedirectResult, transmitem adresa URL către care ar trebui să fie redirecționat utilizatorul. Metoda ExecuteResult () care va fi executată de Cadrul MVC la finalizarea metodei de acțiune devine Obiect de răspuns pentru o solicitare prin obiectul ControllerContext furnizat de cadru și apelează fie metoda RedirectPermanent () fie metoda Redirect () (acest lucru reflectă exact ceea ce s-a făcut în cadrul implementării IController de nivel scăzut din exemplul de mai devreme în articol).
Utilizarea clasei CustomRedirectResult este ilustrată în exemplul de mai jos, care arată modificările care au fost făcute controlerului derivat:
// ... folosind ControllersAndActions.Infrastructure; spațiu de nume ControllersAndActions.Controllers (clasa publică DerivedController: Controller (public ActionResult Index () (// ...) public ActionResult ProduceOutput () (dacă (Server.MachineName == "MyMachineName") return new CustomRedirectResult (Url = "/ Basic / Index "); else (Response.Write (" Controller: Derivat, Metoda de acțiune: ProduceOutput "); returnează nul;))))
Rețineți că am fost forțați să schimbăm rezultatul metodei de acțiune pentru a returna un ActionResult. Returnăm null dacă nu dorim ca cadrul MVC să facă nimic atunci când metoda noastră de acțiune a fost executată, ceea ce a făcut dacă instanța CustomRedirectResult nu a revenit.
Controlere și acțiuni de testare unitară
Multe părți ale cadrului MVC sunt concepute pentru a face testarea unitară mai ușoară, iar acest lucru este valabil mai ales pentru acțiuni și controlere. Există mai multe motive pentru acest sprijin:
Puteți testa acțiuni și controlere în afara serverului web. Obiectele context sunt accesate prin clasele lor de bază (cum ar fi HttpRequestBase), care este ușor de batjocorit.
Nu trebuie să analizați marcajul HTML pentru a testa rezultatele metodei de acțiune. Puteți inspecta ActionResult returnat pentru a vă asigura că obțineți rezultatele așteptate.
Nu este necesară emularea solicitărilor clienților. Legarea modelului MVC Framework vă permite să scrieți metode de acțiune care primesc intrare în parametrii lor. Pentru a testa o metodă de acțiune, trebuie doar să o apelați direct și să furnizați valorile adecvate ale parametrilor.
Articolele viitoare despre generarea datelor de la controlori vă vor arăta cum să creați teste unitare pentru diferite tipuri de rezultate ale acțiunii.
Rețineți că testarea unitară este doar o parte a imaginii de ansamblu. Comportamentul complex al aplicației apare atunci când metodele de acțiune sunt apelate secvenţial. Testarea unitară funcționează cel mai bine cu alte abordări de testare.
Acum că știți cum funcționează rezultatul personalizat al unei acțiuni de redirecționare, puteți trece la echivalentul acestuia furnizat de cadrul MVC, care este puternic și bine testat de Microsoft. Modificarea necesară la controlerul derivat este prezentată mai jos:
// ... public ActionResult ProduceOutput () (return new RedirectResult ("/ Basic / Index");) // ...
Eliminat din metoda de acțiune operator condițional, ceea ce înseamnă că după lansarea aplicației și navigarea la o adresă URL ca / Derived / ProduceOutput, browserul va fi redirecționat către o adresă URL ca / Basic / Index. Pentru a simplifica codul metodei de acțiune, clasa Controller include metode convenabile de generat tipuri diferite Obiecte ActionResult. Astfel, de exemplu, putem obține același efect ca în exemplul de mai sus, returnând rezultatul metodei Redirect ():
// ... public ActionResult ProduceOutput () (return Redirect ("/ Basic / Index");) // ...
Sistemul de rezultat al acțiunii nu este deosebit de complex, dar în cele din urmă are ca rezultat un cod mai simplu, mai curat și mai consistent, care este ușor de citit și testarea unitară. De exemplu, în cazul unei redirecționări, puteți verifica pur și simplu dacă metoda de acțiune returnează o instanță RedirectResult a cărei proprietate Url conține ținta așteptată.
Cadrul MVC definește multe tipuri de rezultate de acțiune încorporate, care sunt descrise în tabelul de mai jos:
Tip de | Descriere | Metode de ajutor pentru controler |
---|---|---|
ViewResult | Redă șablonul de vizualizare specificat sau standard |
Vizualizare () |
PartialViewResult | Redă șablonul de vizualizare parțială specificat sau standard |
Vizualizare parțială () |
RedirectToRouteResult | Emite o redirecționare HTTP 301 sau 302 către o metodă de acțiune sau o intrare de rută specificată, generând o adresă URL în funcție de configurația de rutare |
RedirectToAction () RedirectToActionPermanent () RedirectToRoute () RedirectToRoutePermanent () |
RedirectResult | Oferă o redirecționare HTTP 301 sau 302 către adresa URL dată |
Redirecționare () RedirectPermanent () |
ContentResult | Returnează date text neformatate în browser, setând suplimentar antetul tipului de conținut |
Continut () |
FileResult | Transferă date binare (cum ar fi un fișier de pe disc sau o matrice de octeți în memorie) direct în browser |
Fișier () |
JsonResult | Serializează un obiect .NET la format JSONși îl trimite ca răspuns. Acest tip de răspuns este generat mai frecvent atunci când se utilizează Web API și AJAX. |
Json () |
JavaScriptResult | Trimite o bucată de cod sursă JavaScript pentru a fi executată de browser |
JavaScript () |
HttpUnauthorizedResult | Setează codul de stare a răspunsului HTTP la 401 (însemnând „neautorizat”), ceea ce forțează mecanismul de autentificare curent (autentificare prin formulare sau autentificare Windows) să solicite vizitatorului să se autentifice |
Nu |
HttpNotFoundResult | Returnează eroare HTTP cu codul 404 - Nu a fost găsit(nu a fost găsit) |
HttpNotFound () |
HttpStatusCodeResult | Returnează codul HTTP specificat |
Nu |
EmptyResult | Facand nimic |
Nu |
Toate aceste tipuri derivă din clasa ActionResult și multe dintre ele au metode de ajutor convenabile în clasa Controller. Vom demonstra utilizarea acestor tipuri de rezultate în articolele ulterioare.
Să presupunem că trebuie să obținem date de pe site, a căror colectare manuală este imposibilă sau imposibilă din cauza volumului. În acest caz, putem automatiza procesul folosind instrumentele descrise mai jos.
Biblioteca de cereri
Biblioteca Python pentru a face cereri către server și pentru a gestiona răspunsurile. Fundamentul scriptului de analiză și arma noastră principală. Folosind această bibliotecă, obținem conținutul paginii sub formă de html pentru o analiză ulterioară.
cereri de import răspuns = solicitări. get ("https://ya.ru") # get-request print (răspuns. text) # afișa conținutul paginii sarcină utilă = ("key1": "value1", "key2": "value2") răspuns = solicitări. get ("http://httpbin.org/get", params = sarcină utilă) # cerere cu parametri anteturi = ("user-agent": "my-app / 0.0.1") răspuns = solicitări. get (url, headers = anteturi) # cerere cu antete html specifice
API
Interfața de programare a aplicațiilor este o interfață de programare a aplicațiilor furnizată de proprietarul unei aplicații web pentru alți dezvoltatori. Lipsa unui API care să ne poată satisface nevoile este primul lucru de care trebuie să ne asigurăm înainte de a ne grăbi să analizăm sursă pagină și scrieți un parser pentru ea. Multe site-uri populare au propria lor API și documentație care explică cum să le folosească. Putem folosi api în acest fel - formăm o cerere http conform documentației și obținem un răspuns folosind cereri.
BS4
Beautifulsoup4 este o bibliotecă pentru analizarea documentelor html și xml. Vă permite să accesați direct conținutul oricăror etichete în html.
din bs4 import BeautifulSoup soup = BeautifulSoup (raw_html, "html.parser") print (soup. find ("p", class_ = "oarecare-clasă"). text) # scoateți conținutul etichetei „p” de către „some-class”
Driver web Selenium
Datele de pe site pot fi generate dinamic folosind javascript. În acest caz, solicitările + bs4 nu vor putea analiza aceste date. Ideea este că bs4 analizează codul sursă al paginii fără a executa js. Pentru a executa codul js și a obține o pagină identică cu cea pe care o vedem în browser, puteți utiliza driverul web selenium - acesta este un set de drivere pentru browsere diferite furnizarea de biblioteci pentru lucrul cu aceste drivere.
Și dacă există o autorizație?
session = requests.Session () data = ("login_username": "login", "login_password": "parolă") url = "http://site.com/login.php" răspuns = session.post (url, date = date)
Dar ce se întâmplă dacă site-ul este interzis pentru multe solicitări?
- Setați o întârziere între solicitări:
răspuns = requests.get (url, timeout = (10, 0.01)) # timeout conexiune, timeout citire (în secunde)
- Pretindeți-vă că sunteți un browser care folosește driverul web selenium sau trecând conținutul antetului user-agent, formând o solicitare:
user_agent = ("Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 50.0)" "Gecko / 20100101 Firefox / 50.0") request = requests.get (url, headers = ("User-Agent": user_agent))
- Utilizarea proxy:
Traducere: Vlad Merzhevich
Toată lumea știe despre formularele web, nu? Introduceți eticheta
Browserele care nu acceptă atributul substituent îl ignoră pur și simplu. Fără vătămare sau încălcare.
Întrebați profesorul Markup
☞ Î. Pot folosi marcajul HTML pentru atributul substituent? Vreau să inserez o poză sau poate să schimb culorile.
A. Atributul substituent poate conține doar text, fără cod HTML. Cu toate acestea, există extensii speciale CSS care vă permit să setați stilul textului în unele browsere.
Câmpuri de focalizare automată
IE | Firefox | Safari | Crom | Operă | iPhone | Android |
- | - | 4.0+ | 3.0+ | 10.0+ | - | - |
Site-urile pot folosi JavaScript pentru a se concentra automat pe primul câmp de formular. De exemplu, pe pagina de start Google.com câmpul pentru introducerea motoarelor de căutare are autofocus Cuvinte cheie... Deși acest lucru este convenabil pentru majoritatea oamenilor, poate fi enervant pentru utilizatorii cu putere și persoanele cu nevoi speciale. Dacă apăsați pe spațiu în timp ce așteptați derularea paginii, nu va exista derulare deoarece accentul este pus pe câmpul de introducere a formularului (se va introduce un spațiu în câmp în loc de defilare). Dacă mutați focalizarea într-un alt câmp de introducere în timp ce pagina se încarcă, scriptul de focalizare automată a site-ului poate muta „util” focalizarea înapoi la câmpul de introducere original, întrerupând tastarea și determinându-vă să tastați în locul greșit.
Deoarece focalizarea automată funcționează prin JavaScript, poate fi dificil să se ocupe de aceste cazuri marginale și puține șanse pentru persoanele care nu doresc ca o pagină web să-și fure concentrarea.
Pentru a rezolva aceste probleme, HTML5 introduce atributul autofocus pe toate elementele formularului. Atributul de focalizare automată face exact ceea ce sună: de îndată ce pagina se încarcă, mută focalizarea în câmpul specificat. Dar, deoarece acesta este doar un marcaj și nu un script, comportamentul va fi consecvent pe toate site-urile. În plus, producătorii de browsere (sau autorii extensiilor) pot oferi utilizatorilor o modalitate de a dezactiva focalizarea automată.
Acesta este modul în care puteți seta un câmp de formular de focalizare automată.
Browserele care nu acceptă atributul de focalizare automată îl vor ignora.
Ce? Să presupunem că doriți ca focalizarea automată să funcționeze peste tot, nu doar în browserele HTML5 de lux? Puteți lăsa scriptul curent cu autofocus, doar faceți două mici modificări:
- adăugați atributul de focalizare automată la codul dvs. HTML;
- verificați dacă browserul acceptă atributul de focalizare automată și, dacă nu, rulați propriul script.
Focalizare automată cu alternativă
Concentrați-vă cât mai devreme posibil
Multe pagini web așteaptă ca window.onload să se declanșeze și să se concentreze. Dar evenimentul window.onload nu se va declanșa până când toate imaginile nu se vor încărca. Dacă pagina dvs. are o mulțime de imagini, astfel de scripturi naive se vor schimba potențial după ce utilizatorul a început să interacționeze cu o altă parte a paginii dvs. De aceea utilizatori experimentați urăsc scripturile de focalizare automată.
De exemplu, în secțiunea anterioară, scriptul de focalizare automată a fost plasat imediat după câmpul de formular la care se referă. aceasta soluție optimă dar vă poate jigni simțurile să puneți un bloc de cod JavaScript în mijlocul paginii (sau mai banal, sistemul dumneavoastră poate să nu fie atât de flexibil). Dacă nu puteți insera scriptul în mijlocul paginii, trebuie să setați focalizarea printr-un eveniment personalizat, cum ar fi $ (document) .ready () în jQuery în loc de window.onload.
Focalizare automată prin jQuery
Evenimentul personalizat jQuery se declanșează de îndată ce DOM-ul este disponibil - adică așteaptă să se încarce textul paginii, dar nu așteaptă să se încarce toate imaginile. Aceasta nu este cea mai bună abordare - dacă pagina este neobișnuit de mare sau conexiune retea lent, utilizatorul poate interacționa în continuare cu pagina înainte ca scriptul focalizat să fie executat. Cu toate acestea, este mult mai bine decât să așteptați ca evenimentul window.onload să aibă loc.
Dacă sunteți de acord și sunteți gata să inserați un script cu un operator în codul paginii dvs., acesta este un compromis care este mai puțin urât decât prima opțiune și mai bun decât a doua. Puteți folosi evenimente personalizate jQuery pentru a vă seta propriile evenimente, să spunem autofocus_ready. Apoi puteți declanșa acest eveniment manual, de îndată ce câmpul de focalizare automată este disponibil. Mulțumesc lui EM Shtenberg pentru că m-a învățat această tehnică.
Focalizare automată cu un eveniment personalizat alternativ
Această soluție este optimă, ca și prima abordare. Accentul va fi pus pe câmpul formular cât mai curând posibil din punct de vedere tehnic, în timp ce textul paginii se încarcă încă. O parte din logica aplicației (focalizarea în câmpul formularului) a fost mutată din corpul paginii în secțiune
... Acest exemplu se bazează pe jQuery, dar conceptul de evenimente personalizate nu este unic pentru jQuery. Alte biblioteci JavaScript precum YUI și Dojo oferă capabilități similare.Să rezumam.
- Setarea corectă a focalizării este importantă.
- Dacă este posibil, cereți browserului să folosească atributul de focalizare automată pe câmpul în care doriți să vă focalizați.
- Dacă utilizați cod alternativ pentru browsere mai vechi, definiți suportul pentru atributul de focalizare automată, astfel încât scriptul să ruleze numai pe browsere mai vechi.
- Concentrați-vă cât mai devreme posibil. Introduceți scriptul de focalizare în cod imediat după câmpul formularului. Dacă acest lucru nu vă deranjează, încorporați o bibliotecă JavaScript care acceptă evenimente personalizate și apelați evenimentul în codul dvs. imediat după câmpul formularului. Dacă acest lucru nu este posibil, utilizați un eveniment precum $ (document) .ready () din jQuery.
- Nu așteptați în niciun caz ca window.onload să seteze focalizarea.
Adrese de email
De peste un deceniu, formularele au conținut doar câteva tipuri de câmpuri. Cele mai comune sunt următoarele.
Toate aceste tipuri de câmpuri încă funcționează în HTML5. Dacă faceți „upgrade la HTML5” (eventual prin schimbarea! DOCTYPE), nu trebuie să faceți o singură modificare formularelor. Ura pentru compatibilitatea anterioară!
Cu toate acestea, HTML5 definește 13 noi tipuri de câmpuri și nu există niciun motiv pentru a nu începe să le utilizați.
Primul dintre aceste noi tipuri de adrese E-mail... Arata cam asa.
Eram pe cale să scriu o propoziție care începea „în browsere care nu acceptă tipul =" e-mail „...” dar s-a oprit. De ce? Pentru că nu sunt sigur dacă browserele nu acceptă type = „email”. Toate browserele „suport” tip = „e-mail”. S-ar putea să nu facă ceva special, dar browserele care nu recunosc tip = „e-mail” îl vor trata ca tip = „text” și îl vor afișa ca un câmp de text obișnuit.
Voi sublinia cât de important este acest lucru. Există milioane de formulare pe Internet care vă cer să introduceți o adresă de e-mail și toate folosesc ... Vedeți o casetă de text, introduceți adresa dvs. de e-mail în ea și gata. Și aici vine HTML5, care definește tipul = „email”. Înnebunesc browserele? Nu. Fiecare browser de pe Pământ tratează atributul tip necunoscut ca tip = „text” - chiar și IE6. Deci, puteți să vă „actualizați” formularele folosind tip = „e-mail” chiar acum.
Ce se întâmplă dacă, să zicem, browserul acceptă tipul = „e-mail”? Ei bine, asta ar putea însemna orice. Specificația HTML5 nu necesită nicio interfață de utilizator specifică pentru noile tipuri de câmpuri. Opera completează câmpul formularului cu o mică pictogramă. Alte browsere HTML5, cum ar fi Safari și Chrome, redă ca un câmp de text - la fel ca tip = "text" - astfel încât utilizatorii dvs. să nu observe diferența (până când nu se uită la sursa).
Și apoi este iPhone-ul.
iPhone nu are o tastatură fizică. Toată „tastarea” se face făcând clic pe tastatura de pe ecran care apare la momentul potrivit, de exemplu, când navigați la un câmp de formular pe o pagină web. Apple a făcut ceva complicat în browserul iPhone-ului. Recunoaște unele dintre noile câmpuri HTML5 și schimbă dinamic tastatura de pe ecran pentru a optimiza introducerea.
De exemplu, o adresă de e-mail este text, nu? Sigur, dar acesta este un tip special de text. De exemplu, aproape toate adresele de e-mail conțin simbolul @ și cel puțin un punct (.), dar este puțin probabil să conțină un spațiu. Deci, atunci când utilizați iPhone și mergeți la element , primești o tastatură pe ecran care conține mai puțin spațiu decât de obicei, precum și taste dedicate pentru caractere. și @.
Lasă-mă să rezum. Nu există niciun dezavantaj în a traduce imediat toate câmpurile dvs. din adrese de emailîn tip = „e-mail”. Aproape nimeni nu va observa acest lucru, cu excepția utilizatorilor de iPhone, care probabil nici nu o vor observa. Dar cei care observă vor zâmbi liniștiți și vă vor mulțumi că le-ați făcut treaba puțin mai ușoară.
Adrese web
O adresă web - pe care crampele standardelor au numit-o URL-uri, cu excepția câtorva pedanți care au numit URI-uri - este un alt tip de text specializat. Sintaxa unei adrese web este limitată de standardul de Internet relevant. Dacă cineva vă cere să introduceți o adresă web într-un formular, se așteaptă la ceva de genul „http://www.google.com/” și nu „125 Farwood Road”. Liniile oblice sunt comune – chiar și pentru pagina principala Google are trei dintre ele. Punctele sunt și ele comune, dar spațiile nu sunt permise. Și fiecare adresă web are un sufix de domeniu precum „.com” sau „.org”.
Și așa... (rulația de tobe, te rog)... ... Pe iPhone, arată așa.
iPhone-ul și-a schimbat tastatura virtuală așa cum a făcut-o pentru o adresă de e-mail, dar acum a optimizat-o pentru tastarea unei adrese web. Bara de spațiu este complet înlocuită de trei taste virtuale: bară oblică, punct și „.com” (puteți țineți apăsată tasta „.com” pentru a selecta un sufix diferit, cum ar fi „.org” sau „.net”).
Browserele care nu acceptă HTML5 vor trata tipul = „url” ca tip = „text”, așa că nu există niciun dezavantaj în utilizarea acestui tip pentru toate câmpurile în care trebuie să introduceți o adresă web.
Numerele ca contoare
Următorul pas: numerele. A cere un număr este mai complex decât a cere o adresă de e-mail sau web. În primul rând, cifrele sunt mai grele decât crezi. Alegeți rapid un număr. -1? Nu, mă refer la un număr între 1 și 10,7 ½? Nu, nu, nici o fracțiune, prostule. π? Acum tocmai ai ales un număr irațional.
Vreau să subliniez că nu vi se cere adesea „doar un număr”. Este mai probabil ca aceștia să ceară un număr într-un anumit interval. S-ar putea să doriți doar anumite tipuri de numere în acest interval - poate numere întregi, dar nu fracții sau zecimale, sau ceva mai exotic, cum ar fi multiplii de 10. HTML5 acoperă totul.
Alegeți un număr, aproape orice
min = "0"
max = "10"
pas = "2"
valoare = "6">
Să ne uităm la un atribut la un moment dat.
- tip = „număr” înseamnă că acesta este un câmp numeric.
- min = „0” indică valoarea minimă permisă pentru acest câmp.
- max = „10” este valoarea maximă permisă.
- pas = „2” combinat cu valoarea minima definește numere valide în intervalul: 0, 2, 4 și așa mai departe, până la valoarea maximă.
- valoare = „6” valoare implicită. Ar trebui să pară familiar, același atribut este întotdeauna folosit pentru a defini valori pentru câmpurile de formular. Menționez acest lucru aici pentru un punct de plecare pe care se bazează HTML5 Versiunile anterioare HTML. Nu trebuie să reînveți să faci ceea ce ai făcut deja.
Acesta este un cod de câmp numeric. Rețineți că toate aceste atribute sunt opționale. Dacă aveți un minim, dar nu un maxim, puteți specifica atributul min, dar nu max. În mod implicit, valoarea pasului este 1 și puteți omite atributul step până când aveți nevoie de o valoare de pas diferită. Dacă nu există un implicit, atunci atributul value poate fi un șir gol sau chiar omis cu totul.
Dar HTML5 nu se oprește aici. Pentru acelasi mic preț scăzut libertate veți obține aceste metode JavaScript la îndemână.
- input.stepUp (n) crește valoarea câmpului cu n.
- input.stepDown (n) scade valoarea câmpului cu n.
- input.valueAsNumber returnează valoarea curentă ca număr în virgulă mobilă (proprietatea input.value este întotdeauna un șir).
Probleme de afișare? Ei bine, interfața corectă pentru manipularea numerelor în browsere este implementată diferit. Pe iPhone, unde tastarea este dificilă, browserul optimizează din nou tastatura virtuală pentru introducerea numerelor.
Pe versiunea de desktop a Opera, câmpul tip = „număr” apare ca un contor cu săgeți mici în sus și în jos pe care puteți face clic pentru a schimba valori.
Opera respectă atributele min, max și step, astfel încât veți obține întotdeauna o valoare numerică acceptabilă. Dacă creșteți valoarea la maxim, săgeata sus din contor devine gri.
Ca și în cazul tuturor celorlalte câmpuri de introducere pe care le-am discutat în acest capitol, browserele care nu acceptă tip = „număr” îl vor trata ca tip = „text”. Valoarea implicită va apărea în câmp (din moment ce este stocată în atributul value), dar alte atribute precum min și max vor fi ignorate. Puteți să le implementați singur sau să utilizați un cadru JavaScript care implementează deja gestionarea contoarelor. Mai întâi verificați cum este aici.
dacă (! .inputtypes.number) (
// nu există suport încorporat pentru câmpul tip = număr
// poate încerca Dojo sau alt cadru JavaScript
}
Numere de glisare
Contorul nu este singura modalitate de a reprezenta introducerea numerelor. Probabil ați văzut și un glisor care arată așa.
Acum puteți avea și un glisor în formă. Codul arată ciudat ca o casetă de rotație.
min = "0"
max = "10"
pas = "2"
valoare = "6">
Toate atributele disponibile sunt la fel ca tip = „număr” - min, max, pas, valoare - și înseamnă același lucru. Singura diferență este interfața cu utilizatorul... În loc de un câmp de introducere, se așteaptă ca browserele să afișeze tipul = „interval” ca glisor. La momentul scrierii, cele mai recente versiuni de Safari, Chrome și Opera au funcționat cu acest lucru. Din păcate, iPhone-ul se afișează ca o simplă casetă de text, nici măcar nu își optimizează tastatura de pe ecran pentru introducerea numerelor. Toate celelalte browsere se gândesc doar la un câmp ca tip = „text”, așa că nu există niciun motiv pentru a începe să utilizați acest tip imediat.
HTML 4 nu include selectarea datei prin calendar. Cadrele JavaScript vă permit să ocoliți acest lucru (Dojo, jQuery UI, YUI, Closure Library), dar, desigur, fiecare dintre aceste soluții necesită un cadru „încorporat” pentru orice calendar încorporat.
HTML5 definește, în sfârșit, o modalitate de a activa selectorul de date inline fără niciun scripting. Există de fapt șase dintre ele: dată, lună, săptămână, oră, dată + oră și data + oră cu fusul orar.
Până acum, sprijinul este... rar.
Tip de | Operă | Alte browsere |
---|---|---|
tip = "data" | 9.0+ | - |
tip = "luna" | 9.0+ | - |
tip = "saptamana" | 9.0+ | - |
tip = "timp" | 9.0+ | - |
tip = "datatime" | 9.0+ | - |
tip = "datetime-local" | 9.0+ | - |
Așa se afișează Opera :
Dacă aveți nevoie de o oră împreună cu o dată, Opera acceptă și :
Dacă aveți nevoie de o lună plus un an (de exemplu, data de expirare card de credit), Opera poate afișa :
Mai puțin obișnuită, dar accesibilă este alegerea unei săptămâni din an :
Nu în ultimul rând este momentul cu :
Selector de date cu alternativă
...
Este probabil ca alte browsere să accepte în cele din urmă aceste tipuri. La fel ca tip = „e-mail” și alte tipuri, aceste câmpuri de formular se vor afișa ca text simplu în browserele care nu recunosc tipul = „data” și variantele acestuia. Dacă doriți, puteți pur și simplu să utilizați decât să-i faci pe utilizatorii Opera fericiți și să aștepți ca alte browsere să ajungă din urmă. Este mai realist să-l folosești dar verificați dacă browserul are suport încorporat pentru selectorul de date și includeți o soluție alternativă de script la alegere (Dojo, jQuery UI, YUI, Closure Library sau alte opțiuni).
Caseta de căutare
Deci, caută. Nu doar căutări de pe Google sau Yahoo (ei bine, și acelea). Gândiți-vă la orice casetă de căutare, pe orice pagină, pe orice site. Amazon are o casetă de căutare, Yandex are o casetă de căutare și majoritatea blogurilor au și ele. Cum sunt făcute? ca orice altă casetă de text de pe net. Să reparăm asta.
În căutarea următoarei generații
În unele browsere, nu veți observa nicio diferență față de un câmp de text obișnuit. Dar dacă utilizați Safari pe Mac OS X, va arăta așa.
Ai găsit diferența? Câmpul de introducere are colțuri rotunjite! Știu, știu, cu greu vă puteți reține sentimentele. Dar stai, asta nu e tot! Când începeți să tastați în câmpul tip = „căutare”, Safari va insera un mic buton „x” cu partea dreapta fereastră. Făcând clic pe „x” se șterge conținutul câmpului. Google Chrome care are aceeași tehnologie sub capotă se comportă la fel. Ambele mici modificări arată și se comportă similar căutării native din iTunes și alte aplicații client Mac OS X.
Apple.com folosește pentru a căuta site-ul dvs. pentru a ajuta site-ul să transmită un sentiment macho. Dar nu există nimic specific pentru Mac aici. Este doar cod, astfel încât fiecare browser de pe orice platformă poate alege cum să se afișeze conform convențiilor platformei. Ca și în cazul tuturor celorlalte tipuri noi, browserele care nu recunosc tip = „căutare” îl vor trata ca tip = „text”, așa că nu există absolut niciun motiv să nu începeți să utilizați tip = „căutare” pentru toate casetele de căutare astăzi. . ..
spune profesorul Markup
În mod implicit, Safari nu se aplică majoritatea stilurilor. Dacă doriți ca Safari să trateze caseta de căutare ca o casetă de text obișnuită (pentru a vă putea aplica propriile stiluri), adăugați această regulă în foaia de stil.
intrare (
-webkit-aspect: textfield;
}
Îi mulțumesc lui John Lane că m-a învățat acest truc.
Alegerea culorilor
HTML5 definește, de asemenea, un câmp care vă permite să selectați o culoare și o returnează în notație hexazecimală. Niciun browser nu acceptă selectorul de culori, ceea ce este păcat pentru că întotdeauna mi-au plăcut paletele Mac OS. Poate intr-o zi.
Aproximativ. traducător. Opera 11 acceptă această caracteristică.
Validarea formularului
În acest capitol, am vorbit despre noi elemente de formular și despre noi funcții precum focalizarea automată, dar nu am menționat poate cea mai interesantă parte a formularelor HTML5: verificare automată date de intrare. Să aruncăm o privire la problemele comune ale introducerii unei adrese de e-mail într-un formular. Probabil aveți validare pe partea client prin JavaScript, urmată de validare pe partea server prin PHP, Python sau alt limbaj pe partea serverului. HTML5 nu poate înlocui niciodată validarea pe partea de server, dar poate înlocui într-o zi validarea pe partea client.
Există două mari probleme cu validarea e-mailului JavaScript:
- Unii dintre vizitatorii dvs. (probabil în jur de 10%) nu includ JavaScript.
- Veți primi adresa incorect.
Serios, ai greșit adresa. Determinarea dacă un set de caractere aleatorii este o adresă de e-mail validă este incredibil de dificilă. Cu cât te uiți mai greu, cu atât devine mai greu. Am menționat că acest lucru este foarte, foarte dificil? Nu ar fi mai ușor să agăți această durere de cap pe browser?
Opera verifică tipul = „e-mail”
Iată o captură de ecran din Opera 11, deși funcționalitatea este prezentă încă de la Opera 9. Codul implică setarea valorii de e-mail pentru atributul type. Când un utilizator Opera încearcă să trimită un formular cu , browserul verifică automat adresa de e-mail chiar dacă scripturile sunt dezactivate.
HTML5 oferă, de asemenea, validarea câmpurilor pentru adresele web si numere cu ... Validarea pentru numere ia în considerare valorile atributelor min și max, astfel încât browserele nu vă vor permite să trimiteți formularul dacă introduceți un număr prea mare.
Nu există niciun cod pentru a activa validarea formularelor HTML5, aceasta se face în mod implicit. Pentru a dezactiva validarea, utilizați atributul novalidate.
Nu mă testa
Browserele sunt lente în a activa suportul pentru validarea formularelor HTML5. Firefox 4 va avea suport complet. Din păcate, Safari și Chrome implementează doar parțial: validează elementele de formular, dar nu afișează niciun mesaj vizibil atunci când câmpurile de formular nu se validează. Cu alte cuvinte, dacă introduceți o dată incorectă (sau scrisă greșit) în tipul = „data”, Safari și Chrome nu vor trimite formularul, dar nu vă vor spune de ce nu au făcut-o. Vor seta focalizarea pe un câmp care conține o valoare nevalidă, dar nu va afișa un mesaj de eroare precum Opera sau Firefox 4.
Câmpuri obligatorii
IE | Firefox | Safari | Crom | Operă | iPhone | Android |
- | 4.0+ | - | - | 9.0+ | - | - |
Validarea formularelor în HTML5 nu se limitează la tipul fiecărui câmp. De asemenea, puteți specifica că unele câmpuri sunt obligatorii, astfel de câmpuri trebuie să fie valide înainte de a putea trimite formularul.
Codul pentru câmpurile obligatorii este cât se poate de simplu.
Browserele pot schimba aspectul original al unui câmp obligatoriu. De exemplu, așa arată în Mozilla Firefox 4.0.
În plus, dacă încercați să trimiteți un formular fără a completa o valoare necesară, Firefox va afișa o bară de informații care vă va spune că câmpul este obligatoriu și nu poate fi gol.
Obiectul descris este un instrument foarte util și puternic. Acest obiect are mai multe metode, descrierea lor este dată mai jos:
Colecții:
Metode:
Proprietăți:
Răspuns la colectare. Cookie-uri
Colecția de cookie-uri stabilește valori pentru cookie-uri. Dacă cookie-urile specificate nu există, atunci le creează. Dacă cookie-ul există, acesta capătă o nouă valoare, iar cel vechi este distrus.
Răspuns.Cookie-uri (cookie) [(cheie) | ... atribute] = valoare
Opțiuni:
- prăjitură- Nume cookie
- cheie- Parametru optional. Dacă este specificat, atunci cookie-ul este o referință (imbricat) și cheia este un set de valori.
- atribute- Informațiile specificate despre cookie-urile în sine. Acest parametru poate fi unul dintre următoarele:
- sens- Indică valoarea de atribuit această cheie sau un atribut.
Nume | Descriere |
Domeniu | Scrie doar. Dacă este specificat, atunci cookie-urile sunt transmise numai la cerere din acest domeniu. |
Expiră | Scrie doar. Data expirării cookie-ului. Această dată trebuie setată pentru ca cookie-ul să fie scris clientului HDD dupa terminarea sedintei. Dacă acest atribut nu este setat, atunci data de expirare a cookie-urilor este acceptată data curenta... Cookie-urile vor expira imediat după încheierea sesiunii. |
HasKey | Doar lectură. Indică dacă cookie-ul conține cheia dată. |
cale | Scrie doar. Dacă este specificat, cookie-urile sunt transmise numai atunci când sunt solicitate din această cale. Dacă parametrul nu este setat, atunci este utilizată calea către aplicație. |
Sigur | Scrie doar. Indică dacă cookie-ul va fi protejat sau nu. |
Cometariu:
Dacă cookie-ul cu cheie este creat așa cum se arată în următorul script,
<% Response.Cookies("mycookie")("type1") = "сахар" Response.Cookies("mycookie")("type2") = "печенье" %>
atunci va fi trimis următorul antet:
Set-Cookie: MYCOOKIE = TYPE1 = zahăr și TYPE2 = cookie
Dacă atribuiți o valoare mycookie fără a utiliza chei, atunci această acțiune va distruge cheile type1 și type2. De exemplu:<% Response.Cookies("myCookie") = "шоколадный зефир" %>
În exemplul anterior, cheile tip1 și tip2 vor fi distruse, iar valorile lor se vor pierde. Mycookie va conține acum semnificația bezelelor de ciocolată.
De asemenea, puteți verifica existența unei chei specifice în felul următor:
<% = Response.Cookies("myCookie").HasKeys %>
Dacă este afișat TRUE, atunci o astfel de cheie există, în cazul FALSE - nr.
Răspuns.Metoda de scriere
Răspuns.Scrieți variabilă_sau_valoare
Opțiuni:
- variabilă_sau_valoare- Date de afișat pe ecranul browserului prin HTML. Acest parametru poate fi de orice tip acceptat de VisualBasic Scripting Edition. Adică datele pot fi de următoarele tipuri: dată, șir, simbol, valori numerice. Valoarea acestui parametru nu poate conține combinații de %>. Puteți utiliza în schimb combinația echivalentă% \>. Serverul web va converti această secvență în secvența necesară atunci când scriptul este executat.
Următorul exemplu arată cum funcționează metoda Response.write pentru a afișa un mesaj către client.
doar iti spun:<%Response.write "Привет всем!!!"%>Si numele tau<%Response.write(Request.Form("name"))%>
Următorul exemplu adaugă o etichetă HTML la o pagină web. Deoarece această metodă nu poate conține combinația%>, folosim secvența% \>. Deci un exemplu de script:
<% Response.write "
Răspuns la risc | Descriere/exemplu | Potrivit pentru…. tipuri de risc (acestea sunt sugestii și nu sunt exhaustive) |
Amenințări | ||
Evita | Riscul este evitat prin schimbarea proiectului într-un fel pentru a evita riscul. |
Unele riscuri politice de ex. opinia publică adversă. Unele riscuri tehnice/operaționale/de infrastructură, de ex. probleme de întreținere. Riscuri legale și de reglementare, de ex. controale de reglementare, cerințe de licențiere. |
Transfer | Unele riscuri strategice/comerciale de ex. împotriva furtului, insolvența poate fi asigurată. Consultați riscurile de afaceri pentru mai multe exemple. |
|
Reduce | Se iau măsuri pentru a reduce fie probabilitatea apariției riscului, fie impactul pe care acesta îl va avea. |
Cel mai des utilizat răspuns la risc. Aplicabil pe scară largă - Tehnic / Operațional / Infrastructură de ex. neglijență, eșec de performanță, sferă de aplicare, așteptări neclare. Factori organizaționali / de management / umani de ex. ciocniri de personalitate, conducere slabă și selecție slabă a personalului. |
Este posibil ca unele riscuri politice, juridice și de reglementare și economice/financiare să fie acceptate, de ex. război și dezordine, fluctuația cursului de schimb. |
||
Contingenta | Aici este pus în aplicare un plan pentru a răspunde dacă riscul este realizat. | Economic / financiar / de piata Probabil că toate riscurile pot și ar trebui să aibă un plan de urgență. |
Oportunități | ||
Acțiune | O oportunitate este împărtășită cu un partener sau furnizor de a maximiza beneficiile prin utilizarea resurselor/tehnologiilor partajate etc. | Tehnic / operațional / infrastructură de ex. tehnologie nouă, design îmbunătățit. |
Exploata | Un proiect ar putea fi ajustat pentru a profita de o schimbare a tehnologiei sau de o nouă piață. | Economic / financiar / de piata de ex. piețe noi și emergente, modificări pozitive ale ratelor de schimb sau ale ratelor dobânzii. |
Spori | Se iau măsuri pentru a crește probabilitatea apariției oportunității sau impactul pozitiv pe care l-ar putea avea. | Oportunități strategice / comerciale precum noi parteneriate, noi investiții de capital, noi promotori. |
Respinge | Aici nu se ia nicio măsură și șansa de a câștiga din oportunitate este respinsă. poate fi pusă în aplicare în cazul în care se ivește ocazia. | Politice sau de mediu de ex. noi legături de transport, schimbarea guvernului care aduce schimbări pozitive în politică / oportunități de lobby etc. |
Planuri de contingență ar trebui să identifice acțiunile care vor fi întreprinse dacă apare un risc. Acțiunile contingente vor avea adesea un cost asociat și un buget ar trebui alocat în cazul de afaceri pentru a acoperi acest lucru.
Primele 50 de riscuri de afaceri și cum să le gestionați!
20 Riscuri comune ale proiectelor - exemplu Registrul de riscuri
Lista de verificare a 30 de riscuri de construcție
Răspunsuri la risc - referințe
Office of Government Commerce (2002), Managing Successful Projects with PRINCE2, Londra: TSO.The Projects Group PLC, 2006, Privire de ansamblu asupra managementului riscului, Sutton: The Projects Group plc.