JavaScript Richtiges Attribut aus Liste fischen

CitroenDsVier

Lt. Commander
Registriert
Dez. 2013
Beiträge
1.885
Hallo nochmal,

entschuldigung, wenn die Überschrift nicht ganz passt. Ich weiß nicht, wie man das besser zusammenfassen kann :freak:

ich habe eine Liste an links aus der selben Klasse, die über eine php-Schleife erzeugt werden. Jeder link triggert die selbe JS-Funktion, jeder Link hat aber ein anderes Ziel.
Ich möchte jetzt in js den Wert des Custom Attributes 'data-filename' von genau DEM Link erhalten, der die Funktion getriggert hat. Das Attribut haben sie nämlich alle.

Kurzes Beispiel:
HTML:
<a href="1.html" class="link" onClick="jsFunction()" data-filename="Hans.jpg" />
<a href="2.html" class="link" onClick="jsFunction()" data-filename="Marie.jpg" />
<a href="3.html" class="link" onClick="jsFunction()" data-filename="Jürgen.jpg" />
...

wie kann ich in der js Function den Wert von data-filename vom richtigen Link erhalten?

Code:
$filename = $('.link').attr('data-filename');
liefert immer den Hans. logisch.

MfG, V40
 
this ist das zauberwort ;-)
Und ich würde den clickhandler lieber außerhalb und nicht inline definieren
 
Zu langsam, aber ja du greifst mit this darauf zu ;)

Code:
<html>

<head>
  <script src="https://code.jquery.com/jquery-3.1.0.js" charset="utf-8"></script>
</head>

<body>

  <a href="#" class="link" data-filename="Hans.jpg">1</a>
  <a href="#" class="link" data-filename="Marie.jpg">2</a>
  <a href="#" class="link" data-filename="Jürgen.jpg">3</a>

  <script>
    $(".link").click(function() {
      var filename = $(this).attr("data-filename");
      alert(filename);
    });
  </script>

</body>
</html>
 
mit this (also dem: )

Code:
var filename = $(this).attr("data-filename");

ist filename trotzdem undefined. Ein Blick in die Developertools von Firefox zeigt mir aber, dass im Attribut des HTML-Tags was drinnen steht.

Wie würde man das nicht inline triggern? Habe leider wenig Ahnung von js/jquery...
 
Im Grunde hat blablub1212 schon alles gesagt.
Ich hab mir erlaubt sein Codebeispiel mal in nen jsfiddle zu werfen - da kannst du schauen, wie das aussieht:

https://jsfiddle.net/cdo3j0uf/


Wie würde man das nicht inline triggern?

$(".link").click(function(){

});

So. Im Endeffekt legst du damit diese Funktion auf alle Elemente in deinem Quellcode, die die CSS-Klasse 'link' haben.

Edit:

Wenn du es unbedingt komplett ohne jQuery machen willst könnte das so aussehen:

https://jsfiddle.net/cdo3j0uf/2/
 
Zuletzt bearbeitet:
Dann machst du was falsch. Im JSFiddle geht ja alles...

Wie hast du das denn jetzt eingebaut?
 
PHP:
foreach($files as $file) {
	if ($i > 2) { // "." und ".." 'Dateien' überspringen und mit erster 'echter' Datei anfangen
		$filetype = filetype("uploaded_files/$file");
		
		$filesize = filesize("uploaded_files/$file");
		$filesizeEinheit = "";
		if($filesize < 1000) {
			$filesizeEinheit = "Bytes";
		} else if($filesize > 999 && $filesize < 1000000) {
			$filesizeEinheit = "KB";
			$filesize = $filesize / 1000;
		} else if($filesize > 999999 && $filesize < 1000000000) {
			$filesizeEinheit = "MB";
			$filesize = $filesize / 1000;
			$filesize = $filesize / 1000;
		}				
		$filesize = round($filesize, 1);
		$filesize = str_replace('.', ',', $filesize);
		
		$change_date = date ("j.n.y H:i:s", filemtime("uploaded_files/$file"));
?>
		<div class="file-explorer-file-container<?php if($g == 1) { echo " grey"; $g = 0; } else { echo " white"; $g = 1; }?>">
			<div class="file-explorer-file filename"><?php echo $file." ".$filetype; ?></div>
			<div class="file-explorer-file filesize"><?php echo "$filesize $filesizeEinheit"; ?></div>
			<div class="file-explorer-file lastChange"><?php echo $change_date; ?></div>
			<a class="jsTrigger" data-filename="<?php echo $file; ?>"><div class="file-explorer-file delete-button" title="Diese Datei löschen"></div></a>
		</div><?php
	}
	$i++;
}


dort werden die etlichen Elemente erzeugt.

und hier ist js:

Code:
$(".jsTrigger").click(function() {
	$('#delete-confirmation-overlay').fadeIn(100);
	var filename = $(this).attr("data-filename");
	
	$('#delete-confirmation-popup-no').before('<a id="yes-a" href="content/actionphps/delete-file.php?file=' + filename + '\"><button id="delete-confirmation-popup-yes">Ja</button></a>');
	$('#yes-a').before('<p id="filename">' + filename + '</p>');
});
Ergänzung ()

das ist ja mal kacke formatiert... :rolleyes:
 
Zuletzt bearbeitet:
Hmmm, Gefühlt 100 Jahre kein php mehr gemacht :rolleyes:.
Steht denn im 'fertigen' Html code im data-filename Attribut überhaupt das drin?


Oder noch besser: hast du überhaupt jQuery eingebunden?^^
Code:
<head>
  <script src="https://code.jquery.com/jquery-3.1.0.js" charset="utf-8"></script>
</head>
 
Zuletzt bearbeitet:
Ja, jQuery habe ich auch eingebunden. Aber nicht deine Version, sondern "1.11.3.min"... hat das was zu sagen?
Ergänzung ()

Nein $file ist nicht leer, das Attribut im "fertigen" html ist ja gefüllt. Ich glaube das Ganze wird nur verkompliziert, je mehr Code ich hochlade. :D
Ergänzung ()

Ich glaube ja, dass in "this" nicht das richtige Element steckt... Nur reichen meine js-Kenntnisse nicht aus, um das zu überprüfen.
 
Nungut.

1) Du benutzt ne ältere jQuery Version - sollte in dem Fall aber kein Problem machen.

2) Die Click Funktion wird ausgeführt - korrekt?
Nen alert("Hallo") am Anfang der Funktion wird ausgegeben, sobald du auf einen Link klickst?

3) Nen alert($(this).attr("data-filename")); gibt undefined aus?

4) Nen alert($(this).attr("class")); gibt jsTrigger aus?
 
Im Zweifel kannst du auch einfach mal ein console.log(this) in deine Funktion schreiben und dann schauen, was in deinem this drinsteht.
 
Ich hab noch ein wenig rumprobiert, jetzt läufts. Ich kann leider nicht sagen, worans lag. Habe zu viele Sachen gleichzeitig ausprobiert :freak: :rolleyes:

Vielen Dank Euch! Ohne Euch hätt ich das nicht geschafft.. ;)
 
Zurück
Oben