JavaScript implementiert die Drag-Slider-Puzzle-Verifizierungsfunktion (html5, Canvas)

JavaScript implementiert die Drag-Slider-Puzzle-Verifizierungsfunktion (html5, Canvas)

Einführung:

Die Überprüfung des Ziehens von Schiebereglern wird mittlerweile an vielen Stellen verwendet. Ich habe am Wochenende darüber nachgedacht, eine zu schreiben und sie hier einzustellen, um zu sehen, ob sie jemand verwenden kann! Wirkung:

Umsetzungsideen:

Zeichnen Sie das Quellbild auf einer Leinwand und zeichnen Sie dann ein ausgefülltes Quadrat, um den fehlenden Effekt zu erzielen (die Koordinaten des Quadrats sind zufällig).

Zeichnen Sie den Ziehblock auf einer anderen Leinwand und verwenden Sie drawImage, um das Originalbild mit denselben Koordinaten und derselben Größe wie der quadratische Bereich im vorherigen Schritt zu erfassen. Dies wird als Bestätigungsbild verwendet und ganz links platziert.

Drücken Sie beim Ziehblock die Maus und ziehen Sie, der Ziehblock und das Überprüfungsdiagramm werden mit der Maus bewegt. Lassen Sie die Maus nach Erreichen eines bestimmten Bereichs los und die Überprüfung wird durchgeführt.

Wenn die Überprüfung erfolgreich ist, wird die Meldung „Überprüfung erfolgreich“ angezeigt. Wenn die Überprüfung nicht erfolgreich ist, kehren der gezogene Block und das Überprüfungsdiagramm ganz nach links zurück.

3 Konstrukteure Bildkonstruktor

