PHP变量作为jQuery函数的一部分不起作用,但纯文本可以

时间:2010-01-18 03:55:54

标签: php javascript jquery

我的PHP文件中有以下jQuery代码(2010年1月19日编辑@ 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; ?>

The page in question is available here。 “点击批准”链接不起作用(这是我的问题)。

当我查看源代码时,PHP变量似乎在jQuery中正确回显:

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

这看起来是正确的,但是当我点击任何链接时没有任何反应。但是,当我用普通数字(0,1等)替换PHP echo语句时,单击函数按预期工作

你可能会问:为什么你在for循环中有这个?原因是我需要检索 attachment-&gt; ID 变量和将它传递给外部PHP脚本。当有人点击“批准”并确认时,外部脚本会使用attachment-&gt; ID并将数据库值更新为“已批准”。

当PHP到位时为什么点击功能不会激活?这里是否存在某种更大的力量(例如托管限制),或者我错过了一个基本的方法PHP和JavaScript互动?

4 个答案:

答案 0 :(得分:5)

由于您没有发布HTML,因此无法进行故障排除。

首先,我不确定为什么一个工作而另一个不工作,因为它输出的代码看起来是正确的。无论哪种方式,我仍然会做出一些改变。将您的a_0a_1等以及d_0d_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循环中输出代码,而是将代码一次放在页面上:

$(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个元素,其中<{1>} id开头。单击此按钮后,它会从ID a_中删除该号码,并使用该ID查找a_0 = 0元素并显示它。

答案 1 :(得分:2)

由于javascript是在客户端上运行的,并且无法知道脚本是否是使用PHP生成的,我认为特定部分是一个疯狂的追逐......

  

当我替换PHP echo语句时   用普通数字(0,1等)   点击功能按预期工作。

再次执行此操作,并在浏览器中使用view-source比较实际输出。我敢打赌你发现工作脚本和失败脚本之间存在差异,除了其中一个脚本是由PHP生成的。

答案 2 :(得分:0)

似乎问题出在jQuery选择器中。而不是使用PHP代码的输出动态绑定多个对象上的click()事件,只使用一个类选择器并绑定到具有此类的对象。您可以指定id属性以使其唯一。

答案 3 :(得分:0)

奇怪的是要有脚本标签和

$(document).ready(function()

在循环中。我不知道这是否会导致任何问题,但肯定不是很有效,一次就足够了。