JavaScript [JQuery] Textarea triggern

da_freak

Well-known member
ID: 233028
L
22 Juni 2006
736
56
Hallo,

ich benutze JQuery um ein Formular live auf Eingabefehler zu überprüfen. Das mache ich bei jedem Keyup des entsprechenden Feldes. Das funktioniert auch soweit:

Code:
function checkForms(){
$(document).ready(function(){	
	$("[class*=emptyField]")
		.bind('click',function(){
			var target = this.id.replace('for','');
			var val = $("#"+target)
				.val('');
			$("textarea,input").trigger('keyup');
		})
			.end();
	//counts the checkable elements on the page and initializes the variables
	showButton = new Object();
	//showButton[0] = new Object();	
	$(".notEmpty, .check, .email, .url, .integer")
		.each(function(i,e){
				if(this.id!=""){
					showButton[this.id] = false;
					count++;
				}

			
		}).end();
	$(".notEmpty, .check, .email, .url, .integer")
	.bind('keyup',function(){
		if(this.id!=""){			
			document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"green\">Okay!</font>';
			showButton[this.id]=true;
			//alert(this.id+" has "+showButton[this.id]);	
		}			
	});  
	//this part displays the rest of available characters
	$("textarea,input")
		.filter("[class*='countbox']")
			.bind('keyup',function(){
				var rest = this.getAttribute('max') - $(this).val().length;
				if(rest<=-1){
					alert("Die maximale Zeichenanzahl ist erreicht!");
					$(this).val($(this).val().substr(0,$(this).val().length+rest));
					rest += math.abs(rest)+1;
					$("textarea,input").trigger('keyup');
				}
				document.getElementById('chars'+this.id).innerHTML=rest+' Zeichen verbleiben. ';				
			})
				.end();	
	//this part checks the userinput for length and illegal input
  	$("textarea,input")  	
  	 	.filter("[class*='notEmpty']")
	  	 	.bind('keyup',function(){	  
	  	 		if($(this).val()==""){
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Feld darf nicht leer sein!</font>';
	  				showButton[this.id]=false;
	  			} 	  	 			
	  			var flag=true;
	  			for (var i in showButton){	
	  			    if(showButton[i]==false){
	  					flag=false;
	  					break;	  			    	
	  			    }	  			    
	  			}
	  			if(flag){
	  				$('.send').css({"visibility":"visible"});
	  				document.form.onsubmit = function(e) {	  				 
	  				};
	  			}
	  			if(!flag){
	  				$('.send').css({"visibility":"hidden"});
	  				document.form.onsubmit = function(e) {
	  					return false;
	  				};
	  			}
	  	 	})
	 			.end()
  		.filter("[class*='check']")
  			.bind('keyup',function(){ 	
	  			if((this.getAttribute('min')) && (this.getAttribute('min')!=0) && (this.getAttribute('min')>$(this).val().length)){
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Das Feld muss mindestens '+this.getAttribute('min')+' Zeichen enthalten!</font>';
	  				showButton[this.id]=false;
	  			}
	  			else if((this.getAttribute('max')) && (this.getAttribute('max')!=0) && (this.getAttribute('max')<$(this).val().length)){
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Das Feld darf höchstens '+this.getAttribute('max')+' Zeichen enthalten!</font>';
	  				showButton[this.id]=false;
	  			}	
	  			else if(((this.getAttribute('minvalue')) || (this.getAttribute('maxvalue'))) && (!isNumber(new Number($(this).val())))){
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Das Feld muss eine Zahl enthalten!</font>';
	  				showButton[this.id]=false;
	  			}	  	
	  			else if((this.getAttribute('minvalue')) && (new Number($(this).val())<new Number(this.getAttribute('minvalue')))){
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Der Wert darf nicht kleiner als '+this.getAttribute('minvalue')+' sein</font>';
	  				showButton[this.id]=false;
	  			}
	  			else if((this.getAttribute('maxvalue')) && (new Number($(this).val())>new Number(this.getAttribute('maxvalue')))){	  			
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Der Wert darf nicht größer als '+this.getAttribute('maxvalue')+' sein</font>';
	  				showButton[this.id]=false;
	  			}		  			
	  			else if(($(this).val()!="") && ($(this).val().trim()=="")){
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Feld darf nicht nur mit Leerzeichen gefüllt sein!</font>';
	  				showButton[this.id]=false;
	  			}
	  			else if(($(this).val()!="") && ($(this).val().trimbreaks()=="")){
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Feld darf nicht nur mit Zeilenumbrüchen gefüllt sein!</font>';
	  				showButton[this.id]=false;
	  			}	
	  			var flag=true;
	  			for (var i in showButton){	
	  			    if(showButton[i]==false){
	  					flag=false;
	  					break;	  			    	
	  			    }	  			    
	  			}
	  			if(flag){
	  				$('.send').css({"visibility":"visible"});
	  				document.form.onsubmit = function(e) {	  				 
	  				};
	  			}
	  			if(!flag){
	  				$('.send').css({"visibility":"hidden"});
	  				document.form.onsubmit = function(e) {
	  					return false;
	  				};
	  			}
  			})
  				.end()
  		  	.filter("[class*='email']")
  	  			.bind('keyup',function(){
  	  				var s = $(this).val().trim();
		  	  		var a = false;
		  	  		var res = false;
		  	  		if(typeof(RegExp) == 'function'){
		  	  			var b = new RegExp('abc');
		  	  			if(b.test('abc') == true)a = true;
		  	  		}		
		  	  		if(a == true){
		  	  		  reg = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)'+
		  	  		                   '(\\@)([a-zA-Z0-9\\-\\.]+)'+
		  	  		                   '(\\.)([a-zA-Z]{2,4})$');
		  	  		  res = (reg.test(s));
		  	  		}
		  	  			else{
		  	  				res = (s.search('@') >= 1 &&
		  	  		        s.lastIndexOf('.') > s.search('@') &&
		  	  		        s.lastIndexOf('.') >= s.length-5)
		  	  			}
		  	  		if(!res){
		  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Feld muss eine gültige emailadresse enthalten!</font>';
		  				showButton[this.id]=false;		  	  		
		  	  		}
		  			var flag=true;
		  			for (var i in showButton){	
		  			    if(showButton[i]==false){
		  					flag=false;
		  					break;	  			    	
		  			    }	  			    
		  			}
		  			if(flag){
		  				$('.send').css({"visibility":"visible"});
		  				document.form.onsubmit = function(e) {	  				 
		  				};
		  			}
		  			if(!flag){
		  				$('.send').css({"visibility":"hidden"});
		  				document.form.onsubmit = function(e) {
		  					return false;
		  				};
		  			}		  	  		
  	  			})
  	  				.end()
  		  	.filter("[class*='url']")
  	  			.bind('keyup',function(){
  	  				var s = $(this).val().trim();
		  	  		var a = false;
		  	  		var res = false;
		  	  		if(typeof(RegExp) == 'function'){
		  	  			var b = new RegExp('abc');
		  	  			if(b.test('abc') == true)a = true;
		  	  		}		
		  	  		if(a == true){
		  	  		  reg = new RegExp('^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$');
		  	  		  res = (reg.test(s));
		  	  		}
	
		  	  		if(!res){
		  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Feld muss eine gültige URL enthalten!</font>';
		  				showButton[this.id]=false;		  	  		
		  	  		}
		  			var flag=true;
		  			for (var i in showButton){	
		  			    if(showButton[i]==false){
		  					flag=false;
		  					break;	  			    	
		  			    }	  			    
		  			}
		  			if(flag){
		  				$('.send').css({"visibility":"visible"});
		  				document.form.onsubmit = function(e) {	  				 
		  				};
		  			}
		  			if(!flag){
		  				$('.send').css({"visibility":"hidden"});
		  				document.form.onsubmit = function(e) {
		  					return false;
		  				};
		  			}		  	  		
  	  			})
  	  				.end()
  		  	.filter("[class*='integer']")
  	  			.bind('keyup',function(){
		  	  		if(!isInteger(new Number($(this).val()))){
		  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Feld muss eine Ganzzahl enthalten!</font>';
		  				showButton[this.id]=false;		  	  		
		  	  		}  	  	
		  			var flag=true;
		  			for (var i in showButton){	
		  			    if(showButton[i]==false){
		  					flag=false;
		  					break;	  			    	
		  			    }	  			    
		  			}
		  			if(flag){
		  				$('.send').css({"visibility":"visible"});
		  				document.form.onsubmit = function(e) {	  				 
		  				};
		  			}
		  			if(!flag){
		  				$('.send').css({"visibility":"hidden"});
		  				document.form.onsubmit = function(e) {
		  					return false;
		  				};
		  			}		  	  		
  	  			})
  	  				.end()
  	  		.trigger('keyup').end();
});

}

