Динамическое управление содержимым страницы с использованием jQuery - PullRequest
0 голосов
/ 10 марта 2011

Я новичок и пытаюсь сделать простую динамическую страницу. который имеет содержимое в базе данных MySQL, выбирается php и сохраняется в массивах. Я пытаюсь сгенерировать страницу на основе содержимого этих массивов, используя jQuery. Я вставил код ниже и комментарии объясняют вещи. Это не работает, пожалуйста, предложите мне, как действовать. Заранее спасибо.

    // execute query 
            $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); 
            $row = mysql_fetch_row($result);
            $id[$i] = $row[0];$question[$i] = $row[1];$opt1[$i] = $row[2];$opt2[$i] = $row[3];$opt3[$i] = $row[4];$opt4[$i] = $row[5];$answer[$i] = $row[6];

        }
        mysql_free_result($result); 
    // close connection 
        mysql_close($con);  
        ?>

        <script type="text/javascript">
    //POPULATE THE JS ARRAY WITH DATA FROM SERVER   
        var Q = []; var op1 = [];   var op2 = [];   var op3 = [];   var op4 = [];   var ans = [];
        <?php $cnt = 1;?>
        for(i=1;i<=10;i++)
        {
            Q[i] = "<?php echo $question[$cnt] ?>";
            op1[i] = "<?php echo $opt1[$cnt] ?>";
            op2[i] = "<?php echo $opt2[$cnt] ?>";
            op3[i] = "<?php echo $opt3[$cnt] ?>";
            op4[i] = "<?php echo $opt4[$cnt] ?>";
            ans[i] = "<?php echo $answer[$cnt++] ?>";
        }

//IT WORKS FINE UPTO HERE 

    // TRYING TO DYNAMICALLY DISPLAY THE ARRAY CONTENTS ON THE WEB PAGE based upon clicks on the ids will match with the answer array is it the 
    // correct method to go about ??
    //
        $("document").ready(function() {
        for(var i=1;i<=10;i++) {
        $("p").css("border", "3px solid red");
        $("#question").append(document.createTextNode(Q[i]));
        $("#op1").append(document.createTextNode(op1[i]));
        $("#op2").append(document.createTextNode(op2[i]));
        $("#op3").append(document.createTextNode(op3[i]));
        $("#op4").append(document.createTextNode(op4[i]));
          }
        });

    </script>

    </head>


    // FRAMEWORK OF The html content

    <body>
    <p class="q"></p>
    <p class="op1"></p>
    <p class="op2"></p>
    <p class="op3"></p>
    <p class="op4"></p>
</body>
</html>

// для нас, вот код:

    var i = 1;
    $("#q").html(Q[i]);
    $("#op1").html(op1[i]);
    $("#op2").html(op2[i]);
    $("#op3").html(op3[i]);
    $("#op4").html(op4[i]);
        for(i=2;i<=10;i++){
            $("#q").html(Q[i]);
            $("#op1").html(op1[i]);
            $("#op2").html(op2[i]);
            $("#op3").html(op3[i]);
            $("#op4").html(op4[i]);
                    $('.set').clone(true).insertAfter('.set');
        }

Ответы [ 4 ]

3 голосов
/ 10 марта 2011

В дополнение к несоответствию идентификатора / класса, о котором упоминали другие, нет элемента с идентификатором или классом «question», хотя есть <p class="q">.

PHP-скрипт выполняется перед JSТаким образом, ваш цикл заполнения массивов JS неоднократно заполняет их первыми значениями из массивов PHP.Сценарий, который выполняет браузер:

    var Q = []; var op1 = [];   var op2 = [];   var op3 = [];   var op4 = [];   var ans = [];
    for(i=1;i<=10;i++)
    {
        Q[i] = "[question 1, or possibly question 2]";
        op1[i] = "[option 1-1 ...]";
        op2[i] = "[option 1-2...]";
        op3[i] = "[option 1-3...]";
        op4[i] = "[option 1-4...]";
        ans[i] = "[answer 1 ...]";
    }

Вместо этого полностью сгенерируйте массив в PHP:

var Q = [ <?php echo implode(', ', array_map('json_encode', $Q)); ?> ];

Вместо отдельного массива для каждого компонента вопроса, отдельный массив вопросаобъекты облегчают объединение вопросов и вариантов выбора:

<?php
    // Fetching DB rows should be handled by a class or function that maps
    // DB rows to PHP objects, which is part of a data access layer, 
    // rather than where you generate HTML output, which belongs to the
    // presentation layer.
    // For this example, we use example data rather than the result of an SQL query.
    $questionQry = array(
        array('Question 1?', 'Choice 1 A', 'Choice 1 B', 'Choice 1 C', 'Choice 1 D'),
        array('Question 2?', 'Choice 2 A', 'Choice 2 B', 'Choice 2 C', 'Choice 2 D'),
        array('Question 3?', 'Choice 3 A', 'Choice 3 B', 'Choice 3 C', 'Choice 3 D'),
        array('Question 4?', 'Choice 4 A', 'Choice 4 B', 'Choice 4 C', 'Choice 4 D')
    );
    // encode data so it's suitable to be output as JS.
    // If you use PDO, you don't need to change this loop.
    foreach ($questionQry as $row) {
        $questions[] = json_encode(array( 
            'query' => $row[0],
            'choices' => array_slice($row, 1)
        ));
    }
?>
var questions = [ <?php echo implode(', ', $questions) ?> ];

