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ämobiiliPalvelin
KromiReunaFirefoxInternet ExplorerOopperaSafariAndroid-verkkonäkymäChrome AndroidilleFirefox AndroidilleOpera AndroidilleSafari iOS:ssäSamsung InternetNode.js
substr

Käytöstä poistettu

Chrome Täysi tuki 1Edge Täysi tuki 12Firefox Täysi tuki 1IE Täysi tuki 4Opera Täysi tuki KylläSafari Täysi tuki 1WebView Android Täysi tuki 1Chrome Android Täysi tuki 18Firefox Android Täysi tuki 4Opera Android Täysi tuki KylläSafari iOS Täysi tuki 1Samsung Internet Android Täysi tuki 1.0nodejs 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 , ja koska teemme jo niin, luodaan myös ne hienot kuvien koonmuutosohjaimet, joita olet usein nähnyt kuvankäsittelysovelluksissa.

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 ja tulosta kuva kankaalle tietyssä koossa ja nouta sitten uudet kuvatiedot kankaasta URI-tietoina.

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.