Wenn ich jetzt ein Formular mit vorbelegten Werten habe, z.B. wenn ich eine Nachricht bearbeiten will, muss ja eine Prüfung des Formulars stattfinden, weil bei einer Fehlerhaften Eingabe u.A. auch der Absenden-Button versteckt wird. Deswegen steht da auch ganz am Schluss das .trigger('keyup').end();

Jetzt kommt das Problem. Bei Input-Elementen springt das Triggern auch an, nur nicht bei Textareas. Das ist allerdings doof, wenn in einer Textarea nichts zu ändern ist. Bis jetzt müsste ich dann in das Textarea klicken und irgendeine Taste drücken. Aber das muss doch auch irgendwie im Script zu lösen sein? Den Trigger habe ich übrigens schon an verschiedensten Stellen angebracht, alles mit dem gleichen Erfolg.

Ich bin mal gespannt ob euch was einfällt un bedanke mich schon mal im Vorraus für die Hilfe
 
Ich mach mal n Versuch: Gehts denn, wenn du
PHP:
$(document).ready(function() {
    $('textarea').keyup();
});
machst?

Hab noch nie trigger() verwendet, drum kanns sein, dass dieser Post hier einfach nur zum Ignorieren da is :biggrin:
 
Ooooooh je. Das ist mir schon fast peinlich. Problem gelöst! Es lag daran, dass der Name des Formulars nicht gestimmt hat.
In Zeile 62 hat das dann einen Fehler verursacht und die Scriptaussführung wurde abgebrochen.
Code:
	  			if(flag){
	  				$('.send').css({"visibility":"visible"});
	  				document.form.onsubmit = function(e) //Hier entstand der Fehler{	  				 
	  				};
	  			}
	  			if(!flag){
	  				$('.send').css({"visibility":"hidden"});
	  				document.form.onsubmit = function(e) {
	  					return false;
	  				};
	  			}