Обратите внимание, что это показывает еще одно преимущество PDO по сравнению со старым расширением mysql: результаты запроса могут быть зациклены с помощью foreach,точно так же как массивы, так как PDOStatement реализует Traversable.Таким образом, вы можете переключаться между массивами для примеров и результатами SQL для производственного кода с минимальным переписыванием кода.

Способ структурирования вашего HTML , как только вы исправите другие проблемы, которые увидит пользовательвсе вопросы, затем все первые возможные ответы, затем второй и т. д.Вместо этого вы можете создать элемент, который вы можете clone , а затем заполнить его содержимым.Мыслить структурно;Вопрос - это запрос и некоторые варианты, которые представляют собой список (упорядоченный).HTML должен отражать это.

<p id="QuestionTemplate" class="question" style="display: none">
    <div class="query"></div>
    <ol class="choices">
        <li><input type="radio" value="0" /><label></label></li>
        <li><input type="radio" value="1" /><label></label></li>
        <li><input type="radio" value="2" /><label></label></li>
        <li><input type="radio" value="3" /><label></label></li>
    </ol>
</p>

Примечание: добавьте .choices { list-style-type: upper-alpha; } в таблицу стилей, и варианты ответов будут названы от A до D.

Чтобы заполнить шаблон вопроса:

function renderQuestion(qstn, qid) {
    var $qElt = $('#QuestionTemplate').clone();
    $qElt.find('.query').attr('id', qid)
                           .text(qstn.query);
    $qElt.find('.choices').children().each(function (i, item) {
        item.find('input').attr({name: qid,
                                 id: qid+'_'+i});
        item.find('label').text(qstn.choices[i])
                          .attr('for', qid+'_'+i);
    }
}
$(function() {
    for (var i=0; i < Q.length; ++i) {
        renderQuestion(Q[i], 'q'+i);
    }
});

Или создайте вопросы с нуля:

function renderQuestion(qstn, qid) {
    var qElt = document.createElement('p');
    qElt.id = 'Question_'+qid;

    var elt= document.createElement('div');
    elt.appendChild(document.createTextNode(qstn.query));
    elt.className="query";
    qElt.appendChild(elt);

    elt = document.createElement('ol');
    elt.className="choices";
    for (var i=0; i < qstn.choices.length; ++i) {
        var choice = document.createElement('li');
        choice.appendChild(document.createElement('input'));
        choice.lastChild.type='radio';
        choice.lastChild.name = qid;
        choice.lastChild.id = qid+'_'+i;
        choice.lastChild.value = i;

        choice.appendChild(document.createElement('label'));
        choice.lastChild.for = qid+'_'+i;
        choice.appendChild(document.createTextNode(qstn.choices[i]));

        elt.appendChild(choice);
    }
    qElt.appendChild(elt);
    document.appendChild(qElt);
}

В любом случае правильные ответы не должны выводиться при создании JS.

Поскольку вы невам не нужен JS для генерации вопросов, еще лучше было бы генерировать вопросы в PHP, что означает, что вам не нужно беспокоиться о том, что делать, когда JS недоступен.

<?php
    // Fetching DB rows should be handled by a class or function that maps
    // DB rows to PHP objects, which is part of the data access layer, 
    // rather than where you generate HTML output.
    // For this example, we just use example data.
    $questions = array(
        array('query' => 'Question 1?', 'A' => 'Choice 1 A', 'B' => 'Choice 1 B', 
                                          'C' => 'Choice 1 C', 'D' => 'Choice 1 D'),
        array('query' => 'Question 2?', 'A' => 'Choice 2 A', 'B' => 'Choice 2 B', 
                                          'C' => 'Choice 2 C', 'D' => 'Choice 2 D'),
        array('query' => 'Question 3?', 'A' => 'Choice 3 A', 'B' => 'Choice 3 B',
                                          'C' => 'Choice 3 C', 'D' => 'Choice 3 D'),
        array('query' => 'Question 4?', 'A' => 'Choice 4 A', 'B' => 'Choice 4 B', 
                                          'C' => 'Choice 4 C', 'D' => 'Choice 4 D')
    );
?>

<?php foreach ($query as $i => $q): ?>
  <p id="Question_<?php echo $i; ?>" class="question">
      <div class="query"><?php echo array_shift($q); </div>
      <ol class="choices">
        <?php foreach ($q as $j => $choice): ?>
          <li>
              <input type="radio" name="<?php echo "q$i"; ?>" id="<?php echo "q${i}_${j}"; ?>" value="<?php echo $j; ?>" />
              <label for="<?php echo "q${i}_${j}; ?>"><?php echo $choice; </label>
          </li>
        <?php endforeach; ?>
      </ol>
  </p>
<?php endforeach; ?>
1 голос
/ 10 марта 2011

Я не уверен, почему вы хотите запустить вывод через jquery. Похоже, излишний переподготовка для меня. Почему вы не можете просто отфильтровать вывод БД прямо на свою страницу, или я что-то упустил?

0 голосов
/ 10 марта 2011

И каждый вопрос будет перезаписан следующим. Вы увидите только последний.

0 голосов
/ 10 марта 2011

ваши селекторы в jquery ищут идентификаторы ...

$("#op4").append(document.createTextNode(op4[i]));

^ ищет идентификатор 'op4', тогда как ваша разметка имеет пятый абзац с классом 'op4' ...

<p class="op4"></p>

возможно, попробуйте изменить либо jquery, либо разметку, чтобы селекторы совпадали.

Не уверен, что если это недосмотр, то здесь может появиться свежая пара глаз.Удачи исправления!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...