2015-05-02 2 views
8

Zawartość zmienia się w zależności od wybranej opcji .Konwersja kodu z wielu elementów div w celu użycia Ajax zamiast

Zamiast zestawu <div>, chciałbym użyć ajax. Niestety, nie jestem zbyt dobry w ajax, ale chcę nauczyć się go używać. Gdyby ktoś mógł wskazać mi właściwy kierunek, byłoby wspaniale.

Chciałbym utworzyć ogólną klasę Ajax, więc mogę jej używać w dowolnym miejscu w mojej strukturze. Następnie, jeśli to konieczne, rozszerz kolejną klasę.

możesz zobaczyć moje PHP na moim poprzednim SO pytanie: Change div according to dropdown boxes selected

JSFiddle

HTML

<form action="" method="post" name="create" target="_top"> 
    <fieldset> 
     <ul class="create"> 
      <li> 
       <label class="label" for="character_name">Character Name:</label> 
       <input class="text" type="text" name="character_name" id="character_name" /> 
      </li> 
      <li> 
       <label class="label" for="character_gender">Gender:</label> 
       <select class="character_gender select" name="character_gender" id="character_gender"> 
        <option class="option" value="1">Female</option> 
        <option class="option" value="2">Male</option> 
       </select> 
      </li> 
      <li> 
       <label class="label" for="character_race">Character Race:</label> 
       <select class="character_race select" name="character_race" id="character_race"> 
        <option class="option" value="1">Goblin</option> 
        <option class="option" value="2">Human</option> 
        <option class="option" value="3">Undead</option> 
       </select> 
      </li> 
      <li> 
       <label class="label" for="character_class">Character Class:</label> 
       <select class="character_class select" name="character_class" id="character_class"> 
        <option class="option" value="1">Warrior</option> 
        <option class="option" value="2">Wizard</option> 
       </select> 
      </li> 
      <li> 
       <input class="submit-create-character" type="submit" name="create_character" value="Create" /> 
      </li> 
     </ul> 
    </fieldset> 
</form> 
<div class="class-info female-goblin-warrior"> 
    <div class="avatar-box"> 
     <img src="Female.Goblin.Warrior.gif" alt="Female Goblin Warrior" /> 
    </div> 
    Goblin description.<br /> 
    Warrior Description 
</div> 
<div class="class-info male-goblin-warrior"> 
    <div class="avatar-box"> 
     <img src="Male.Goblin.Warrior.gif" alt="Male Goblin Warrior" /> 
    </div> 
    Goblin description.<br /> 
    Warrior Description 
</div> 
<div class="class-info female-human-warrior"> 
    <div class="avatar-box"> 
     <img src="Female.Human.Warrior.gif" alt="Female Human Warrior" /> 
    </div> 
    Human description.<br /> 
    Warrior Description 
</div> 
<div class="class-info male-human-warrior"> 
    <div class="avatar-box"> 
     <img src="Male.Human.Warrior.gif" alt="Male Human Warrior" /> 
    </div> 
    Human description.<br /> 
    Warrior Description 
</div> 
<div class="class-info female-undead-warrior"> 
    <div class="avatar-box"> 
     <img src="Female.Undead.Warrior.gif" alt="Female Undead Warrior" /> 
    </div> 
    Undead description.<br /> 
    Warrior Description 
</div> 
<div class="class-info male-undead-warrior"> 
    <div class="avatar-box"> 
     <img src="Male.Undead.Warrior.gif" alt="Male Undead Warrior" /> 
    </div> 
    Undead description.<br /> 
    Warrior Description 
</div> 
<div class="class-info female-goblin-wizard"> 
    <div class="avatar-box"> 
     <img src="Female.Goblin.Wizard.gif" alt="Female Goblin Wizard" /> 
    </div> 
    Goblin description.<br /> 
    Wizard Description 
</div> 
<div class="class-info male-goblin-wizard"> 
    <div class="avatar-box"> 
     <img src="Male.Goblin.Warrior.gif" alt="Male Goblin Wizard" /> 
    </div> 
    Goblin description.<br /> 
    Wizard Description 
</div> 
<div class="class-info female-human-wizard"> 
    <div class="avatar-box"> 
     <img src="Female.Human.Wizard.gif" alt="Female Human Wizard" /> 
    </div> 
    Human description.<br /> 
    Wizard Description 
</div> 
<div class="class-info male-human-wizard"> 
    <div class="avatar-box"> 
     <img src="Male.Human.Wizard.gif" alt="Male Human Wizard" /> 
    </div> 
    Human description.<br /> 
    Wizard Description 
</div> 
<div class="class-info female-undead-wizard"> 
    <div class="avatar-box"> 
     <img src="Female.Undead.Wizard.gif" alt="Female Undead Wizard" /> 
    </div> 
    Undead description.<br /> 
    Wizard Description 
</div> 
<div class="class-info male-undead-wizard"> 
    <div class="avatar-box"> 
     <img src="Male.Undead.Wizard.gif" alt="Male Undead Wizard" /> 
    </div> 
    Undead description.<br /> 
    Wizard Description 
</div> 

CSS