Warum das Ganze dann funktionierte, wenn man in die Texarea klickt und eine Eingabe tätigt, keine Ahnung.

Ich habe das jetzt so umgebaut dass es allgemein funktioniert.
$(this+':parent').onsubmit ...


Bei der Fehlersuche habe ich das Script durch JSLint gejagt, und der beschwerte sich an mehreren Stellen, z.B. hier:

Code:
	  			else if((this.getAttribute('maxvalue')) && (new Number($(this).val())>new Number(this.getAttribute('maxvalue')))){	  			
	  				document.getElementById('checkMsg'+this.id).innerHTML = '<font color=\"red\">Der Wert darf nicht größer als '+this.getAttribute('maxvalue')+' sein</font>';
	  				showButton[this.id]=false;
	  			}
mit der Fehlermeldung "Do not use Number as constructor". Das Problem ist allerdings, wenn ich das nicht mache und die Werte einfach so vergleiche, bekomme ich Unsinnige Vergleichsergebnisse. Beispiel:

this.getAttribute('maxvalue') wertet zu 20 aus; $(this).val() zu 4.
Der Vergleich $(this).val()>this.getAttribute('maxvalue'), also 4>20 wertet dann zu true aus? Hä? im Fall 21>20 habe ich ebenfalls true, geht ja auch in Ordnung. Und der einzige false-Fall tritt ein, wenn die Zahlen gleich groß sind. Gibt es dafür noch eine andere Lösung, als das vom Validator beanstandete new Numer(...) ?
 
nur Number(val) (alternativ noch parseInt, je nach Anforderung), kein new.

Mit new erzeugst du ein Objekt und hast keinen "primitiven" (das is in JS sowieso etwas komplizierter) Datentypen mehr.

Deine Vergleischprobleme ohne Number rühren daher, dass JS das zweite "Argument" in einen String konvertiert und dann einen lexikalischen Vergleich macht.