Переменная PHP как часть функции jQuery не работает, но простой текст делает - PullRequest
3 голосов
/ 18 января 2010

В моем PHP-файле есть следующий код jQuery (отредактировано 19 января 2010 @ 10:40 MST) :

<?php
   $count = 0;
   foreach($attachments as $attachment) :
      echo '<script type="text/javascript">
               $(\'#a_'.$count.'\').click(function() {
                  $(\'#d_'.$count.'\').show(200);
               });

               // if "no" is clicked
               $(\'#d_'.$count.' .no\').click(function() {
                  $(\'#d_'.$count.'\').hide(200);
               });

               // if "yes" is clicked
               $(\'#d_'.$count.' .yes\').click(function() {
                  $(\'#d_'.$count.'\').hide(200);

                  // update database table -- this is why I need the script inside the for loop!
                  var jsonURL = \'http://path/to/update_db_script.php\';
                  $.getJSON(jsonURL, {\'post_id\' : '.$attachment->ID.'}, function(data) {
                     alert(\'Thank you. Your approval was received.\');
                  });
                  $(\'#a_'.$count.'\').replaceWith(\'<span>Approved</span>\');
               });
            </script>';

      echo '<li>';
         if($attachment->post_excerpt == 'approved') {
            // Check the proof's status to see if it reads "approved"
            echo '<span>Approved</span>';
         } else { ?>
            // If not yet approved, show options
            <a class="approve" id="a_<?php echo $count; ?>" href="#">Click to Approve</a>
            <div class="confirm-approval" id="d_<?php echo $count; ?>">
               <p>Please confirm that you would like to approve this proof:</p>
               <a class="yes" href="#">Yes, I approve</a>
               <a class="no" href="#">No, not yet</a>
            </div><?php
         } ?>
      </li>
   <?php $count++;
endforeach; ?>

Данная страница доступна здесь . Ссылки «нажмите для подтверждения» не работают (это моя проблема).

Когда я просматриваю исходный код, переменные PHP отображаются правильно в эхо jQuery:

<script type="text/javascript">
   $('#a_0').click(function() {
      $('#d_0').show(200);
   });
   ... etc ...
</script>

Это выглядит правильно, но ничего не происходит, когда я нажимаю на любую из ссылок. Однако , когда я заменяю операторы PHP echo на простые числа (0, 1 и т. Д.), Функции щелчка работают как положено .

Вы можете спросить: с какой стати это происходит внутри цикла for? Причина в том, что мне нужно получить переменную attachment-> ID и передать ее внешний скрипт PHP. Когда кто-то нажимает «утвердить» и подтверждает, внешний сценарий берет вложение-> ID и обновляет значение базы данных, чтобы прочитать «утверждено».

Почему функция щелчка не срабатывает при наличии PHP? Есть ли здесь какая-то большая сила (например, ограничение хостинга), или я упускаю фундаментальную часть того, как PHP и JavaScript взаимодействуют?

Ответы [ 4 ]

5 голосов
/ 18 января 2010

Поскольку вы не опубликовали свой HTML, его немного сложно устранить.

Во-первых, я не уверен, почему один работает, а другой нет, поскольку код, который он выводит, выглядит корректно.В любом случае, я все равно внесу некоторые изменения.Переместите a_0, a_1 и т. Д. И d_0, d_1 и т. Д. В атрибут id вместо класса:

<div><a href="#" id="a_0" class="approve">Click Me</a></div>
<div class="confirm_approval" id="d_0">Show Me</div>
<div><a href="#" id="a_1" class="approve">Click Me</a></div>
<div class="confirm_approval" id="d_1">Show Me</div>

Теперь вместо вывода кода в видев PHP, поместите этот код jQuery Once на свою страницу:

$(document).ready(function(){
   $("a.approve[id^='a_']").click(function(e){
      var id = this.id.replace('a_',''); // Get the id for this link
      $('#d_' + id + '.confirm-approval').show(200);
      e.preventDefault();
   });
});

Этот код находит любой элемент a с классом approve, который имеет id, который начинается с a_.При щелчке по нему он захватывает номер с идентификатора a_0 = 0 и использует этот идентификатор, чтобы найти элемент confirm-approval и показать его.

2 голосов
/ 18 января 2010

Поскольку javascript запускается на клиенте и не имеет возможности узнать, был ли сценарий сгенерирован с использованием PHP или нет, я думаю, что конкретная часть - это погоня за диким гусем ...

Когда я заменяю операторы PHP echo с простыми числами (0, 1 и т. д.) функция щелчка работает как положено.

Сделайте это снова и сравните фактический результат, используя view-source в браузере. Держу пари, вы обнаружите, что между рабочими и ошибочными сценариями есть разница, за исключением того, что один из них генерируется PHP.

0 голосов
/ 18 января 2010

Нечто странное - иметь тег script и

.
$(document).ready(function()

в цикле. Я не знаю, вызывает ли это какие-либо проблемы, но это не очень эффективно, достаточно одного раза.

0 голосов
/ 18 января 2010

Кажется, проблема в селекторах jQuery. Вместо динамического связывания событий click() для нескольких объектов с выходным кодом PHP, используйте только один селектор класса и привязывайте к объектам с этим классом. И вы можете указать атрибут id, чтобы сделать их уникальными.

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