.class-info { 
    display: none 
} 

JavaScript

var buildCharacter = function() { 
    var character = { 
     properties: { 
      gender: '', 
      race: '', 
      class: '' 
     }, 
     getCss: function() { 
      return (this.properties.gender + '-' + this.properties.race + '-' + this.properties.class).toLowerCase(); 
     } 
    }; 

    for (var prop in character.properties) { 
     character.properties[prop] = $('#character_' + prop + ' :selected').text(); 
    } 

    $('.class-info').hide(); 
    $('.' + character.getCss()).show(); 
}; 
buildCharacter(); 
$('.select').on('change', buildCharacter); 

zacząłem tworzyć ogólną klasę Ajax, ale w rzeczywistości nie myśleć, że to zadziała za to, co chcę.

Ajax.php

<?php /* /application/modules/Ajax/Ajax.php */ 

/** 
* Ajax 
* 
* The Ajax Class is used to get data from a Class and return the data. 
* 
*/ 
class Ajax 
{ 
    private $class; 
    private $method; 
    private $params; 

    /** 
    * __construct 
    * 
    * @access public 
    */ 
    public function __construct() 
    { 
     $this->params=$_POST;   # Call params 
     $call=explode('->', $this->params['call']); 

     if(method_exists($call[0], $call[1])) 
     { 
      $this->class=new $call[0]; # e.g. controller->method 
      $this->method=$call[1]; 
      unset($this->params['call']); 
      $this->parse(); 
     } 
     else 
     { 
      throw new Exception('Method does not exist', E_RECOVERABLE_ERROR); 
     } 
    } 

    public function parse() 
    { 
     $param=array(); 

     # Params in any order... 
     $ref_method=new ReflectionMethod($this->class, $this->method); 
     foreach($ref_method->getParameters() as $p) 
     { 
      $param[$p->name]=$this->params[$p->name]; 
     } 
     $this->params=$param; 

     $result_data=call_user_func_array(array($this->class, $this->method), $this->params); 

     return $result_data; 
    } 
} # End Ajax class. 

Odpowiedz

0

Należy utworzyć małych plików jak „female_undead_wizard.html” i „male_goblin_warrior”

Następnie, albo po stronie klienta lub po stronie serwera, należy określić który html załadować do twojego div. Zazwyczaj lepiej jest robić takie rzeczy po stronie serwera, ale prostsze na kliencie.

Na przykład po stronie klienta można słuchać wszystkich wybranych zmienionych wydarzeń, a gdy masz już wystarczającą ilość danych, wystarczy załadować kod html do div. Następnie prosta obciążenia (przy użyciu jQuery) daje rade Więc kod html może wyglądać następująco:

... 
<select id=genderSelect>...</select> 
... 
<div id="displayClassDiv"></div> 

I w skrypcie:

var gender= $("#genderSelect option:select").val(); 
//get all vals and check that exists here 
... 

var fileName=gender + "_" + race + "_" + class + ".html"; 
$("#displayClassDiv").load("<some path goes here>/" + fileName); 
+0

Dzięki, ale to nie jest moje pytanie. – Draven

0

nie jestem do końca pewien, co się beton Pytaniem jest. Rozumiem, co próbujesz zrobić, ale nie jestem pewien, co rozumiesz i które części nie rozumiesz (jeszcze). Dlatego spróbuję krótko wyjaśnić, w jaki sposób można używać ajax w jquery.

Możesz wywołać swoją funkcję PHP za pomocą ajaxa i dodać do żądania dodatkowe dane POST lub GET. Następnie możesz użyć tych danych w PHP, aby zmienić informacje, które zwrócisz.

Można używać informacji na tej stronie, aby zobaczyć, jak skonfigurować ajax żądanie w JS: http://api.jquery.com/jquery.ajax/ Ale to prawdopodobnie będzie wyglądać następująco:

j.ajax({ 
    url: '/ajax.php', 
    data: {'characterClass': j('#character_class').val(), 'gender': j('#gender').val() }, 
    type: 'GET', 
    success: function (data) { 
     //do stuff to show what you want 
    } 
}); 

Widać, że wyślę płeć i klasa znaków z danych.

W twoim pliku ajaxowym ajax musisz uzyskać te dane (co wygląda, jakbyś już to zrobił za pomocą $ _POST) i zwrócić informacje, które chcesz zwrócić. Możesz chcieć json_encode to.

W funkcji powodzenia w JS ajax można następnie wstawić informacje do strony. Możesz użyć zmiennej danych. Lubię używać console.log (dane), aby zobaczyć, jak zwracane są dane.

w skrócie jako lista:

  1. wartość zmiany w wybranych
  2. podnieść zmianę z select w JS
  3. konfiguracji ajax z js i wysłać wartości formularza danych do PHP
  4. get postu dane w PHP
  5. inicjacja żądanej funkcji/dane postów oparte na returndacie
  6. informacje zwrotne/dane
  7. odebrać returndata w js ajax sukcesu
  8. danych Służy do wyświetlania informacji na stronie

Mam nadzieję, że większość odpowiedzi (lub części) Twojego pytania. Powodzenia!