//Bildobjekt ImageDraw Konstruktorfunktion ImageDraw(o,obj){
		diese.id='',
		this.image=0, //Bildobjekt (erforderlich)
		this.sx=0, //Start-x-Position des Bildausschnitts (nicht erforderlich bei Anzeige des gesamten Bildes)
		this.sy=0, //Start-Y-Position des Bildausschnitts (nicht erforderlich bei Anzeige des gesamten Bildes)
		this.sWidth=0, //Startbreite des Bildausschnitts (muss nicht ausgefüllt werden, wenn das gesamte Bild angezeigt wird)
		this.sHeight=0, //Starthöhe des Bildausschnitts (muss nicht ausgefüllt werden, wenn das gesamte Bild angezeigt wird)
		this.dx=0, //Ziel-X-Position des Bildes (erforderlich)
		this.dy=0, //Ziel-Y-Position des Bildes (erforderlich)
		this.dWidth=0, //Zielanzeigebreite des Bildes (muss nicht ausgefüllt werden, wenn die Breite nicht skaliert ist)
		this.dHeight=0 //Zielhöhe des Bildes (muss nicht ausgefüllt werden, wenn die Höhe nicht skaliert ist)
		
		dies.init(o,obj);
	}
	ImageDraw.prototype.init=Funktion(o,obj){
		für (var Schlüssel in o) {
			dies[Schlüssel]=o[Schlüssel];
		}
		gib dies zurück;
	}
	ImageDraw.prototype.render=Funktion(Kontext){
		zeichnen(Kontext, dies);
		Funktion zeichnen(Kontext,Objekt) {
			var ctx=Kontext;
			ctx.speichern();
			
			if(!obj.image || getType(obj.dx)=='undefined' || getType(obj.dy)=='undefined'){
				throw new Error("Fehlende Parameter zum Zeichnen von Bildern");	
				zurückkehren;
			} 
			ctx.translate(obj.dx,obj.dy);
			wenn(getType(obj.sx)!='undefined' && getType(obj.sy)!='undefined' && obj.sWidth && obj.sHeight && obj.dWidth && obj.dHeight){
				//Bild zuschneiden und bei der Anzeige skalieren ctx.drawImage(obj.image, obj.sx, obj.sy, obj.sWidth, obj.sHeight, 0, 0, obj.dWidth, obj.dHeight);
			}sonst wenn(obj.dBreite && obj.dHöhe){
				ctx.drawImage(obj.image, 0, 0, obj.dWidth, obj.dHeight); //Originalbild, bei Anzeige skaliert }else{
				ctx.drawImage(obj.image,0, 0); //Originalbild, keine Skalierung bei der Anzeige }
			ctx.wiederherstellen();
		}
	}
	ImageDraw.prototype.isPoint=Funktion(pos){
		//Die x- und y-Werte der Mausposition müssen größer als dx bzw. dy sein, und x und y müssen kleiner als dx+dWidth bzw. dy+dHeight sein.
		if(pos.x>this.dx && pos.y>this.dy && pos.x<this.dx+this.dWidth && pos.y<this.dy+this.dHeight ){//Zeigt an, dass es innerhalb des Bereichs des aktuellen Bildobjekts liegt. return true;
		}
		gibt false zurück;
	}

Quadratischer Konstruktor

Funktion Rechteck(o){
		this.x=0,//x-Koordinate this.y=0,//y-Koordinate this.width=100,//Breite this.height=40,//Höhe this.thin=true,//dünnere Linie		
		dies.init(o);
	}
	
	Rect.prototype.init = Funktion (o) {
		für (var Schlüssel in o) {
			dies[Schlüssel]=o[Schlüssel];
		}
	}
	Rect.prototype.render = Funktion (Kontext) {
		dies.ctx=Kontext;
		innerRender(dies);
			
		Funktion innerRender(Objekt){
			var ctx=obj.ctx;
			ctx.speichern()
			ctx.beginPath();
			ctx.translate(Objekt.x,Objekt.y);
			
			wenn(obj.Linienbreite){
				ctx.Linienbreite=obj.Linienbreite;
			}
			wenn(Objekt.dünn){
				ctx.übersetzen(0.5,0.5);
			}
			ctx.rect(0,0,Objektbreite,Objekthöhe);
			if(obj.fill){//Ist es ausgefüllt? obj.fillStyle?(ctx.fillStyle=obj.fillStyle):null;
				ctx.fill();
			}
			if(obj.stroke){//Ob obj.strokeStyle gestrichen werden soll?(ctx.strokeStyle=obj.strokeStyle):null;
				ctx.stroke();
			}	
		 	ctx.wiederherstellen();
		}
	 	gib dies zurück;
	}

Textkonstruktor

Funktion Text(o){
		this.x=0,//x-Koordinate this.y=0,//y-Koordinate this.text='',//Inhalt this.font=null;//Schriftart this.textAlign=null;//Ausrichtung		
		dies.init(o);
	}
	
	Text.prototype.init=Funktion(o){
		für (var Schlüssel in o) {
			dies[Schlüssel]=o[Schlüssel];
		}
	}
	Text.prototype.render=Funktion(Kontext){
		dies.ctx=Kontext;
		innerRender(dies);
			
		Funktion innerRender(Objekt){
			var ctx=obj.ctx;
			ctx.speichern()
			ctx.beginPath();
			ctx.translate(Objekt.x,Objekt.y);
			
			wenn(Objekt.Schriftart){
				ctx.font=obj.font;
			}
			wenn (obj.textAlign) {
				ctx.textAlign=obj.textAlign;
			}
			if(obj.fill){//Ist es ausgefüllt? obj.fillStyle?(ctx.fillStyle=obj.fillStyle):null;
				ctx.fillText(obj.text,0,0);
			}
		 	ctx.wiederherstellen();
		}
	 	gib dies zurück;
	}

Quelldiagramm und fehlende Blöcke zeichnen

var img = neues ImageDraw({image:this.imgObj[0],dx:0, dy:0 ,dWidth:640,dHeight:360},this);
		dies.renderArr.push(img);
 
var x = _.getRandom (100, 580); // x liegt zwischen 100-580 var y = _.getRandom (0, 300); // y liegt zwischen 0-300		
		diese.validPos={x:x,y:y};
		//Zeichne den fehlenden Block var rect = new Rect({
			x:x,
			j:j,
			Breite: 60,
			Höhe: 60,
			füllen:wahr,
			Füllstil: 'grau'
		})
		dies.renderArr.push(rechteck);
		
		//Zeichne den Verifizierungsblockstreifen var rect = new Rect({
				x:0,
				y:360,
				Breite: 640,
				Höhe: 40,
				füllen:wahr,
				Füllstil: '#E8E8E8'
		})
		dies.renderArr.push(rechteck);
		
		//Text zeichnen var text = new Text({
			x:300,
			y:390,
			text:'Ziehen Sie den Schieberegler zum Überprüfen',
			Schriftart: „18px Serif“,
			Textausrichtung: 'zentriert',
			füllen:wahr,
			//Füllstil:'weiß'
		});
		dies.renderArr.push(text);

