【问题标题】:Embedded php within JQuery within HTML table within PHP ... won't fire在 PHP 中的 HTML 表中的 JQuery 中嵌入 php ...不会触发
【发布时间】:2011-03-27 18:21:06
【问题描述】:

具体问题在这个(很长的)序言的末尾。抱歉,我试着让它尽可能短。 (花了一个多小时来写这个问题)。

.php 文件使用 (php) 函数读取 SQL 数据库中的行并动态创建 HTML 表。

对于每一行,通过$book['id']$book['code']$book['description']等返回SQL数据。

$book['code'] 是一个由两个字符组成的字母数字 ID,例如。 B7 或 DW

在每一行的 HTML 中都有一个 <td></td>,其中包含一个带有 onclick= 事件的锚标记,该事件运行 JQuery 脚本(显示/隐藏该行的元素)。

假设点击了几行或几行,并且嵌入的 JQuery 脚本隐藏了几个元素(顺便说一句,它工作正常)

当用户查看不同的页面然后返回到该页面时,隐藏的元素(被 JQuery 脚本隐藏的)不再隐藏。

我希望为每个单击的行保留一串$book['code'] 值,并在返回第一页时解析该字符串以重置隐藏元素。

<?php
function render_row_from_mysql() {
    $output .= '
        ...create header row... 

        foreach ($books as $book) 
        {
            create table row cells 1, 2, 3, 4
            after cell 4: 
            <td>
            <a id="addToShelf.php" onclick="
                jQuery.ajax(\'./addToShelf.php?id='.$book['id'].'ats'.'\'); 
                jQuery(addToShelfLink'.$book['id'].')[0].style.display = \'none\'; 
                jQuery(rfs'.$book['id'].')[0].style.display = \'block\'; 
                jQuery(mt'.$book['id'].')[0].style.display = \'none\';
                jQuery(grn'.$book['id'].')[0].style.display = \'block\';
                return false;
            ">
                add to bookshelf
            </a>
            </td></tr>' ;
        }
}

问题:

  1. 为什么上面运行正常的 JQuery 代码不需要右括号?

  2. 在锚标记中创建/更新 var 的语法是什么,以保留累积的点击行数据?我问是因为我的许多尝试都破坏了代码。

  3. 是否应该在函数顶部、foreach 循环之前初始化 var?

  4. 我尝试使用 PHP 通过在“return false;”之后插入以下代码来创建/更新 cookie; (见下文)。下面的 php 代码确实在粘贴到单独的脚本中进行测试时会创建一个 cookie。) php 代码不会触发。为什么?

【问题讨论】:

  • 如果您将 php 和 jquery 代码分开可能会更容易。而不是在 a 标记中编写 onclick,只需添加和分类并在文档准备好时注册 click 事件......可能会使调试更容易。

标签: php jquery


【解决方案1】:

答案是:

1) 仍然不确定,只是语法。

2) 如第四季度所述,我一直在“return false;”之后输入代码;声明,这就是 结束 onclick 事件的内容。因此,任何放在 之后的代码“return false;”不会作为 onclick 事件的一部分触发......而且没有其他东西可以让它触发。

3) 无关

4a.) 上面的代码是在 PHP 代码块中创建的——不能在由 PHP 创建(即已经在其中)的 HTML 内的 JQuery 中创建 PHP 代码块。 4b.) 在回答 (2) 之后,我的 alert() 测试不会触发,因为它们遵循“return false”;陈述, 4c.) 任何新的 PHP 代码都必须从 HTML 中移出并与 PHP 的其余部分一起放回原处,例如在函数 (render_row_from_mysql){} 上方。

现在“回到绘图板”来弄清楚如何在用户离开此页面和返回页面之间保留“点击的项目”数据。目前,我怀疑这将是某种形式的 $POST 事件,但之前从未做过,我不确定它会是什么样子。

【讨论】:

    【解决方案2】:

    我完全同意 Bjorn 22 分钟前的评论。您需要删除所有的 onclick 代码并将识别类添加到您的锚标记。您还需要确保每个 HTML 元素都有一个唯一的 id,这是 W3C 验证要求。如果每本书的 id 在系统范围内都是唯一的,我会使用它,请参见下面的示例:

    <?php
    function render_row_from_mysql() {
        $output .= '
    
        foreach ($books as $book) 
        {
            //create table row cells 1, 2, 3, 4
            //after cell 4:
    
            <td>
            <a id="'.$book['id'].'" class="addToShelf">
                add to bookshelf
            </a>
            </td></tr>' ;
        }
    }
    

    将此 javascript 代码添加到 HTML 代码的底部。

    jQuery(document).ready(function($) {
        // bind event to all anchor tags with class addToShelf
        $('a.addToShelf').click(function() {
            var book_id = this.id;
    
            $.ajax('addToShelf.php?id='+book_id, function() {
                // execute code after the ajax request is complete...
                $('addToShelfLink'+book_id).hide();
                $('rfs'+book_id).show(); 
                $('mt'+book_id).hide();
                $('grn'+book_id).show();            
            });
    
            return false;
        });
    });
    

    【讨论】:

    • 非常感谢您的想法,尤其是您留下的答案。我不可避免地在发布后立即被称为 afk,并且在发布后的关键时刻没有机会与响应者互动。
    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 2014-12-16
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多