2017-08-19 1 views
0

J'essaie de créer un site Web avec un bouton d'ajout qui permet au client de dupliquer le formulaire. Tout en faisant cela, je perds la fonctionnalité d'option cacher/montrer qui existe en raison de la duplication. (ifYes et ifNo divs, il faut montrer en fonction de la sélection du client)Fournir du contenu pour un div avec un nom d'identification différent

Mon problème réside dans la variable 'Valu' dans mon JavaScript ou je suppose.

Voici un extrait de mon code:

HTML:

<select id="ValuType" name="ValuType" onchange="priceAndCheck()"> 
    <option disabled="disabled" selected="selected">Type of Property</option> 
    <option id="Apartment" value="Apartment">Apartment</option> 
    <option id="Building" value="Building">Building</option> 
    <option id="Farm" value="Farm">Farm</option> 
    <option id="House" value="House">House</option> 
    <option id="Land" value="Land">Land</option> 
</select> 


<div id="ifYes" class="ifYes"> 
...ifYes content comes here... 
</div> 

<div id="ifNo" class="ifNo"> 
...ifNo content comes here... 
</div> 

JavaScript:

function yesnoCheck() { 

    var Valu = document.getElementById("ValuType").value; 

    if (Valu == 'Apartment' || Valu == 'Farm' || Valu == 'Land') { 
     document.getElementById('ifYes').style.height = '250px'; 
     document.getElementById('ifYes').style.display = 'block'; 
     document.getElementById('ifYes').style.transition = 'all 1s ease 0.59s'; 
     document.getElementById('ifNo').style.height = '0px'; 
     document.getElementById('ifNo').style.overflow = 'hidden'; 
     document.getElementById('ifNo').style.transition = '0.55s'; 
    } 
    else if (Valu == 'Building' || Valu == 'House') { 
     document.getElementById('ifNo').style.height = '250px'; 
     document.getElementById('ifNo').style.display = 'block'; 
     document.getElementById('ifNo').style.transition = 'all 1s ease 0.59s'; 
     document.getElementById('ifYes').style.height = '0px'; 
     document.getElementById('ifYes').style.overflow = 'hidden'; 
     document.getElementById('ifYes').style.transition = '0.55s'; 
    } 
    else { 
     document.getElementById('ifYes').style.overflow = 'hidden'; 
     document.getElementById('ifNo').style.overflow = 'hidden'; 
    } 
} 



function providePrice() { 

var a = document.getElementById("Region").value; 
var b = document.getElementById("ValuReq").value; 
var c = document.getElementById("ValuType").value; 
var d = document.getElementById("Express").value; 
var e = 25; 




if (a=="Region1" && b=="Bank" && c=="Apartment" && d=="Yes") 
{ 
    var x = 200 + e; 
    document.getElementById("price").innerHTML = "Price: OMR " + x; 

} 

else if (a=="Region1" && b=="Bank" && c=="Apartment" && d=="No") 
{ 
    var x = 200; 
    document.getElementById("price").innerHTML = "Price: OMR " + x; 
} 

else if (a=="Region1" && b=="Bank" && c=="Building" && d=="Yes") 
{ 
    var x = 350 + e; 
    document.getElementById("price").innerHTML = "Price: OMR " + x; 
} 
... 
... 
... 
else 
{ 
    document.getElementById("price").innerHTML = "Price:" 
} 


    function getValue() { 
if (document.getElementById("Express").checked) { 
    document.getElementById("Express").value = "Yes"; 
} else { 
    document.getElementById("Express").value = "No"; 
} 
} 


function priceAndCheck(){ 
    yesnoCheck(); 
    providePrice(); 
} 

Code Explication:
Chaque fois qu'un client remplit le formulaire et et sélectionne certaines options, il devrait permettre le div ifYes ou ifNo pour apparaître et prix à remplir. (Prix connecté à plus d'un champ,) Je le fais en utilisant les noms div et cela fonctionne parfaitement. Cependant, lors du clonage de la forme, je ne suis pas en mesure de générer les divs ifYes et ifNo pour toutes les nouvelles formes clonées.