Der Seiteneffekt ist wie folgt

Zeichnen Sie Validierungsdiagramme und ziehen Sie Blöcke

Hinweis: Die Koordinaten zum Zeichnen des Verifizierungsdiagramms sind dieselben wie die Koordinaten zum Zeichnen der fehlenden Blöcke im vorherigen Schritt.

var pos = this.validPos; //Die Koordinaten des fehlenden Blocks, der im vorherigen Schritt gezeichnet wurde. Das Verifizierungsbild muss gemäß dieser Koordinate abgefangen werden. var img = new ImageDraw({image:this.imgObj[0],sx:pos.x,sy:pos.y,sWidth:60,sHeight:60,dx:0, dy:pos.y,dWidth:60,dHeight:60},this);
dies.renderArr2.push(img);
		
var img1 = neues ImageDraw({image:this.imgObj[1],dx:0, dy:360 ,dWidth:40,dHeight:40},this);
dies.renderArr2.push(img1);

Effektbild:

Canvas 2 - Ereignis hinzufügen

//Klickereignis zur Leinwand hinzufügen canvas2.addEventListener('mousedown',this.mouseDown.bind(this));
canvas2.addEventListener('mouseup',dieses.mouseUp.bind(dieses));
canvas2.addEventListener('Mausbewegung',dies.Mausbewegung.binden(dies));

Mauszeiger nach unten-Ereignis

  • Notieren Sie die X-Koordinate beim Drücken der Maus, um zu verhindern, dass die Maus schwebt.
  • Ändern Sie das Verschiebeflag in „True“, um zu verhindern, dass sich der Schieberegler bewegt, ohne dass er gezogen wird.
Slider.prototype.mouseDown=Funktion(e){
			var pos = _.getOffset(e); //Mausposition abrufen if(!this.block) return;
			if(this.block.isPoint(pos)){//Die gedrückte Position ist die Position des Schiebereglers this.move=true;//Zeigt an, dass er verschoben werden kann this.downX=pos.x;//Zeichne die Position auf, an der die Maus gedrückt wird, und bewege dich weiter }
	}

Mausbewegungsereignisse

  • Das Validierungsdiagramm und der Schieberegler bewegen sich durch Subtrahieren der anfänglichen X-Koordinate des Mausklicks.
  • Wenn es einen bestimmten Bereich überschreitet, kann es nicht mehr verschoben werden, um zu verhindern, dass es aus dem Leinwandbereich herausrutscht.
Slider.prototype.mouseMove = Funktion (e) {
		if(!this.move) return ;//Wenn die Bewegungsmarkierung falsch ist, direkt zurückkehren var pos = _.getOffset(e);
		pos.x -= this.downX; //Subtrahiere die ursprüngliche Mausklickposition if(pos.x>580){
			zurückkehren ;
		}
		this.update(pos);//verschieben }
	//Slider aktualisieren.prototype.update=function(pos){
		//Ändere die Koordinaten des Schiebereglers und des Verifizierungsdiagramms _.each(this.renderArr2,function(item){
			wenn(Artikel){
				Artikel.dx=pos.x;
			}
		});
		
		//Zeichne dies.render();
	}

Maus-Loslassen-Ereignis

  • Die Maus verschiebt die Markierung auf false;
  • Wenn Sie die Maus loslassen, bevor Sie den Verifizierungsbereich erreichen, kehren der Schieberegler und das Verifizierungsdiagramm ganz nach links zurück.
  • Wenn die Bewegung des Verifizierungsdiagramms einen bestimmten Bereich erreicht, bedeutet dies, dass die Verifizierung bestanden wurde.

