Js leikkaa linjaa lopusta. Kuvien koon muuttaminen ja rajaaminen Canvas-elementin avulla. Kosketustapahtumien lisääminen
Varoitus: Vaikka String.prototype.substr(…) ei ole täysin vanhentunut (kuten kohdassa "poistettu Web-standardeista"), sitä pidetään perinnöllinen toiminto ja sitä tulee välttää mahdollisuuksien mukaan. Se ei ole osa JavaScriptin ydinkieltä, ja se voidaan poistaa tulevaisuudessa. Jos mahdollista, käytä sen sijaan substring()-menetelmää.
The substr()-menetelmä palauttaa osan merkkijonosta alkaen määritetystä indeksistä ja jatkuen tietyn määrän merkkejä sen jälkeen.
Tämän interaktiivisen esimerkin lähde on tallennettu GitHub-tietovarastoon. Jos haluat osallistua interaktiivisten esimerkkien projektiin, kloonaa https://github.com/mdn/interactive-examples ja lähetä meille vetopyyntö.
Syntaksi
str .substr(alku [, pituus])Parametrit
start Ensimmäisen palautettavaan osamerkkijonoon sisällytettävän merkin indeksi. pituus valinnainen. Poimittavien merkkien määrä.Palautusarvo
Uusi merkkijono, joka sisältää määritetyn osan annetusta merkkijonosta.
Kuvaus
substr() poimii pituusmerkit merkkijonosta laskettuna aloitusindeksistä.
Jos alku on positiivinen luku, indeksi alkaa laskea merkkijonon alusta. Sen arvo on yläraja str.length .
Jos alku on negatiivinen luku, indeksi alkaa laskea merkkijonon lopusta. Sen arvon yläraja on -str.length .
Huomautus: Microsoft JScriptissä aloitusargumentin negatiivisten arvojen ei katsota viittaavan merkkijonon loppuun.
Jos pituus jätetään pois, substr() poimii merkit merkkijonon loppuun.
Jos pituus on määrittelemätön, substr() poimii merkit merkkijonon loppuun.
Jos pituus on negatiivinen luku, sitä käsitellään 0:na.
Sekä alussa että pituudessa NaN:ää käsitellään 0:na.
Esimerkkejä
Substr()
var aString = "Mozilla"; console.log(aString.substr(0, 1)); // "M" console.log(aString.substr(1, 0)); // "" console.log(aString.substr(-1, 1)); // "a" console.log(aString.substr(1, -1)); // "" console.log(aString.substr(-3)); // "lla" console.log(aString.substr(1)); // "ozilla" console.log(aString.substr(-20, 2)); // "Mo" console.log(aString.substr(20, 2)); // ""Polyfill
Microsoftin JScript ei tue negatiivisia arvoja aloitusindeksille Jos haluat käyttää tätä ominaisuutta JScriptissä, voit käyttää seuraavaa koodia:
// suoritetaan vain kun substr()-funktio on rikki, jos ("ab".substr(-1) != "b") ( /** * Hanki merkkijonon osamerkkijono * @param (kokonaisluku) aloita mistä aloittaa alimerkkijono * @param (kokonaisluku) pituus kuinka monta merkkiä palautetaan * @return (merkkijono) */ String.prototype.substr = function(substr) ( paluufunktio(alku, pituus) ( // kutsua alkuperäistä menetelmää return substr. call(this, // saimmeko negatiivisen alun, laske kuinka paljon se on merkkijonon alusta // säädä negatiivisen arvon aloitusparametri< 0 ? this.length + start: start, length) } }(String.prototype.substr); }
Tekniset tiedot
Erittely |
---|
ECMAScriptin uusin luonnos (ECMA-262) Määritelmä "String.prototype.substr" kyseisessä määrittelyssä. |
Selaimen yhteensopivuus
Tämän sivun yhteensopivuustaulukko on luotu strukturoiduista tiedoista. Jos haluat osallistua tietoihin, käy osoitteessa https://github.com/mdn/browser-compat-data ja lähetä meille vetopyyntö.
Päivitä GitHubin yhteensopivuustiedot
Työpöytä | mobiili | Palvelin | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kromi | Reuna | Firefox | Internet Explorer | Ooppera | Safari | Android-verkkonäkymä | Chrome Androidille | Firefox Androidille | Opera Androidille | Safari iOS:ssä | Samsung Internet | Node.js | |
substr Käytöstä poistettu | Chrome Täysi tuki 1 | Edge Täysi tuki 12 | Firefox Täysi tuki 1 | IE Täysi tuki 4 | Opera Täysi tuki Kyllä | Safari Täysi tuki 1 | WebView Android Täysi tuki 1 | Chrome Android Täysi tuki 18 | Firefox Android Täysi tuki 4 | Opera Android Täysi tuki Kyllä | Safari iOS Täysi tuki 1 | Samsung Internet Android Täysi tuki 1.0 | nodejs Täysi tuki Kyllä |
Legenda
Täysi tuki Täysi tuki Käytöstä poistettu. Ei käytettäväksi uusilla verkkosivuilla. Käytöstä poistettu. Ei käytettäväksi uusilla verkkosivuilla.Opi muokkaamaan kuvien kokoa ja rajaamaan niitä JavaScriptin ja HTML5 Canvas -elementin avulla käyttämällä kuvankäsittelysovelluksissa käyttämiäsi säätimiä:
Tässä artikkelissa näytän sinulle, kuinka voit muuttaa kuvien kokoa ja rajata niitä HTML5-elementin avulla
Live-ympäristössä verkkosivusto tai sovellus saattaa käyttää tätä tekniikkaa koon muuttamiseen ja profiilikuvan luomiseen ennen lataamista.
Voisimme tehdä tämän palvelimella, mutta tämä vaatisi mahdollisesti suurten tiedostojen siirtämistä, mikä vie paljon aikaa. Sen sijaan voimme muuttaa kuvan kokoa asiakaspuolella ennen kuin se on ladattu. Tämän avulla voit tehdä kaiken paljon nopeammin.
Tätä varten luomme HTML5-elementin
Useimmat selaimet tukevat jo näitä menetelmiä, joten voit todennäköisesti ottaa tämän tekniikan käyttöön heti. Sinun on kuitenkin oltava tietoinen joistakin rajoituksista, joita selaimet eivät tue, kuten kuvanlaatu ja suorituskyky.
Erittäin suurten kuvien koon muuttaminen voi hidastaa selaimen toimintaa tai joissain tapauksissa jopa kaataa sovelluksen. Siksi on järkevää asettaa kohtuulliset rajoitukset ladattavien tiedostojen koolle. Jos laatu on sinulle tärkeää, tämä tekniikka saattaa olla epäkäytännöllinen, koska selain heikentää kuvan laatua käsittelyn aikana.
Olemassa useita tekniikoita, joilla voidaan parantaa kankaasta skaalattujen kuvien laatua emme kuitenkaan käsittele niitä tässä artikkelissa.
Näet lopputuloksen tässä demossa tai voit ladata ZIP-arkiston.
No, nyt aloitetaan!
Merkintä
Demossamme aloitamme olemassa olevasta kuvasta:
Siinä kaikki! Tämä on kaikki HTML-koodi, jota tarvitsemme tähän esittelyyn.
CSS
CSS on myös hyvin minimaalinen. Ensin määritellään tyylit koonmuutossäiliölle ja kuvalle:
Resize-container ( sijainti: suhteellinen; näyttö: inline-block; kohdistin: siirrä; marginaali: 0 auto; ) .resize-container img ( näyttö: block ) .resize-container:hover img, .resize-container:active img ( ääriviivat: 2px katkoviiva rgba(222,60,80,.9 )
Resize-handle-ne, .resize-handle-ne, .resize-handle-se, .resize-handle-nw, .resize-handle-sw ( sijainti: absoluuttinen; näyttö: lohko; leveys: 10px; korkeus: 10px; tausta: rgba(222,60,80,.9); .resize-handle-nw (ylä: -5px; vasen: -5px; kohdistin: nw-resize; ) .resize-handle- sw; ( alhaalla: -5px; vasen: -5px; kohdistin: sw-resize; ) .resize-handle-ne ( ylhäällä: -5px; oikea: -5px; kohdistin: ne-resize; ) .resize-handle-se ( alhaalla : -5px; oikea: -5px: se-resize;
JavaScript
Aloitamme JavaScriptin määrittelemällä joitain muuttujia ja alustamalla Canvasin ja kohdekuvan:
var resizeableImage = function(image_target) ( var $container, orig_src = new Image(), image_target = $(image_target).get(0), tapahtuman_tila = (), constrain = false, min_width = 60, min_height = 60, max_width = 800, max_height = 900, resize_canvas = document.createElement("canvas" )); resizeableImage($(.resize-image"));
Seuraavaksi luomme init-funktion, joka kutsutaan heti käynnistyksen yhteydessä. Tämä toiminto kääri kuvan säilöön, luo koonmuutoskahvat ja kopion alkuperäisestä kuvasta, jota käytetään koon muuttamiseen.
Määritämme myös säiliöelementin JQuery-objektin muuttujaan, jotta voimme käyttää sitä myöhemmin ja lisätä hiiri alas -tapahtuman kuuntelijan, joka havaitsee, kun joku alkaa vetää jotakin kahvoista:
var resizeableImage = function(image_target) ( // ... init = function())( // Luo uusi kuva, jossa on kopio alkuperäisestä src:stä // Kun muutamme kuvan kokoa, käytämme aina tätä kopiota pohjana orig_src .src=image_target.src ; // Lisää koonmuutosmerkit $(image_target).wrap("
").ennen(" ").ennen(" ").jälkeen(" ").jälkeen(" "); // Hae muuttujat säilölle $container = $(image_target).parent(.resize-container"); // Lisää tapahtumia $container.on("mousedown", ".resize-handle", startResize) ; ); //... sen sisällä();StartResize- ja endResize-toiminnot vain käskevät selaimen aloittamaan hiiren liikkeen seurannan ja lopettamaan seurannan:
startResize = function(e)( e.preventDefault(); e.stopPropagation(); saveEventState(e); $(document).on("mousemove", koon muuttaminen); $(document).on("hiiri", endResize ); endResize = function(e)( e.preventDefault(); $(document).off("mouseup touchend", endResize); $(document).off("mousemove touchmove", koon muuttaminen); );
Ennen kuin aloitamme hiiren sijainnin seuraamisen, meidän on otettava tilannekuva säiliön mitoista ja muista tärkeistä tiedoista.
Tallennamme ne muuttujaan nimeltä event_state ja käytämme sitä myöhemmin lähtökohtana korkeutta ja leveyttä muuttaessa:
saveEventState = function(e)( // Tallenna tapahtuman alkuparametrit ja säilön tila event_state.container_width = $container.width(); event_state.container_height = $container.height(); event_state.container_left = $container .offset().left ; event_state.container_top = $container.offset().top (); = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); kopioi kosketusominaisuudet suoraan if (e.originalEvent.touches !== "undefined")( event_state.touches = ; $.each(e.originalEvent.touches, function(i, ob)( event_state.touches[i] = ( ); tapahtuman_tila.kosketukset [i].clientX = 0+ob.clientX = tapahtuman_tila.kosketukset[i].clientY = 0+ob.clientY ));
Suurin osa toiminnoista tapahtuu koonmuutostoiminnossa. Tätä toimintoa kutsutaan jatkuvasti, kun käyttäjä vetää yhtä mitoituskahvoista. Joka kerta kun tätä funktiota kutsutaan, luomme uuden leveyden ja korkeuden laskemalla hiiren nykyisen sijainnin ja käyttäjän vetämän kulman alkuperäisen sijainnin välisen suhteen:
koon muuttaminen = function(e)( var hiiri=(),leveys,korkeus,vasen,ylä,offset=$container.offset(); hiiri.x = (e.clientX || e.pageX || e.originalEvent.touches .clientX) + $(window).scrollLeft(); hiiri.y = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); x - event_state.container_left = hiiri.y - tapahtuman_tila.säilön_yläosa && korkeus > min_korkeus && leveys< max_width && height < max_height){ resizeImage(width, height); // Без этого Firefox не будем пересчитывать размеры изображения, пока перетаскивание не завершилось $container.offset({"left": left, "top": top}); } }
Lisäämme sitten vaihtoehdon rajoittaa kuvan kokoa vaihdettaessa Shift-näppäimellä tai muuttujalla.
Lopuksi muutamme kuvan kokoa, mutta vain jos uusi leveys ja korkeus ovat alussa asettamiemme muuttujien minimi- ja maksimiarvojen sisällä.
Huomautus: Koska itse asiassa muutamme kuvan kokoa, emme vain korkeus- ja leveysmääritteitä, saatat haluta rajoittaa sitä, kuinka usein resizeImage voidaan kutsua suorituskykysyistä. Tätä kutsutaan debouncingiksi tai kuristukseksi.
Todellinen kuvan koon muuttaminen
Voit yksinkertaisesti piirtää kuvan käyttämällä drawImagea. Asetamme ensin kankaalle korkeuden ja leveyden ja käytämme aina täysikokoisen kuvan alkuperäistä kopiota. Käytämme sitten kankaalla olevaa toDataURL-osoitetta saadaksemme Base64-koodatun version äskettäin muokatusta kuvasta ja sijoitamme sen sivulle.
Leikkausta käsittelevä osio tarjoaa täydellisen selityksen kaikista vaihtoehdoista, joita voidaan käyttää drawImage-menetelmän kanssa:
resizeImage = funktio(leveys, korkeus)( resize_canvas.width = leveys; resize_canvas.height = korkeus; resize_canvas.getContext("2d").drawImage(orig_src, 0, 0, leveys, korkeus); $(image_target).attr( "src", resize_canvas.toDataURL("image/png") );
Liian helppo? On yksi pieni varoitus: kuvan on oltava samassa verkkotunnuksessa kuin sivu tai palvelimella kyky vaihtaa eri lähdelähteiden kanssa (CORS). Muuten sinulla voi olla ongelmia virheiden kanssa " vaurioitunut kangas«.
Koon muuttaminen eri kulmista
Sinulla pitäisi nyt olla toimiva demoversio. Mutta siinä ei vielä kaikki. Tällä hetkellä se ei vielä toimi niin, että koon muuttaminen tapahtuu ikään kuin vedämme oikeaa alakulmaa, riippumatta siitä, mistä kulmasta muutamme kuvan kokoa.
Meidän on voitava muuttaa kuvan kokoa mistä tahansa kulmasta. Tätä varten meidän on ymmärrettävä demomallimme käyttäytyminen.
Kun kokoa muutetaan, kulman, jota vedämme, sekä sen viereisten sivujen tulee liikkua, kun taas vastakkaisen kulman ja sen viereisten sivujen tulee pysyä paikoillaan:
Kun muutamme kuvan leveyttä ja korkeutta, oikea ja alareuna liikkuvat, kun taas ylä- ja vasen reuna pysyvät paikoillaan. Tämä tarkoittaa, että kuvien kokoa muutetaan oletusarvoisesti oikeasta alakulmasta.
Emme voi muuttaa tätä oletustoimintoa, mutta kun muutamme kokoa mistä tahansa muusta kulmasta kuin oikeasta alakulmasta, voimme muuttaa kuvan yleistä sijaintia siten, että se näyttää siltä, että vastakkainen kulma ja sen viereiset reunat pysyvät paikoillaan. Päivitetään koonmuutostoimintomme:
koon muuttaminen = function(e)( var hiiri=(),leveys,korkeus,vasen,ylä,offset=$container.offset(); hiiri.x = (e.clientX || e.pageX || e.originalEvent.touches .clientX) + $(window).scrollLeft(); hiiri.y = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); riippuu eri kulmasta, jota vedämme if($(tapahtuman_tila.evnt.target).hasClass("resize-handle-se"))( leveys = hiiri.x - tapahtuman_tila.säilön_vasen; korkeus = hiiri.y - tapahtuman_tila .säilön_yläosa; left = event_state.container_left; top = tapahtuman_tila.säilön_yläosa container_left); korkeus = hiiren = tapahtuman_tila.säilön_leveys - (hiiri.x - tapahtuman_tila.säilön_vasen korkeus = tapahtuman_tila.säilön_korkeus - (hiiri.y - tapahtuman_tila.säilön_yläosa); vasen = hiiri.x; top = hiiri.y; if(constrain || e.shiftKey)( top = hiiri.y - ((leveys / orig_src.width * orig_src.height) - korkeus); ) ) else if($(tapahtuman_tila.evnt.target).hasClass("muuta kokoa -käsittelijä |. e.shiftKey)( top = hiiri.y - ((leveys / orig_src.width * orig_src.height) - korkeus); ) ) // Tukee valinnaisesti kuvasuhdetta if(constrain || e.shiftKey)( korkeus = leveys / orig_src.width * orig_src.height ) if(leveys > min_leveys && korkeus > min_korkeus && leveys< max_width && height < max_height){ // Для увеличения производительности вы можете ограничить количество вызовов resizeImage() resizeImage(width, height); // Без этого Firefox не будет пересчитывать размеры изображения, пока перетаскивание не завершилось $container.offset({"left": left, "top": top}); } }
Koodimme tarkistaa nyt, mitä koonmuutoskahvaa vedetään, ja siirtää kuvaamme niin, että vastaava kulma näyttää pysyvän paikallaan.
Kuvan siirtäminen
Nyt kun voimme muuttaa kuvan kokoa vetämällä sen kulmista, olet ehkä huomannut, että voimme vahingossa muuttaa kuvan sijaintia sivulla.
Nyt meidän on varmistettava, että kuva palaa takaisin kehyksen keskelle. Lisätään init-funktioon toinen tapahtumaseuranta, joka on samanlainen kuin aiemmin luomamme:
init = function())( //... $container.on("mousedown", "img", startMoving); )
Nyt lisäämme startMoving- ja endMoving-funktiot samalla tavalla kuin lisäsimme startResize ja endResize:
startMoving = function(e)( e.preventDefault(); e.stopPropagation(); saveEventState(e); $(document).on("mousemove", liikkuva); $(document).on("hiiri", endMoving ); endMoving = function(e)( e.preventDefault(); $(document).off("hiiri", endMoving); $(document).off("mousemove", liikkuu); );
Siirtofunktion on laskettava uusi sijainti säiliön vasemmalle yläreunalle. Se on yhtä suuri kuin hiiren nykyinen sijainti, jota kompensoi etäisyys vasemmasta yläkulmasta hiireen, kun aloitimme vetää kuvaa:
liikkuva = toiminto(e)( var hiiri=(); e.preventDefault(); e.stopPropagation(); hiiri.x = (e.clientX || e.pageX) + $(window).scrollLeft(); hiiri .y = (e.clientY || e.pageY) + $(window).scrollTop(); $container.offset(( "vasen": hiiri.x - (tapahtuman_tila.hiiri_x - tapahtuman_tila.säilö_vasen), "ylä" : hiiri.y - (tapahtuman_tila.hiiri_y - tapahtuman_tila.säilön_yläosa) ));
Kuvan rajaaminen
Nyt kun voimme muuttaa kuvan kokoa, sinun kannattaa ehkä rajata sitä. Sen sijaan, että antaisimme käyttäjille mahdollisuuden rajata kuvaa mihin tahansa kokoon ja muotoon, luodaan kehys, jolla on tarkat mitat tarvitsemme, ja kehotetaan käyttäjiä sijoittamaan kuva kehyksen sisään.
He pystyvät määrittämään rajatun kehyksen mittakaavan ja sijainnin alkuperäisessä kuvassa, ja me puolestaan olemme varmoja, että lopullinen kuva on aina saman muotoinen ja kokoinen.
Tätä varten meidän on lisättävä seuraava HTML-koodi:
Peittokuvakehyksen tyylit ovat erittäin tärkeitä, erityisesti sijainti, leveys ja korkeus, koska niitä käytetään määrittämään, kuinka suuri osa kuvasta rajataan.
On myös tärkeää muistaa, että kehyksen on aina oltava näkyvissä minkä tahansa väristä taustaa vasten. Siksi esimerkissäni käytin puoliläpinäkyvää valkoista ääriviivaa pääikkunan ympärillä:
Peittokuva ( sijainti: absoluuttinen; vasen: 50 %; yläosa: 50 %; marginaali vasen: -100 kuvapistettä; marginaali yläosa: -100 kuvapistettä; z-indeksi: 999; leveys: 200 kuvapistettä; korkeus: 200 kuvapistettä; reunus: kiinteä 2px rgba( 222,60,80,.9 laatikon koko: osoittimen tapahtumat: ei mitään .peittokuva: ennen korkeus: 40px: katkoviiva rgba(222,60,80,.9): katkoviiva rgba(222,60,80,.9); margin-top: -40px ) .overlay:after ( ala: 0; margin-vasen: -2px; margin-bottom: -40px; ) .overlay-inner:after, .overlay -inner:before ( sisältö: ""; sijainti: lohko: 40px:n yläreuna: katkoviiva 2px rgba(222,60,80,.9); ); .overlay-inner:before (vasen: 0; margin-vasen: -40px; margin-top: -2px; ) .overlay-inner:after (oikea: 0; margin-oikea: -40px; margin-top: -2px) .btn-crop ( sijainti: absoluuttinen; pystysuora tasaus: alhaalla; oikea: 5px; pohja: 5px; täyte: 6px 10px; z-indeksi: 999; taustaväri: rgb(222,60,80); reuna: ei mitään; reunan säde: 5px; väri: #FFF; )
Lisää seuraava toiminto ja tapahtumaseuranta JavaScriptiisi:
init = function())( //... $(".js-crop").on("napsauta", rajaa); ); rajaa = function())( var crop_canvas, left = $(".overlay").offset().left - $container.offset().left, top = $(.overlay").offset().top - $container.offset().top, leveys = $(.overlay").width(), korkeus = $(.overlay").korkeus("canvas"); = leveys crop_canvas.height = korkeus png"));)
Rajaustoiminto on samanlainen kuin resizeImage-funktio, mutta korkeus- ja leveysarvon välittämisen sijaan saamme korkeuden ja leveyden peittoelementistä.
Kankaan drawImage-menetelmä vaatii yhdeksän parametria rajaamiseen. Ensimmäinen parametri on kuvan lähde. Seuraavat neljä parametria osoittavat, kuinka paljon alkuperäisestä kuvasta on käytetty (leikkauslaatikko). Neljä viimeistä parametria osoittavat, missä kankaalla kuva näytetään ja missä koossa.
Kosketustapahtumien lisääminen
Mousedownille ja mouseupille on vastaavat kosketustapahtumat - touchstart ja touchend, mousemoville on vastaava touchmove-tapahtuma. Sillä, joka nimesi nämä tapahtumat, puuttui selvästi huumorintaju, muuten hän olisi voinut kutsua niitä "touchdowniksi" ja "touchupiksi".
Lisätään touchstart ja touchend sinne, missä meillä on mousedown ja mouseup , ja korvataan mousemove touchmovella:
// Kohdassa init()... $container.on("mousedown touchstart", ".resize-handle", startResize); $container.on("mousedown touchstart", "img", startMoving); //In startResize() ... $(document).on("mousemove touchmove", liikkuva); $(document).on("mouseup touchend", endMoving); //In endResize()... $(document).off("mouseup touchend", endMoving); $(dokumentti).off("mousemove touchmove", liikkuu); //In startMoving()... $(document).on("mousemove touchmove", liikkuva); $(document).on("mouseup touchend", endMoving); //In endMoving()... $(document).off("mouseup touchend", endMoving); $(dokumentti).off("mousemove touchmove", liikkuu);
Koska muutamme kuvan kokoa, on kohtuullista odottaa, että jotkut käyttäjät haluavat käyttää yleisiä toimintoja, kuten kuvan venyttämistä. Hammer-kirjastossa on monia käteviä työkaluja kosketustapahtumien käsittelyyn.
Mutta koska tarvitsemme vain venytystä, voimme pärjätä ilman sitä. Nyt näytän sinulle, kuinka helppoa on luoda venytys ilman kolmannen osapuolen kirjastoa.
Olet ehkä huomannut, että saveEventState-toiminto tallentaa jo alkuperäiset kosketustiedot; me tarvitsemme tätä nyt.
Tarkistamme ensin, sisältääkö tapahtuma kaksi "kosketusta" ja mittaamme niiden välisen etäisyyden. Merkitsemme tämän alkuetäisyydeksi ja mittaamme sitten kuinka paljon tämä etäisyys muuttuu liikkuessamme. Päivitetään siirtotoiminto:
liikkuva = function(e)( var hiiri=(), koskettaa; e.preventDefault(); e.stopPropagation(); koskettaa = e.originalEvent.touches; mouse.x = (e.clientX || e.pageX || touches.clientX) + $(window).scrollLeft(); hiiri.y vasen": hiiri.x - (tapahtuman_tila.hiiri_x - tapahtuman_tila.säilö_vasen), "yläosa": hiiri.y - (tapahtuman_tila.hiiri_y - tapahtuman_tila.säilön_yläosa) )); // Seuraa venytystä liikuttaessa if(tapahtuman_tila.touches && event_state .touches.length > 1 && touches.length > 1)( var leveys = tapahtuman_tila.säilön_leveys, korkeus = tapahtuman_tila.säilön_korkeus; var a = tapahtuman_tila.touches.clientX - event_state.touches.clientX; a = a * a; var b = event_state.touches.clientY var dist1 = e.originalEvent.touches.client - touches.client - touches.clientY b = b * b; var suhde = dist2/dist1; leveys = leveys * suhde; korkeus = korkeus * suhde; // Suorituskyvyn parantamiseksi voit rajoittaa kutsujen määrää resizeImage() resizeImage(width, height); ) );
Jaamme nykyisen etäisyyden alkuperäisellä etäisyydellä määrittääksemme suhteen ja käytämme sitä vastaavasti kuvan skaalaamiseksi. Laskemme uuden leveyden ja korkeuden ja muutamme sitten kuvan kokoa:
Siinä kaikki. Katso demoversio uudelleen tai lataa ZIP-arkisto.
Testauksessa huomasin, että Chrome estää oletusselainta reagoimasta venytykseen, mutta Firefox toimii hyvin.
Toivottavasti tämä artikkeli oli sinulle hyödyllinen. Kehotan sinua lukemaan muita vedettäviä elementtejä ja tiedostojen lataustekniikoita käsitteleviä artikkeleita ja katsomaan, kuinka muut ihmiset yhdistävät näitä tekniikoita luodakseen kauniita käyttöliittymiä.
Tämä julkaisu on käännös artikkelista " KUVIEN KOON MUUTTAMINEN JA RAJAAMINEN KANAVALLA", jonka on valmistellut ystävällinen projektitiimi
If (!String.prototype.trim) ( (function() ( // Varmista, että trimmaamme BOM ja nbsp var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/ g; merkkijono.prototyyppi.trim = function() ( palauttaa this.replace(rtrim, ""); ))();
Katso tämä:
String.prototype.trim=function())(palauta this.replace(/^\s+|\s+$/g, ""); String.prototype.ltrim=function())(return this.replace(/^\s+/,"");); String.prototype.rtrim=function())(return this.replace(/\s+$/,"");); String.prototype.fulltrim=function())(return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,"").korvaa ( /\s+/g," "););
479
Kromi: 5+
Ooppera: 10.5+
126
Ei ole yllättävää, että regex-pohjainen on hitaampi kuin perinteinen silmukka.
Tässä on henkilökohtainen esimerkkini. Tämä koodi on erittäin vanha! Kirjoitin sen JavaScript1.1:lle ja Netscape 3:lle, ja sen jälkeen sitä on vain vähän päivitetty. (Alkuperäinen käytetty String.charAt)
/** * Leikkaa merkkijono. Leikkaa itse asiassa kaikki ohjausmerkit. * Ohittaa hienot Unicode-välit. Pakottaa ketjuun. */ funktio trim(str) ( str = str.toString(); var begin = 0; var end = str.length - 1; while (alku<= end && str.charCodeAt(begin) < 33) { ++begin; } while (end >begin && str.charCodeAt(end)< 33) { --end; } return str.substr(begin, end - begin + 1); }
13
Käytä alkuperäisiä JavaScript-menetelmiä: String.trimLeft() , String.trimRight() ja String.trim() .
String.trim() on tuettu IE9+:ssa ja kaikissa muissa yleisimmissä selaimissa:
"Hei".trim() //-> "Hei"
String.trimLeft() ja String.trimRight() ovat epästandardeja, mutta niitä tuetaan kaikissa yleisimmissä selaimissa, paitsi IE
" Hei ".trimLeft() //-> "Hei " " Hei ".trimRight() //-> " Hei"
IE-tuki on kuitenkin helppoa polyfillillä:
If (!"".trimLeft) ( String.prototype.trimLeft = function() ( palauta tämä.replace(/^\s+/,""); ); String.prototype.trimRight = function() ( palauta tämä.korvaa (/\s+$/,"" ); if (!"".trim) ( String.prototype.trim = function() ( return this.replace(/^\s+|\s+$/g, "" ); ) )
10
String.prototype.trim = String.prototype.trim || funktio () ( palauttaa this.replace(/^\s+|\s+$/g, ""); ); String.prototype.trimLeft = String.prototype.trimLeft || funktio () ( palauttaa this.replace(/^\s+/, ""); ); String.prototype.trimRight = String.prototype.trimRight || funktio () ( palauttaa this.replace(/\s+$/, ""); ); String.prototype.trimFull = String.prototype.trimFull || funktio () ( palauttaa this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, "").replace(/\s+/g, "");
7
Muutt trim = (function() ( // jos viite on `merkkijono`. funktio isString(arvo)( return typeof value == "string"; } // native trim is way faster: http://jsperf.com/angular-trim-test // but IE doesn"t have it... :-(// TODO: we should move this into IE/ES5 polyfill if (!String.prototype.trim) { return function(value) { return isString(value) ? value.replace(/^\s*/, "").replace(/\s*$/, "") : value; }; } return function(value) { return isString(value) ? value.trim() : value; }; })(); !}
ja kutsukaamme sitä trimmiksi (" hei ")
4
käytä yksinkertaista koodia
Var str = "Hei maailma!"; hälytys(str.trim());
Selaimen tuki
Ominaisuus Chrome Firefox Internet Explorer Opera Safari Edge Perustuki (Kyllä) 3.5 9 10.5 5 ?
Jos kyseessä on vanha selain, lisää prototyyppi
4
Tässä on hyvin yksinkertainen tapa:
Funktio removeSpaces(string)( return string.split(" ").join(""); )
3
Voit yksinkertaisesti ilmoittaa muuttujan merkkijonoksi ja käyttää sen trimmitoimintoa:
Var str = new String("oma merkkijono"); str= str.trim();
2
Nykyään melkein kaikki selaimet tukevat String.prototype.trim() .
Käytät sitä näin:
Var origStr = "foo"; var newStr = origStr.trim(); // NewStr:n arvosta tulee "foo"
Jos saatat silti tarvita tukea vanhalle selaimelle, joka ei tue tätä ominaisuutta, tämä on polyfill MDN:n ehdottama:
If (!String.prototype.trim) ( String.prototype.trim = funktio () ( palauttaa this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
1
Minulla on lib, joka käyttää trimmaa. joten se ratkaistiin seuraavalla koodilla.
String.prototype.trim = String.prototype.trim || function())( return jQuery.trim(this); );
1
If(!String.prototype.trim)( String.prototype.trim = function())( return this.replace(/^\s+|\s+$/gm,""); ) )
Se eroaa aiemmista vastauksista lisäämällä m-lipun.
M-lippu etsii tekstiä useiden lineaaristen piirteiden perusteella. Tässä tilassa aloitus- ja lopetuskuvion merkki (^$) lisätään rivinvaihtomerkin (\n) eteen ja sen jälkeen.
0
En tiedä, millaisia vikoja täällä voi piilottaa, mutta käytän tätä:
Var some_string_with_extra_spaces=" menee tähän " console.log(some_string_with_extra_spaces.match(/\S.*\S|\S/))
Tai tämä, jos teksti sisältää syötteitä:
Console.log(joku_merkkijono_ja_lisävälilyöntejä.match(/\S[\s\S]*\S|\S/))
Uusi yritys:
Console.log(jokin_merkkijono_ja_lisävälilyöntejä.match(/^\s*(.*?)\s*$/))
0
Kirjoitin tämän funktion trimmaa varten, kun trim()-toiminto ei ollut käytettävissä JS:ssä vuonna 2008. Jotkut vanhemmat selaimet eivät edelleenkään tue tätä .trim()-toimintoa, ja toivon, että tämä toiminto voi auttaa jotakuta.
TRIM-TOIMINTO
Funktio trim(str) ( var startpatt = /^\s/; var endpatt = /\s$/; while(str.search(startpatt) == 0) str = str.substring(1, str.length); while (str.search(endpatt) == str.length-1) str = str.substring(0, str.length-1);
Selitys: Trim()-funktio ottaa merkkijonoobjektin ja poistaa kaikki edessä ja lopussa olevat välilyönnit (välilyönnit, sarkaimet ja rivinvaihdot) ja palauttaa leikatun merkkijonon. Tätä toimintoa voidaan käyttää lomakkeen syöttämiseen, jotta varmistetaan, että oikeat tiedot lähetetään.
Esimerkkinä funktio voidaan kutsua seuraavasti.
muoto.elementit[i].arvo = trimma(muoto.elementit[i].arvo);
leikkaa merkkijonoa jqueryssä
Minun on leikattava merkkijono 100 ensimmäiseen merkkiin käyttämällä jquery/javascriptiä. on myös mahdollista skannata merkkijono ja etsiä tiettyä avainsanayhdistelmää, kuten #avain? Kiitos paljon...
Vastaako Javascriptin $.trim?
$.trim(arvo); Yllä oleva jquery-koodi leikkaa tekstin. Minun täytyy leikata merkkijono Javascriptillä. Yritin: link_content = check; trim_check =...
Kuinka voin leikata tämän javascript-merkkijonon?
Kuinka voin leikata tämän merkkijonon JavaScriptissä/jqueryssä 0,00 £, siinä on vasemman ja oikean välilyönnit, jotka voin yksinkertaisesti poistaa trim()-funktiolla, mutta haluan poistaa tämän £ ja saada arvon 0,00.
Kuinka leikata merkkijono N merkkiin Javascriptissä?
Kuinka voin luoda Javascriptin avulla funktion, joka katkaisee argumenttina välitetyn merkkijonon tietyn pituiseksi, joka välitetään myös argumenttina. Esimerkiksi: var string =...
leikkaa merkkijono javascriptin merkkijonon ensimmäisestä numerosta
Minulla on merkkijono IX - toimitus vastaanotettu 15.1.2018 9:34:00 Haluan merkkijonon, kuten IX - toimitus vastaanotettu JavaScriptissä. Menen niin pitkälle kuin var finalname = title.replace(//g, ""); var...
Leikkaa merkkijono molemmista päistä javascriptillä
Mahdollinen kaksoiskappale: kuinka leikata merkkijono javascriptissä? Minulla on alla rivi, joka tulee ajax-vastauksesta \r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\tVIRHE: Profiili: EI ONNISTU \nKOODI: 2\nLUOKKA:...
Haluan leikata merkkijonoa JavaScriptin/regexin avulla
Etsin apua JavaScriptin/Regexin kanssa, kun yritän muotoilla tekstiä. Minulla on seuraavat tunnukset: 00A1234/A12 0A1234/A12 A1234/A12 000A1234/A12 Etsin tapaa, jolla voin leikata kaiken...
Leikkaa lanka
Esimerkki: abcdefgh\nbbbbbbbbb Aina kun kohtaan \n, haluan katkaista rivin saadakseni uuden rivin, joka tulee ennen \n. Tuloksena pitäisi olla jakso. Miten voin tehdä tämän...
Javascript leikkaa monirivinen merkkijono leikkaamatta sanoja
Etsin vastausta merkkijonon leikkaamiseen tietyn merkin pituiseksi leikkaamatta sanoja pois. Etsin kysymyksiä ja löysin tämän: javascript lyhennä merkkijonoa leikkaamatta sanoja, halusin käyttää @Hamihin vastausta...
Kuinka leikata merkkijono tietyn merkin jälkeen javascriptissä
Minulla on merkkijono, kuten image.jpg. Haluan tallentaa kuvan sen nimellä, joten minun on rajattava kuvalaajennus. Kaikki javascriptin menetelmät tämän saavuttamiseksi.