动态加载新内容后,jquery触发器不起作用

时间:2015-11-14 00:18:45

标签: javascript php jquery ajax

我正在制作一个使用图像的投票系统,每当你点击其中一个图像时,它就会提交那个图像,然后它会淡出并使用php页面重新加载它。问题是,第一次提交有效,但一旦重新加载,点击图像就什么都不做。甚至没有我测试过的警报。

vote.js

$('.firstDisplay').on("click", function () {
    alert("work1");
    var win = $(this).attr("title");
    var loss = $('.secondDisplay').attr("title");
    send_vote(win, loss);
    console.log("<-CLIENT-> Click: Sent vote");
});
$('.secondDisplay').on("click", function () {
    alert("work2");
    var win = $(this).attr("title");
    var loss = $('.firstDisplay').attr("title");
    send_vote(win, loss);
    console.log("<-CLIENT-> Click: Sent vote");
});

function send_vote(win, lose) {
    var data = {'win': win, 'lose': lose};
    $.ajax({
        type: "POST",
        url: 'actions/send-vote.php',
        data: data,
        success: function (html) {
            $('#sent-vote').css('display', 'block');
            $('#sent-vote').fadeOut(2000);
            $('.imageBtn').fadeOut(2000);
            $('#imageDisplay').load("source/templates/vote.php");
            console.log("<-SYSTEM-> Ajax request sent and processed.");
        },
        error: function(e) {
            $('#fail-vote').css('display', 'block');
            $('#fail-vote').fadeOut(2000);
            console.log("<-SYSTEM-> Ajax request failed to process.");
        }
    });
}

vote.php

<?php
$maximumPersons = 95;
$firstDisplay = rand(1, $maximumPersons);
$secondDisplay = rand(1, $maximumPersons);

function getScore($photo_id) {
    $query = "SELECT *
                  FROM photo_scores
                  WHERE photo_id='".$photo_id."'";
    $result = $database->query_select($query);
    return $result;
}
?>

                    <a href="javascript:void(0);" class="imageBtn" id="firstDisplay" title="<?php echo $firstDisplay; ?>">
                        <img src="<?php echo $baseURL; ?>/images/persons/<?php echo $firstDisplay; ?>.png" />
                        <?php // $scoreFD = getScore($firstDisplay); echo "Wins: ".$scoreFD["wins"]." Losses: ".$scoreFD["losses"].""; ?>
                    </a>

                    <a href="javascript:void(0);" class="imageBtn" id="secondDisplay" title="<?php echo $secondDisplay; ?>">
                        <img src="<?php echo $baseURL; ?>/images/persons/<?php echo $secondDisplay; ?>.png" />
                        <?php // $scoreSD = getScore($secondDisplay); echo "Wins: ".$scoreSD["wins"]." Losses: ".$scoreSD["losses"].""; ?>
                    </a>

它们都正确加载,只是img /按钮在重新加载后不会提交/工作。

2 个答案:

答案 0 :(得分:1)

您需要使用$(document).on('event', '.selector', function(){});形式来监听DOM上的新元素并将处理程序附加到它们。

答案 1 :(得分:1)

这里的答案是事件委托。

将事件侦听器绑定到对象不会将其绑定到所有其他动态加载或创建的对象,或者将(例如示例中的类)添加到另一个对象将不会应用其事件侦听器,因为它们不存在脚本运行时

$('.firstDisplay').on("click", function () {

你说firstDisplay类的所有当前元素都会点击。如果你再添加一个新的.firstDisplay,它就不会知道它需要监听点击。简而言之,监听器不会附加在类本身上,而是附加在运行脚本时具有类的元素上。

现在要让它工作,我们将使用事件委托

$(document).on("click",'.firstDisplay', function () {

这次我们将事件绑定在文档上。我们还告诉事件,如果在文档中单击的元素上找到firstdisplay类,则必须执行以下函数。因此,如果添加了新元素,则现在绑定到文档的事件将正确触发