【问题标题】:my done button somehow went to a blank page and delete won't work unless I refresh -ajax我的完成按钮不知何故进入了空白页面,除非我刷新 -ajax,否则删除将不起作用
【发布时间】:2015-06-15 07:42:25
【问题描述】:

我正在玩我在网上学到的待办事项列表。试图在其中添加ajax。 当我尝试添加项目时效果很好。当添加一个项目时,会有一个按钮显示“标记为已完成”,因此我可以单击它,然后会有一个“删除”按钮,用于从列表和数据库中删除该项目。

使用 ajax 添加可以正常工作,但添加后,如果我点击“标记为完成”按钮,页面会转到 done-ajax.php?as=done&item=110 的 url 其中 110 只是数据库中项目的 ID。 我必须回到索引页面。当我返回索引页面时,该项目将被标记为已完成,因为“标记为完成”有效,但不知何故会转到 url 而不是留在索引页面中。

这是发现的问题之一,不知道去哪里找结果。

另一个问题是,如果我添加项目并刷新页面然后单击“标记为已完成”,它不会转到 URL,而是 ajax 工作并且会显示“删除”按钮,但删除按钮会如何不行。我必须刷新页面才能使“删除”按钮与 ajax 一起使用。 我检查了属性并查看了代码,但似乎找不到导致问题的位置。

我的索引代码如下

<div class="list">
<h1 class="header">ET's To do lists.</h1>

<?php if(!empty($items)): ?>
<ul class="items">
    <?php foreach($items as $item): ?>
    <li>
                    <span class="item<?php echo $item['done'] ? ' done' : '' ?>">
                        <?php echo $item['todoText']; ?>
                    </span>
        <?php if($item['done']): ?>
        <a href="delete-ajax.php?as=delete&item=<?php echo $item['id']; ?>" class="delete-button">Delete Task</a>
        <?php endif; ?>
        <?php if(!$item['done']): ?>
        <a href="done-ajax.php?as=done&item=<?php echo $item['id']; ?>" class="done-button">Mark as done</a>
        <?php endif; ?>
    </li>
    <?php endforeach; ?>
</ul>
<?php else: ?>
<p class="empty">You haven't added any items yet.</p>
<ul class="items"></ul>
<?php endif ?>

<form class="item-add" action="add.php" method="post">
    <input type="text" name="todoText" placeholder="Type a new item here." class="input" autocomplete="off" required>
    <input type="submit" value="Add" class="submit">
</form>
</div>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="js/ajax.js"></script>

我的 ajax.js 文件

$(document).ready(function() {

//Action when submit is clicked
$(".submit").click(function(e){
var todoText = $("input[name='todoText']").val();
e.preventDefault();

//Ajax for adding todoText
$.ajax({
method: "POST",
url: "add-ajax.php",
data: {todoText: todoText},
dataType: "json"
})
.done(function(data){
$('p.empty').empty();
$('input.input').val('');
$('ul.items').append('<li>'+todoText+' '+
    '<a href="done-ajax.php?as=done&item=' + data.id +
                '" class="done-button">Mark as Done</a></li>');
})
});

//Action when done button is clicked
$(".done-button").click(function(e){
e.preventDefault();

//making sure only work with the current element
var $clicked = $(this);

//get the href attribute value and parse it to get the item # which is the item's id
var attrValue = $clicked.attr('href');
var parseAttrValue = attrValue.split('&');
var parseItem = parseAttrValue[1].split('=');
var item = parseItem[1];

//Ajax for Mark as Done Button
$.ajax({
method: "GET",
data:{as: 'done', item: item},
url: "done-ajax.php"
})
.done(function(){
$clicked.prev().addClass('done');
$clicked.removeClass('done-button').empty();
$clicked.addClass('delete-button').text('Delete Task');
$clicked.removeAttr('href');
$clicked.attr('href','delete-ajax.php?as=delete&item='+item);
});
});

//Action when delete button is clicked
$(".delete-button").click(function(e){
e.preventDefault();

//making sure only work with the current element
var $clicked = $(this);

//get the href attribute value and parse it to get the item # which is the item's id
var attrValue = $clicked.attr('href');
var parseAttrValue = attrValue.split('&');
var parseItem = parseAttrValue[1].split('=');
var item = parseItem[1];

//Ajax for Mark as Done Button
$.ajax({
method: "GET",
data:{as: 'delete', item: item},
url: "delete-ajax.php"
})
.done(function(){
$clicked.closest('li').remove();
$clicked.remove();
});
});
});

my done-ajax.php file


<?php

require_once 'app/init.php';

if (isset($_GET['as'], $_GET['item']))
{
    $as = $_GET['as'];
    $item = $_GET['item'];

    switch ($as) {
        case 'done':
            $doneQuery = $db->prepare("
UPDATE phptodolist_items
SET done = 1
WHERE id = :item
AND user = :user
");
break;
}
}


my delete.php file

<?php

require_once 'app/init.php';

if (isset($_GET['as'], $_GET['item']))
{
    $as = $_GET['as'];
    $item = $_GET['item'];

    switch ($as) {
        case 'delete':

            $doneQuery = $db->prepare("
DELETE FROM phptodolist_items
WHERE id = :item
AND user = :user
");
break;
}
}

(顺便说一句,感谢之前帮助过 ajax 的人) 非常感谢大家提前:D

【问题讨论】:

  • 据我所知,您的“完成”按钮在页面加载时不存在,对吗?因此,在您的 js 中,在$(".done-button") 中,jquery 不可能触发此单击事件,因为页面加载时没有此类。查看(并阅读)jquery 的.live()。它将帮助您解决问题
  • @andrew live() 已弃用,您需要on()
  • @jeroen 你是对的,我的坏习惯似乎很难改掉
  • 啊!非常感谢!我试图再次查看并发现当我单击删除时我的 as 值应该是 delete 但它是 done 我不知道为什么:

标签: javascript php jquery ajax button


【解决方案1】:

当页面打开/DOM 准备好时,您正在绑定您的事件处理程序,$(document).ready()。然后您使用 ajax 添加新项目,但这些项目中的链接不会将您的事件处理程序绑定到它们。

您可以使用事件委托来确保事件也自动绑定到新添加的项目。

你可以改变:

$(".delete-button").click(function(e){
e.preventDefault();
...

类似于:

$(".list").on('click', '.delete-button', function(e){
  e.preventDefault();
  ...

其中$(".list") 可以是包含新添加元素并且在此代码执行时位于页面上的任何元素。

这适用于您希望在 DOM 准备好时绑定到页面上尚未出现的元素的所有事件处理程序。

【讨论】:

  • 多谢多谢~真的不知道这个。我猜这在 ajax 中使用得很多?
  • @Dora 是的,这是将事件绑定到动态添加的元素的方法。请注意,有时您还需要在成功处理程序中手动绑定内容,例如数据选择器等。
  • 不知何故我也将此添加到我的提交中(这是添加)但现在它正在刷新页面而不是执行 ajax O.o 任何想法?
  • @Dora 你确定按钮/表单是你使用的包含元素的子元素吗?而且您应该真正绑定到表单提交事件,而不是按下按钮,以防它使用回车键提交。
  • 现在我将提交留给原始代码 $('.submit').click(function(e){... 我将完成 / 删除更改​​为 $('li').on('click', '.done-button', function(e){...$('li').on('click', '.delete-button', function(e){ 但是这样,在添加之后,如果我点击完成按钮它再次使用 get url 转到空白页面。如果我将提交代码更改为$('input').on('click', '.submit', function(e){....,那么每次添加项目时,页面实际上都会刷新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多