On change nefunctional in modal

Salut, am nevoie de ajutor am cautat in tot internetul o solutie la problema mea si nu am gasit.
Am acest modal si acest input, vreau sa incarc poze imediat ce le-am selectat, fara sa dau submit ca mai am un form

<div class="container mt-5">
<!-- Button trigger modal -->
<button type="button" class="btn btn-outline-success btn-lg float-right" data-toggle="modal" data-target="#exampleModal">
Open Modal
</button>
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
   <div class="modal-dialog">
      <div class="modal-content">
         <div class="modal-header">
            <h4 class="modal-title" id="exampleModalLabel">Upload</h4>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
            </button>
         </div>
         <div class="modal-body">
            <form action"save.php">
               <div class="form-group">
                  <label>uname</label>
                  <input type="text" class="form-control" placeholder="Avatar">
						<form id="submitForm">
							<div class="form-group">
								<div class="custom-file mb-3">
									<input type="file" class="custom-file-input" name="files[]" multiple id="image" >
								</div>
							</div>
						</form>    
						<input type="text" class="form-control" placeholder="Name">						
            </form>
            </div>
            <div class="modal-footer">
               <button type="submit" class="btn btn-success">Upload</button>
               <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
            </div>
         </div>
      </div>
   </div>
</div>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/js/bootstrap.min.js"></script>  
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script>
   $("#submitForm").on("change", function(){
   	$.ajax({
   		type: 'POST',
   		url  : "uploads.php",
   		data: new FormData(this),
   		contentType: false,
   		cache: false,
   		processData:false,
   		dataType:'json',
   		success:function(response){
   			console.log(response['message']);
         console.log('ok');
   		},
     error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("some error");
     }
   	});
   	
   });	
</script>

Imaginile se incarca daca pun acest form

<form id="submitForm">
   <div class="form-group">
      <div class="custom-file mb-3">
         <input type="file" class="custom-file-input" name="files[]" multiple id="image" >
      </div>
   </div>
</form>

in afara modal-ului, daca pun in modal, nu functioneaza si nu inteleg de ce

Poate daca pui un codepen, sau ceva asemanator, sa putem testa usor, ne-am putea da seama de problema mai repede.

In mod ideal, faci bind la evenimentul de change, dupa ce e rendered / displayed modalul.

Conform specificațiilor HTML, nu este permis să ai “nested form”.
Mozilla developer documentation afișează un mare Warning în acest sens.

Specificațiile publicate de WhatWG prezintă la subpunctul 4.10.17.3 Association of controls and forms (vezi pagina din link) posibilitatea oferită și suportată de asociere dintre controale și formulare (form). Mai mult chiar, este evidențiată o NOTĂ care specifică clar că utilizarea atributului “form” al unui control poate fi folosită ca “work around” la lipsa de suport pentru “nested form”.

În esență, fiind o facilitate care nu este cuprinsă în standard, în specificații, fiecare browser implementează în mod distinct modul de tratare a acestei erori în momentul în care o întâlnește, de aici derivând comportamentul impredictibil menționat în avertizare.

VV

1 Like

Note, un “change” event nu se pune direct pe un form. As per the docs:

Ce vrei tu se rezolvă printr-un ajax file uploader (bonus points: poți avea și drag&drop la fișiere și progress bar la upload).

Pentru că practic vei avea două acțiuni distincte (fișierele urcate și formularul propriu zis), trebuie să iei în calcul niște chestii extra:

  • să „legi” fișierele urcate de formularul trimis
  • să cureți (periodic) fișierele urcate fără ca formularul să fi fost trimis
  • formularul nu poate fi trimis până când nu s-au urcat toate fișierele
2 Likes