JavaScript - Work button, only first object

Salut, in .blade (Laravel) am un foreach cu niste produse, si un button ce apeleaza o functie JS. Totul functioneaza ok, doar ca acel buton functioneaza doar pentru primul obiect din array, pentru restul devine inexistent, nu mai apeleaza functia. Am pus un “console.log”, daca apas pe primul produs se afiseaza, daca apas pe al2-lea, nu mai merge.
Merci anticipat.

@extends('layouts.master')
@section('breadcrumb','Admin')
@section('content')
	@foreach($inano as $i)
		<div class="col-md-3 _2q{{ $i->ID }}">
		    <div class="ibox">
		        <div class="ibox-content product-box" style="margin-left:4px; background-color:#2121218f;">
		            <div class="product-desc">
		                ID Produs: <b>{{ $i->ID }}</b>
	        			</br>
	        			<button class="btn btn-xs btn-outline btn-primary" id="btnAlert" 
	    					tit="<center>{{ $i->Text }}</center>" sid="{{ $i->ID }}">
	        				<i class="fa fa-eye" style="color:green;"></i> vezi descriere produs
	        			</button>
		            </div>
	        	</div>
	    	</div>
		</div>
	@endforeach
@endsection

@section('js')
	<script type="text/javascript">
		function ezBSAlert(e){var a=$.Deferred(),s={type:"alert",modalSize:"modal-sm",okButtonText:"Set",cancelButtonText:"Cancel",yesButtonText:"Yes",noButtonText:"No",headerText:"Attention",messageText:"Message",alertType:"default",placeHold:"", inputFieldType:"text"};$.extend(s,e);return function(){var e="navbar-default";switch(s.alertType){case"primary":e="alert-primary";break;case"success":e="alert-success";break;case"info":e="alert-info";break;case"warning":e="alert-warning";break;case"danger":e="alert-danger"}$("BODY").append('<div id="ezAlerts" class="modal fade"><div class="modal-dialog" class="'+s.modalSize+'"><div class="modal-content"><div id="ezAlerts-header" class="modal-header '+e+'"><button id="close-button" type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button><h4 id="ezAlerts-title" class="modal-title">Modal title</h4></div><div id="ezAlerts-body" class="modal-body"><div id="ezAlerts-message" ></div></div><div id="ezAlerts-footer" class="modal-footer"></div></div></div></div>'),$(".modal-header").css({padding:"15px 15px","-webkit-border-top-left-radius":"5px","-webkit-border-top-right-radius":"5px","-moz-border-radius-topleft":"5px","-moz-border-radius-topright":"5px","border-top-left-radius":"5px","border-top-right-radius":"5px"}),$("#ezAlerts-title").text(s.headerText),$("#ezAlerts-message").html(s.messageText);var t="";switch(s.type){case"confirm":var o='<button id="ezok-btn" class="btn btn-primary">'+s.yesButtonText+"</button>";s.noButtonText&&0<s.noButtonText.length&&(o+='<button id="ezclose-btn" class="btn btn-default">'+s.noButtonText+"</button>"),$("#ezAlerts-footer").html(o).on("click","button",function(e){"ezok-btn"===e.target.id?(t=!0,$("#ezAlerts").modal("hide")):"ezclose-btn"===e.target.id&&(t=!1,$("#ezAlerts").modal("hide"))});break;case"prompt":$("#ezAlerts-message").html(s.messageText+'<br /><br /><div class="form-group"><input placeholder="'+s.placeHold+'" type="'+s.inputFieldType+'" class="form-control" id="prompt" /></div>'),$("#ezAlerts-footer").html('<button class="btn btn-primary">'+s.okButtonText+"</button>").on("click",".btn",function(){t=$("#prompt").val(),$("#ezAlerts").modal("hide")})}$("#ezAlerts").modal({show:!1,backdrop:"static",keyboard:"false"}).on("hidden.bs.modal",function(e){$("#ezAlerts").remove(),a.resolve(t)}).on("shown.bs.modal",function(e){0<$("#prompt").length&&$("#prompt").focus()}).modal("show")}(),a.promise()}
		$(document).ready(function()
		{
			$("#btnAlert").on("click", function()
			{
				console.log(1);
			    var prom = ezBSAlert({
			      messageText: $(this).attr('tit').replace(/(?:\r\n|\r|\n)/g, '<br>'),
			      headerText: "PRODUS - TEXT",
			      alertType: "warning"
			    });
		  	});   
		});
	</script>
@endsection

In html toate idurile trebuie sa fie unice. Tu ai id “btnAlert” pe mai multe butoane si normal ca ti-l ia doar pe primul ca nu stie la care te referi.

Pune btnAlert ca clasa si schimba in js din $("#btnAlert") in $(".btnAlert")

1 Like

Ca reguli pentru viitor:

  1. Nu folosi ID-uri în JS decât dacă ai un motiv f.f.f. bun (de cele mai multe ori nu ai);
  2. Folosește o clasă specială pentru js. În loc de btnAlert, folosește js-trigger-alert, js-open-alert sau ceva pe ideea asta. În felul ăsta poți muta rapid event-urile în pagină fără să fii blocat pe un anumit stil.
3 Likes

am si eu o intrebare :smiley: de ce sa nu folosim ID uri in js?

@iamntz nu zice să nu foloseşti id-urile deloc, ci doar când ai un motiv întemeiat (de exemplu când ai nevoie să accesezi cu precizie un element din DOM). Pe de alta parte, nici folosirea claselor nu pare foarte corectă, pentru că nu corespunde din punct de vedere semantic (clasele ar trebui folosite doar pentru stiluri). A mai ramas o variantă, utilizarea atributului “data”, care mi se pare cea mai potrivită pentru accesarea elementelor cu javascript.

2 Likes

ID-urile sunt de evitat și în CSS, nu doar JS.

  • în JS sunt de evitat că te leagă de un anumit element, foarte specific și, așa cum a aflat și @Ekors, nu poți reutiliza event-uri;
  • în CSS sunt de evitat din cauza specificității.

Așa cum a menționat @serghei mai sus, nu zic să nu folosești, ci doar să te întrebi dacă chiar ai nevoie de așa ceva. Dacă vrei, folosirea unui ID este echivalent cu folosirea unui singleton: e de evitat, dar uneori e potrivit :slight_smile:


Cât despre semantică:

When specified on HTML elements, the class attribute must have a value that is a set of space-separated tokens representing the various classes that the element belongs to.

There are no additional restrictions on the tokens authors can use in the class attribute, but authors are encouraged to use values that describe the nature of the content, rather than values that describe the desired presentation of the content.

De aici.

Nu zice nimic de stilizare, ci de clasificare; mi se pare că sunt potrivite (și) pentru js :slight_smile:

Eu folosesc data-* când am de trimis „parametri” sau când trebuie să grupezi cumva lucrurile. De exemplu:

<button data-action="delete">...
<button data-action="edit">...
<button data-action="select">...

Sau:

<button data-confirm-delete="Are you sure?">...
3 Likes