【问题标题】:deal with a div within a while loop在while循环中处理一个div
【发布时间】:2011-03-16 19:11:50
【问题描述】:

我有一个 while 循环显示来自数据库的数据项,我想分开处理每个项目,但我得到的只是第一个 div,对于每次迭代,我想获取当前迭代的“id”并处理有了它,它看起来像 facebook 中的“like”,当我点击第一个“like”时,jquery 运行 $.post(..) 函数并且一切正常:使用这个 id 完成的处理, 但是当我点击其他下一个'like's post方法时仍然发送第一个id(由firebug签出), 代码:

<script type='text/javascript>
  $("#like").click(function(){
    $.post("done.php",
      {id:$("#id").val()},
      function(data){
        ...
      });
   });
</script>

<body>
$result = myqsl_query("select * from ...");
while($fetch = mysql_fetch_array($result){
..
echo "<input id='id' value='$fetch[0]'>
<a href='...' id='like'>like</a>";
..
</body>

我希望我成功地描述了这个问题! 任何语言的任何解决方案都将不胜感激! 问候。

【问题讨论】:

  • 也许只有我一个人——但如果你在每个点赞锚上都设置了 id="like" 你就不会成功!!

标签: php javascript jquery loops html


【解决方案1】:

如果您的最终输出如下所示:

<input id='id' value='someValue'>
<a href='someLink' id='like'>like</a>
...
<input id='id' value='someValue'>
<a href='someLink' id='like'>like</a>

会给您带来问题,因为每个 dom 的 id 必须是唯一的。

你可以修改它以使用类:

<input class="likeId" value='someValue'>
<a href='someLink' class='like'>like</a>
...
<input class="likeId" value='someValue'>
<a href='someLink' class='like'>like</a>

比在您的点击处理程序中。

$(".like").click(function(){
    $.post("done.php",
      {id:$(this).prev('.likeId').val()},
      function(data){
        ...
    });
});

根据输入值是否隐藏,您可以将其完全删除并使用 html data-* 属性和 .data() 假设您是否可以使用大于 1.4.3 的 jQuery。

<a href='someLink' class='like' data-likeId='someValue'>like</a>
<a href='someLink' class='like' data-likeId='someValue'>like</a>

$(".like").click(function(){
    $.post("done.php",
      {id:$(this).data('likeId')},
      function(data){
        ...
    });
});

【讨论】:

  • 效果非常好,谢谢 MArk,你看起来有点像专家^^!
【解决方案2】:

ID 在 HTML 文件中必须是唯一的。如果您有多个具有相同 ID 的元素,则浏览器只返回第一个。因此,$('#like').click() 仅将 click 事件处理程序附加到具有此 ID 的第一个元素。

您必须改用类:

<script type='text/javascript>
  $(".like").click(function(){
    $.post("done.php",
      {id:$(this).prev().val()},
      function(data){
        ...
      });
   });
</script>

<body>
<?php
    $result = myqsl_query("select * from ...");
?>
<?php while(($fetch = mysql_fetch_array($result))): ?>
    <input class="something" value="<?php echo $fetch[0]; ?>" />
    <a href="..." class="like">like</a>
<?php endwhile; ?>
</body>

补充说明:

  • 你不应该echo HTML,它很难维护。相反,将 PHP 嵌入 HTML 中,就像我在上面展示的那样。
  • 我也使用alternative syntax for control structures,如果您将 HTML 和 PHP 混合使用,则更易于阅读。

【讨论】:

  • 是的,我忘记了,我用类试过了,我修改了jquery函数:$(".like).click(...),但没有解决问题,总是我得到同样的数据发布到done.php,不知道有没有办法初始化要发送的数据????
  • 感谢菲利克斯的建议,经验出现在这里!
【解决方案3】:

也许你可以这样做:

<script type='text/javascript>
   $(".like").click(function(){
      $.post("done.php",
         {id:$("#id").prev("input").val())},
         function(data){
         ...
      });
   });
</script>

<body>
    $result = myqsl_query("select * from ...");
    while($fetch = mysql_fetch_array($result){
    ..
    echo "<input name='id' value='$fetch[0]'>
    <a href='...' class='like'>like</a>";
    ..
</body>

【讨论】:

    【解决方案4】:

    您说“第一次喜欢”,所以我假设您在页面中有许多“喜欢”按钮。

    $("#like").click(function(){
    

    但标准会告诉您 id 必须是唯一的。也许是一个全局变量,它迭代并将迭代附加到 id,例如 '#like1', '#like2' 等。

    不确定这是否会引导您找到答案,但这是需要考虑的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      相关资源
      最近更新 更多