Nach erfolgreicher Überprüfung wird eine Eingabeaufforderung angezeigt, die angibt, dass die Überprüfung erfolgreich war. Der relevante Inhalt muss geändert werden, z. B. das Löschen fehlender Blöcke, das Ändern des Eingabeaufforderungstextinhalts usw.

Slider.prototype.mouseUp=Funktion(e){
		dies.verschieben=false;
		var pos = _.getOffset(e);
			pos.x -= dies.downX;
		var validPos = this.validPos; //Koordinaten überprüfen if(Math.abs(pos.x-validPos.x )<=10){ //Überprüfung bestanden (der Unterschied in der X-Position kann innerhalb eines bestimmten Bereichs liegen)
			console.log('bestanden')
			dies.suc();
		}else{//Überprüfung fehlgeschlagen this.update({x:0});
		}
		dies.render();
	}
	
	Slider.prototype.suc=Funktion(){
		this.renderArr.splice(2,1);//Fehlende Blöcke löschen this.block=null;
		//Schieberegler und Verifizierungsdiagramm löschen this.renderArr2.length=0;
		//Ändern Sie die Farbe des Streifens this.renderArr[1].fillStyle='#78C430';
		
		var text = this.renderArr[2];
		//Änderung des Prompt-Inhalts text.fillStyle='white';
		text.text="Verifizierung erfolgreich";
	}

Nach dem Erfolg sieht es so aus:

Laden Sie den vollständigen Code herunter

Dies ist das Ende dieses Artikels über die JavaScript-Implementierung der Drag-Slider-Puzzle-Verifizierung (HTML5, Canvas). Weitere relevante Inhalte zur JS-Implementierung der Drag-Slider-Puzzle-Verifizierung finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • JS implementiert Drag-Slider-Verifizierung
  • JavaScript Slider Validierungsfall
  • JavaScript zum Implementieren des Slider-Verifizierungscodes
  • JavaScript zur Implementierung der Login-Schiebereglerüberprüfung
  • js Canvas realisiert Slider-Verifizierung
  • js implementiert einen Schieberegler zur Überprüfung der Anmeldung
  • Codebeispiel für die Implementierung eines Drag-Verifizierungs-Schiebereglers mit nativer JS-Kapselung
  • Implementierung von JS-Reverse-Engineering der iQiyi-Slider-Verschlüsselung

<<:  MySQL-Grundlagen-Tutorial Teil 1 MySQL5.7.18 Installations- und Verbindungs-Tutorial

>>:  So stellen Sie Gitlab mit Docker-Compose bereit

Artikel empfehlen

Detaillierte Erklärung des Hintergrund-Positionsprozentsatzprinzips

Als ich heute jemandem beim Anpassen des Codes ha...

Lösung für die nicht angezeigte IP-Adresse unter Linux

Inhaltsverzeichnis Vorwort Lösung: Schritt 1 Schr...

Zusammenfassung der verschiedenen Verwendungsmöglichkeiten von JSON.stringify

Vorwort Jeder, der schon einmal JSON verwendet ha...

Tipps zum Erstellen von Web-Tabellenrahmen

<br />Tipps zum Erstellen von Web-Tabellenra...

Detaillierte Erklärung des Responsive-Prinzips von Vue3

Inhaltsverzeichnis Überprüfung der responsiven Pr...

Lösung für das Problem des achtstündigen Unterschieds bei der MySQL-Einfügezeit

Lösen Sie das Problem des achtstündigen Zeitunter...

Über React Native, das keine Verbindung zum Simulator herstellen kann

React Native kann native iOS- und Android-Apps ba...

Einfache Anwendungsbeispiele für benutzerdefinierte MySQL-Funktionen

Dieser Artikel veranschaulicht anhand von Beispie...

Unterschiede zwischen FLOW CHART und UI FLOW

Viele Konzepte im UI-Design mögen in der Formulie...