Là où je crois que les problèmes se situent dans sont dans les domaines suivants:

  • mes div denominations sont constants (exactement le même dans toutes les formes clonés), qui est l'un des problèmes
  • appel priceAndCheck() fonction qui appelle deux fonctions yesnoCheck() et providePrice() qui me donne besoin de changer toutes les fonctions si je commence à appeler un élément (par exemple function test(selectElement) - Essayé [la solution de Sam Apostel] [1] et n'a pas pu voir les options avec tout mon codage disponible
  • Le div qui est cloné a un nom différent id mais tous les autres divs au sein de la même nommant

vous serais reconnaissant de l'aide sur ce qui est la meilleure façon de traiter cette question.

+0

où et quand vous appelez 'fonction yesnoCheck()'? –

+0

@irshadjm Désolé, j'ai oublié que j'appelle deux fonctions quand je change l'option. onchange = "priceAndCheck()" a la fonction yesnoCheck() dedans. –

+1

vous rencontrez des problèmes car une fois que votre formulaire est dupliqué, vous perdrez la fonctionnalité d'obtention d'objet en utilisant id comme maintenant vous avez plusieurs éléments avec le même id, ce qui n'est pas autorisé, dans ce cas vous obtiendrez toujours la référence du dernier élément essayer d'y accéder par ID, je vous suggère de mettre à jour votre logique pour obtenir un élément par classe. –

Répondre

0

Après plusieurs testings et les modifications de code, je suis venu avec la solution ci-dessous pour ma requête où J'utilise le nom de la classe pour chaque formulaire cloné, les options deviennent visibles, si nécessaire.

function yesnoCheck() { 
 
\t \t 
 
\t \t var Valu =''; 
 
\t \t var count = 0; 
 
\t 
 
\t \t $('.ValuType').each(function() { 
 
\t \t \t 
 
\t \t \t Valu = $(this).attr('id'); 
 
\t \t \t Valu = document.getElementById(Valu).value; 
 
\t \t \t 
 
\t \t \t 
 

 
\t \t  if (Valu == 'Apartment' || Valu == 'Farm' || Valu == 'Land') { 
 
\t \t \t \t document.getElementsByClassName('Yes')[count].style.height = '30px'; 
 
\t \t   document.getElementsByClassName('Yes')[count].style.display = 'block'; 
 
\t \t \t \t document.getElementsByClassName('Yes')[count].style.transition = 'all 1s ease 0.59s'; 
 
\t \t \t \t document.getElementsByClassName('No')[count].style.height = '0px'; 
 
\t \t \t \t document.getElementsByClassName('No')[count].style.overflow = 'hidden'; 
 
\t \t \t \t document.getElementsByClassName('No')[count].style.transition = '0.55s'; 
 
\t \t  } 
 
\t \t \t else if (Valu == 'Building' || Valu == 'House') { 
 
\t \t \t \t document.getElementsByClassName('No')[count].style.height = '30px'; 
 
\t \t \t \t document.getElementsByClassName('No')[count].style.display = 'block'; 
 
\t \t \t \t document.getElementsByClassName('No')[count].style.transition = 'all 1s ease 0.59s'; 
 
\t \t \t \t document.getElementsByClassName('Yes')[count].style.height = '0px'; 
 
\t \t \t \t document.getElementsByClassName('Yes')[count].style.overflow = 'hidden'; 
 
\t \t \t \t document.getElementsByClassName('Yes')[count].style.transition = '0.55s'; 
 
\t \t \t } 
 
\t \t  else { 
 
\t \t \t \t document.getElementsByClassName('Yes')[count].style.overflow = 'hidden'; 
 
\t \t \t \t document.getElementsByClassName('No')[count].style.overflow = 'hidden'; 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t 
 
\t \t \t count++; 
 
\t \t }); 
 

 
\t } 
 
    
 
    
 
    
 
    //define template 
 
var template = $('#content:first').clone(); 
 

 

 
//define counter 
 
var count = 0; 
 

 
//add new section 
 
$('body').on('click', '#repeat', function() { 
 

 
\t var clone = template.clone(); 
 
    //increment 
 
    count++; 
 
\t 
 
\t //remove cross button div 
 
\t clone.find('cross').removeAttr("#cross"); 
 
\t 
 
\t //update id of ifYes & ifNo 
 
\t clone.find('.Yes').prop('id', 'ifYes' + count); 
 
\t clone.find('.No').prop('id', 'ifNo' + count); 
 
\t 
 
    //loop through each input 
 
    var inputSection = clone.find(':input').each(function(){ 
 

 
     //set id to store the updated section number 
 
     var newId = this.id + count; 
 

 
     //update id 
 
     this.id = newId; 
 

 
    }).end() 
 
\t 
 
    //inject new section with animation 
 
    .appendTo('#content').hide() 
 
\t .appendTo('#content').slideDown(500) 
 
    return false; 
 
}); 
 

 
//remove section 
 
$('#content').on('click', '.cross', function() { 
 
    //slide up section 
 
    $(this).parent().slideUp(500, function(){ 
 
     //remove parent element (main section) 
 
     $(this).parent().child().empty(); 
 
     return false; 
 
    }); 
 
    return false; 
 
});
.Yes{ 
 
    overflow: hidden; 
 
    height: 0; 
 
    -webkit-transition: all 1.5s ease; 
 
    -moz-transition: all 1.5s ease; 
 
    -ms-transition: all 1.5s ease; 
 
    -o-transition: all 1.5s ease; 
 
    transition: all 1.5s ease; 
 
} 
 

 

 
.No{ 
 
    overflow: hidden; 
 
    height: 0; 
 
    -webkit-transition: all 1.5s ease; 
 
    -moz-transition: all 1.5s ease; 
 
    -ms-transition: all 1.5s ease; 
 
    -o-transition: all 1.5s ease; 
 
    transition: all 1.5s ease; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="content"> 
 
    <button type="button" id="cross" class="buttonImgTop cross">remove</button> 
 
    <div id="ValuWrapper"> 
 
    
 
    <select id="ValuType" name="ValuType" class="ValuType" onchange="yesnoCheck()"> 
 
\t <option disabled="disabled" selected="selected">Type of Property</option> 
 
\t <option id="Apartment" value="Apartment">Apartment</option> 
 
\t <option id="Building" value="Building">Building</option> 
 
\t <option id="Farm" value="Farm">Farm</option> 
 
\t <option id="House" value="House">House</option> 
 
\t <option id="Land" value="Land">Land</option> 
 
    </select> 
 
        
 
     <div id="ifYes" class="Yes"> 'Yes' class text comes here </div> 
 
     <div id="ifNo" class="No"> 'No' class text comes here </div> 
 
    </div> 
 
</div> 
 

 
<button type="button" class="buttonImg" id="repeat">repeat</button>

0

Je pense que cela résoudra votre question (à l'aide this dans la balise onchange="")

$ = function(id) { 
 
    return document.getElementById(id).style; 
 
} 
 
function priceAndCheck(selectElement){ 
 

 
yesnoCheck(selectElement); 
 
} 
 
function yesnoCheck(selectElement) { 
 
    var show; 
 
    var hide; 
 
    var Valu = selectElement.value; 
 
    if (Valu == 'Apartment' || Valu == 'Farm' || Valu == 'Land') { 
 
    show = $('ifYes'); 
 
    hide = $('ifNo'); 
 
    } else if (Valu == 'Building' || Valu == 'House') { 
 
    show = $('ifNo'); 
 
    hide = $('ifYes'); 
 
    } 
 
    show.height = '250px'; 
 
    show.display = 'block'; 
 
    show.transition = 'all 1s ease 0.59s'; 
 
    hide.height = '0px'; 
 
    hide.overflow = 'hidden'; 
 
    hide.transition = '0.55s'; 
 
}
<select id="form1" name="ValuType" onchange="priceAndCheck(this)"> 
 
    <option disabled="disabled" selected="selected">Type of Property</option> 
 
    <option id="Apartment" value="Apartment">Apartment</option> 
 
    <option id="Building" value="Building">Building</option> 
 
    <option id="Farm" value="Farm">Farm</option> 
 
    <option id="House" value="House">House</option> 
 
    <option id="Land" value="Land">Land</option> 
 
</select> 
 

 

 
<div id="ifYes" class="ifYes"> 
 
    ...if Yes content comes here... 
 
</div> 
 

 
<div id="ifNo" class="ifNo"> 
 
    ...if No content comes here... 
 
</div>

+0

Impossible de le faire fonctionner avec mon code car j'ai 2 fonctions qui tournent en même temps lorsque l'option est changée. Est-ce que je ne peux pas simplement ajouter le 'this.id' dans la fonction que j'appelle? Comme dans: priceAndCheck() { yesnoCheck (this.id); function2(); } –

+0

J'ai changé ma réponse pour accommoder une fonction imbriquée et changé 'this.id' en' this' de sorte que vous ne devez pas regarder dans le DOM pour trouver le 0ellement –

+0

Ne fonctionne toujours pas. Il semble que si j'appelle deux fonctions, je ne peux pas utiliser cette méthode à moins de changer ma deuxième fonction, ou du moins je suppose. –