【问题标题】:Jquery Function is saying not defined when running a php script运行 php 脚本时,Jquery 函数说未定义
【发布时间】:2017-05-25 06:21:22
【问题描述】:

我基本上是这样做的,所以当你点击一个按钮“投票”时

现在我有

clients.php

<?php

$clientInfo = "SELECT * FROM Clients ORDER BY Client ASC";
$stmt = sqlsrv_query($conn, $clientInfo);

echo "<div style='width: 100%; display: inline-block;'>";

while ($client = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))
{
    echo "<div class='clientid' style='height: 50px; font-size: 18px; vertical-align: middle; display: inline-block; width: 100%'>" . 

            "
            <div style='width: 35%;'></div>

            <div onclick=\"voteUp()\" style='display: inline-block; width: 5%;'>      
                <span style='font-size: 20px;' class='hover-cursor fa fa-chevron-up vote-up'></span>
            </div>" .

                 "<div class='hover-cursor hvr-underline-reveal' style='width: 20%; display: inline-block;' data-clientid='{$client['ClientID']}'>" . $client['Client'] . "</div>" . 

            "<div onclick=\"voteDown()\" style='display: inline-block; width: 5%;'>
                <span style='font-size: 20px; text-align: right;' class='hover-cursor fa fa-chevron-down vote-down'></span>
            </div>

            <div style='width: 35%;'></div>

         </div> 
        <br />";
}

echo "</div>";

?>

正如您在上面看到的,voteUp() 函数有一个 onclick。

在我的页面底部有

<script type="text/javascript" src="scripts/scripts.js"></script>

scripts.js 中(我从关于单击 div 以运行 php 文件的教程中获得了 voteUp() 的一点)

$(document).ready(function()
{
    $('.pull-me').click(function()
    {
        $('.panel1').slideToggle('fast')
    });
    $('.pull-me').click(function()
    {
        $('.panel2').slideToggle('fast')
    });
    $('.pull-me').click(function()
    {
        $('.panel3').slideToggle('fast')
    });

    $("#selection-box1").change(function()
    {
        document.location.href = $(this).val();
    });

    $(".output").click(function () 
    {
        var noteid = $(this).data("noteid");
        var templatenoteid = $(this).data("templatenoteid");
        var variablenoteid = $(this).data("variablenoteid");

        if ($(this).data("noteid")) 
        {
            $("#right-box").load("noteContent.php", {noteid: noteid});
        }

        else if ($(this).data("templatenoteid")) 
        {
            $("#right-box").load("templateNoteContent.php", {templatenoteid: templatenoteid});
        }

        else
        {
            $("#right-box").load("variableContent.php", {variablenoteid: variablenoteid});
        }
    });


    var modal = document.getElementById('login-box');

    window.onclick = function(event)
    {
        if (event.target == modal) 
        {
            modal.style.display = "none";
        }
    }

    //This script votes up and down for the client

    function voteUp()
    {
        $.get("voteup.php");
        return false;
    }

    function voteDown()
    {
        $.get("votedown.php");
        return false;
    }

});

最后在 voteup.php

<?php include 'connectionDetails.php'; ?>

<?php

if (isset($_POST['clientid'])) 
{
    $voteup = "UPDATE Clients SET Pos = (SELECT MAX(Pos) FROM Clients) + 1 WHERE ClientID = " . $_POST['clientid'];

    $stmt = sqlsrv_query($conn, $voteup);
}
else
{
    echo "No ClientID";
}

?>

当我点击 Vote Up 按钮时,它是带有 onclick ="voteUp()" 的 DIV

为什么我在控制台中收到错误消息“ReferenceError: voteUp is not defined”

【问题讨论】:

  • 您是否正确包含脚本?
  • 我的整个显示页面 (clients.php) pastebin.com/Zk5TPxb3 但是是的,文件夹和位置是正确的

标签: php jquery sql ajax


【解决方案1】:

为什么不使用 jQuery 而不是内联 JS?给你的 div 类:

<div class="voteup" data-clientid="{$client['ClientID']}">...</div> 

然后使用 jQuery 代替 onclick() 会更干净:

$(document).on('click', '.voteup', function(){
    var clientid = $(this).data('clientid');
    $.get("voteup.php", { clientid: clientid });
    return false;
})

由于您已经在使用 jQuery,这将帮助您保持标记更简洁,让您可以更轻松地对标记和 JavaScript 进行更改。

此外,这将消除范围问题,因此您不必添加命名空间。

我看到的唯一另一个问题是您没有将$_POST['clientid'] 传递给voteup.php,因此您的查询将永远不会运行。您可以在 div 声明中包含 data-client-id,但您必须将 PHP 中的测试更改为:

if (isset($_GET['clientid'])) 

因为您将与 GET 请求一起发送值。

【讨论】:

    【解决方案2】:

    您已经确定了方法的范围。

    相反,您可以将它们附加到窗户上,以便从任何地方访问。

    window.voteUp  = function()
    {
        $.get("voteup.php");
        return false;
    }
    
    window.voteDown = function()
    {
        $.get("votedown.php");
        return false;
    }
    

    【讨论】:

    • 您好,这解决了我的错误,所以我将投票作为答案,但我只是想知道为什么没有发生任何事情,当我检查我的数据库时,列值仍然相同,错误消失了来自控制台的唯一反馈是“GET xhr”voteup.php”,但由于某种原因它没有达到我的查询
    • 因为您正在发送 $.get 调用。它需要是 $.post 调用并带有诸如 client_id 之类的数据,因为您使用的是if (isset($_POST['clientid']))
    【解决方案3】:

    为什么我在控制台中收到错误提示“ReferenceError: voteUp is not defined”

    范围。

    voteUp()voteDown 在启动块中定义(在 $(document).ready(function() ...{} 内,因此在此块之外不可用。

    你需要把这两个函数移到外面:

    $(document).ready(function() {
        ...
    });
    
    function voteUp()
    {
        $.get("voteup.php");
        return false;
    }
    
    function voteDown()
    {
        $.get("votedown.php");
        return false;
    }
    

    【讨论】:

    • @JayBlanchard 我不确定这个问题的相关性。 Document ready 用于在 DOM 准备好后初始化事件等;它不是像这里那样定义可重用的函数。
    • @JayBlanchard 这与(后来)接受的答案完全相同。我对你的评论感到困惑。
    • @JayBlanchard 我很惊讶你这么说。在 function() 块中声明的函数的作用域是该函数块。不能从该功能块外部调用它们。它们可以从该功能块中定义的事件中调用,但这里不是这种情况(但在您的有效建议中,重构事件的声明方式)。示例:jsfiddle.net/dqxcw95t(检查控制台)
    • 一切都与范围有关。内联 JS 调用适用于全局范围内的函数。也许我之前的评论措辞不好。我想说的是,可重用函数可以在任何地方定义,但您必须正确调用它们或正确命名它们以避免范围问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2012-06-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多