【问题标题】:Stay on same page after a form submit using ajax使用 ajax 提交表单后留在同一页面
【发布时间】:2017-04-13 07:10:28
【问题描述】:

我正在使用 ajax 进行帖子上传,但是当我调用 addPost.php 时,它不会返回并在同一页面上显示结果,它会重定向到 addPost.php 并在该页面上显示结果。

当我在 ajax 的成功方法中尝试警报时,它仍然重定向到另一个页面。

为什么会这样?对于我的其他函数,如 getCategories,它可以很好地返回数据。这可能是什么问题?

我想用这个表格上传一个文件,还有数据。

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Post</title>
</head>
<body>

<form class="postForm" id="postForm" method="post" action="addPost.php" enctype="multipart/form-data">

    <fieldset>
        <legend>Please add the details below </legend>
        <p>
            <label for="title">Title (required, at least 2 characters)</label>
            <input id="title" name="title" minlength="2" type="text" required>
        </p>

        <p>
            <label for="desc">Description (required, at least 2 characters)</label>
            <input id="desc" name="desc" minlength="2" type="text" required>
        </p>
        <p>
            <label for="keywords">Keywords (eg:#facebook)(required, at least 2 characters)</label>
            <input id="keywords" name="keywords" minlength="2" type="text" required>
        </p>

        <select id="types" name="types" onchange="myFunction(this)">

            <option value="">Select type</option>

            <option value="2">Add Link</option>
            <option value="0">Upload Image</option>
            <option value="1">Upload Video</option>

        </select><br><br>

        <div id="link" style="display: none">

        <p>
            <label for="url">URL (required)</label>
            <input id="url" type="url" name="url" required>
        </p>

        <p>
            <label for="urlType">Select Url Type :(required)</label>
            <select name="urlType" id="urlType">
                <option value="">Select Url Type...</option>
        <!--        <option value="0">Server Image</option>
                <option value="1">Server Video</option>-->
                <option value="2">YouTube Video</option>
                <option value="3">Vimeo Video</option>
                <option value="4">Facebook Image</option>
                <option value="5">Facebook Video</option>
                <option value="6">Instagram Image</option>
                <option value="7">Instagram Video</option>
                <option value="-1">Other</option>
            </select>
        </p>

        </div>

        <div id="filediv" style="display: none">

            Select file to upload:
            <br><br>
            <input name="file1" type="file" id="fileToUpload"><br><br>

        </div>


        <p>
            <label for="postType"> Select Post Type :(required)</label>
            <select name="postType" id="postType">
                <option value="">Select Post Type...</option>
                <option value="0">Normal</option>
                <option value="1">Featured</option>
                <option value="2">Sponsored</option>
            </select>
        </p>
        <p>
            <label for="category"> Select Category :(required)</label>
            <select name="category" id="category">
                <option value="">Select Category...</option>
            </select>
        </p>
        <p>
            <input type="hidden" name="action_type" id="action_type_id"/>
            <input type="hidden" name="id" id="p_id"/>
<!--            <a href="javascript:void(0);" class="btn btn-warning" onclick="$('#postForm').slideUp();">Cancel</a>
            <a href="javascript:void(0);" class="btn btn-success" onclick="userAction('add')">Add User</a>-->
           <input type="submit" name="submit" id="submit" value="Submit">
        </p>
    </fieldset>

    <div class="result" id="result"></div>


</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/jquery.validate.min.js"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.15.0/additional-methods.min.js"></script>

<script>
    window.onerror = function(error, url, line) {
        controller.sendLog({acc:'error', data:'ERR:'+error+' URL:'+url+' L:'+line});
    };

    $(document).ready(function(){
        getCategories();
/*

        $("#postForm").submit(function(e){
            e.preventDefault();
        });
*/

        $('#postForm').validate({ // initialize the plugin
            rules: {
                title: {
                    required: true,
                    minlength : 2
                },
                url: {
                    required: true
                },
                desc: {
                    required : true,
                    minlength : 2
                },
                keywords : {
                    required : true,
                    minlength : 2
                },
                urlType :
                    {
                        required : true
                    },
                postType :
                    {
                        required : true
                    },
                category :
                    {
                        required : true
                    },
                file1 :
                    {
                        required : true
                    }
            },
            submitHandler: function (form) {


                var url = document.getElementById('urlType').value;

                if(validate_url(document.getElementById('url').value) == 'facebook' && url == 6)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'facebook' && url == 7)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'facebook' && url == 3)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'facebook' && url == 2)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 3)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 2)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 4)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 5)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'vimeo' && url != 3)
                {
                    alert('Please enter valid vimeo video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'youtube' && url != 2)
                {
                    alert('Please enter valid youtube video url or select valid url type.');
                }
                else {


                    userAction('add');

                  /*  var data = new FormData();
                    jQuery.each(jQuery('#file')[0].files, function(i, file) {
                        data.append('file-'+i, file);
                    });

                    $.ajax({
                        type: "POST",
                        url: 'addPost.php',
                        dataType: 'text',
                        data: $('#postForm').serialize(),
                        async: false,
                        cache: false,
                        success: function (result) {
                            //alert(report);
                            $(".result").html(report);
                            $("#postForm").trigger('reset');
                        }
                    });
*/

                    /*             jQuery.ajax({
                                     url: 'addPost.php',
                                    // data: data,
                                     data: $('#postForm').serialize(),
                                     cache: false,
                                     contentType: false,
                                     processData: false,
                                     encctype: "multipart/form-data",
                                     type: 'POST',
                                     success: function(report){
                                         alert(report);
                                        // $(".result").html(report);
                                         $("#postForm").trigger('reset');
                                     }
                                 });*/
                 //   e.preventDefault();
                }
            }
        });

    });

    function getCategories() {

        $.ajax({
            type: "POST",
            url: 'getCategories.php',
            dataType: 'text',
            async: false,
            cache: false,
            success: function (result) {

                $('#category').html(result);
            }
        });

    }


    function userAction(type,id){

    /*    var statusArr = {add:"added",edit:"updated",delete:"deleted"};

*/
        var form = $('#fileUploadForm')[0];

        // Create an FormData object
        var data = new FormData(form);

        if (type == 'add') {

            $('#action_type_id').val(type);
            $('#p_id').val(id);
        }

        $.ajax({
            type: 'POST',
            url: 'addPost.php',
            enctype: 'multipart/form-data',
         //   data : data,
         //   data: $(this).serialize(),
            data: $('#postForm').serialize(),
            cache: false,
            success:function(report){
                // replace data to report

            $(".result").html(report);
            $("#postForm").trigger('reset');
            }
        });
     //   e.preventDefault();

/*
    $("form#data").submit(function(){

        var formData = new FormData($(this)[0]);

        $.ajax({
            url: 'addPost.php',
            type: 'POST',
            data: formData,
            success: function (data) {
                $(".result").html(report);
                $("#postForm").trigger('reset');
            },
            cache: false,
            contentType: false,
            processData: false
        });*/

      /*  var data = new FormData();
        jQuery.each(jQuery('#file')[0].files, function(i, file) {
            data.append('file-'+i, file);
        });


        jQuery.ajax({
            url: 'addPost.php',
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            type: 'POST',
            success: function(report){
                $(".result").html(report);
                $("#postForm").trigger('reset');
            }
        });*/

    }

    function myFunction(obj) {

        var type = obj.value;
        var x = document.getElementById('link');
        var y = document.getElementById('filediv');


        if(type == "2")
        {
            x.style.display = 'block';
            y.style.display = 'none';
        }
        else {
            x.style.display = 'none';
            y.style.display = 'block';
        }

    }

    function validate_url(url)
    {
        if (/^(https?:\/\/)?((w{3}\.)?)facebook.com\/.*/i.test(url))
            return 'facebook';

        if (/^(https?:\/\/)?((w{3}\.)?)facebook.com\/.*/i.test(url))
            return 'facebook';

        if (/^(https?:\/\/)?((w{3}\.)?)instagram.com\/.*/i.test(url))
            return 'instagram';

        if (/^(https?:\/\/)?((w{3}\.)?)vimeo.com\/.*/i.test(url))
            return 'vimeo';

        if (/^(https?:\/\/)?((w{3}\.)?)youtube.com\/.*/i.test(url))
            return 'youtube';

        return 'unknown';
    }

</script>

</body>
</html>

编辑:

   else {
               // userAction('add');

                var data = new FormData();
                jQuery.each(jQuery('#file')[0].files, function(i, file) {
                    data.append('file-'+i, file);
                });
                e.preventDefault();

                jQuery.ajax({
                    url: 'addPost.php',
                   // data: data,
                    data: $('#postForm').serialize(),
                    cache: false,
                    contentType: false,
                    processData: false,
                    encctype: "multipart/form-data",
                    type: 'POST',
                    success: function(report){
                        alert(report);
                       // $(".result").html(report);
                        $("#postForm").trigger('reset');
                    }
                });
             //   e.preventDefault();
            }

这样尝试仍然会重定向到下一页。

addPost.php

    <?php

include 'Database.php';
ini_set('display_errors', 1);
error_reporting(1);
ini_set('error_reporting', E_ALL);
ini_set('post_max_size', '1.8G');
ini_set('upload_max_filesize', '1.8G');


if(isset($_POST['submit']))
{

         $database = new Database(Constants::DBHOST, Constants::DBUSER, Constants::DBPASS, Constants::DBNAME);
        $dbConnection = $database->getDB();
        $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $dbConnection->prepare("insert into keywords(keyword) 
                                    values(?)");
        $stmt->execute(array($_POST['keywords']));

        $file_result = "";

        if(strcmp($_POST['types'],"2") == 0)
        {

            //insert data into posts table
            $stmt = $dbConnection->prepare("insert into posts(category_id,title,url,url_type,description,keywords,post_type) 
                                    values(?,?,?,?,?,?,?)");
            $stmt->execute(array($_POST['category'], $_POST['title'], $_POST['url'], $_POST['urlType'], $_POST['desc'], $_POST['keywords'],$_POST['postType']));

            $count = $stmt->rowCount();

            if ($count > 0) {

                echo "Post submitted.";
            } else {

                echo "Could not submit post.";
            }


        }
      else {

                if (isset($_FILES["file1"]["name"])) {

                    $file_result = "";

                    if ($_FILES["file1"]["error"] > 0) {
                        $file_result .= "No file uploaded or invalid file.";
                        $file_result .= "Error code : " . $_FILES["file1"]["error"] . "<br>";
                    } else {

                        if (strcmp($_POST['types'], "0") == 0) {
                          //  $target_dir = "./agtvapp/images/";
                            $target_dir = "images/";
                        } else {
                           // $target_dir = "./agtvapp/videos/";
                            $target_dir = "videos/";
                        }

                        $newfilename = preg_replace('/\s+/', '',
                            $_FILES["file1"]["name"]);
                        $target_file = $target_dir . basename($newfilename);

                     /*   $target_file = $target_dir . basename($_FILES["file1"]["name"]);*/

                        $file_result .=
                            "Upload " . $_FILES["file1"]["name"] . "<br>" .
                            "type " . $_FILES["file1"]["type"] . "<br>" .
                            "temp file " . $_FILES["file1"]["tmp_name"] . "<br>";

                        if (move_uploaded_file($_FILES["file1"]["tmp_name"], $target_file)) {

                            $stmt = $dbConnection->prepare("insert into posts(category_id,title,url,url_type,description,keywords,post_type) 
                                    values(?,?,?,?,?,?,?)");
                            $stmt->execute(array($_POST['category'], $_POST['title'], $newfilename, $_POST['types'], $_POST['desc'], $_POST['keywords'], $_POST['postType']));

                            $count = $stmt->rowCount();

                            if ($count > 0) {

                                echo "The file " . basename($_FILES['file1']['name']) . " has been uploaded, and post submitted.";

                            } else {

                                echo "Could not submit post.";
                            }

                        }
                    }

                }
                else{

                    echo 'empty file';
                }
            }

}
?>

这里我不明白,如果我写数据:$('#postForm').serialize(),在 ajax 的 userAction 函数中发送表单然后我得到 $_FILES 数组为空,但如果我写相同的代码我直接在 validate 函数的 else 部分做,然后文件数组不是空的,文件被成功上传,但它重定向到下一页。并且从 userAction 函数它不会重定向到下一页,但我得到 $_FILES 数组为空,因此无法上传文件。

请问,有人可以帮忙吗?我是 Web 开发的初学者,所以没有办法做到这一点。谢谢。

【问题讨论】:

  • 您需要将 preventDefault 调用移至函数的开头。并且它需要在 DOM 中引用表单对象。
  • 您是否尝试过在开头使用preventDefault 以便 jQuery 不会将表单处理到提及的操作 URL ?
  • $("#postForm").submit(function(e){ e.preventDefault(); });在调用 getCategories() 之后,我在 document.ready 函数中尝试了这个。但是它根本不提交, addPost.php 不被调用。 @OldPadawan
  • $("#postForm").submit(function(e){ e.preventDefault(); });在调用 getCategories() 之后,我在 document.ready 函数中尝试了这个。但是它根本不提交, addPost.php 不被调用。 @SloanThrasher
  • 编辑您的问题。不要在 cmets 中发布代码。

标签: javascript php jquery ajax file


【解决方案1】:

单独运行这个文件

index.php

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Post</title>
</head>
<body>

<form class="postForm" id="postForm" method="post" action="addPost.php" enctype="multipart/form-data">

    <fieldset>
        <legend>Please add the details below </legend>
        <p>
            <label for="title">Title (required, at least 2 characters)</label>
            <input id="title" name="title" minlength="2" type="text" required>
        </p>

        <p>
            <label for="desc">Description (required, at least 2 characters)</label>
            <input id="desc" name="desc" minlength="2" type="text" required>
        </p>
        <p>
            <label for="keywords">Keywords (eg:#facebook)(required, at least 2 characters)</label>
            <input id="keywords" name="keywords" minlength="2" type="text" required>
        </p>

        <select id="types" name="types" onchange="myFunction(this)">

            <option value="">Select type</option>

            <option value="2">Add Link</option>
            <option value="0">Upload Image</option>
            <option value="1">Upload Video</option>

        </select><br><br>

        <div id="link" style="display: none">

        <p>
            <label for="url">URL (required)</label>
            <input id="url" type="url" name="url" required>
        </p>

        <p>
            <label for="urlType">Select Url Type :(required)</label>
            <select name="urlType" id="urlType">
                <option value="">Select Url Type...</option>
        <!--        <option value="0">Server Image</option>
                <option value="1">Server Video</option>-->
                <option value="2">YouTube Video</option>
                <option value="3">Vimeo Video</option>
                <option value="4">Facebook Image</option>
                <option value="5">Facebook Video</option>
                <option value="6">Instagram Image</option>
                <option value="7">Instagram Video</option>
                <option value="-1">Other</option>
            </select>
        </p>

        </div>

        <div id="filediv" style="display: none">

            Select file to upload:
            <br><br>
            <input name="file1" type="file" id="fileToUpload"><br><br>

        </div>


        <p>
            <label for="postType"> Select Post Type :(required)</label>
            <select name="postType" id="postType">
                <option value="">Select Post Type...</option>
                <option value="0">Normal</option>
                <option value="1">Featured</option>
                <option value="2">Sponsored</option>
            </select>
        </p>
        <p>
            <label for="category"> Select Category :(required)</label>
            <select name="category" id="category">
                <option value="s">Select Category...</option>
            </select>
        </p>
        <p>
            <input type="hidden" name="action_type" id="action_type_id"/>
            <input type="hidden" name="id" id="p_id"/>
<!--            <a href="javascript:void(0);" class="btn btn-warning" onclick="$('#postForm').slideUp();">Cancel</a>
            <a href="javascript:void(0);" class="btn btn-success" onclick="userAction('add')">Add User</a>-->
           <input type="submit" name="submit" id="submit" value="Submit">
        </p>
    </fieldset>

    <div class="result" id="result"></div>


</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/jquery.validate.min.js"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.15.0/additional-methods.min.js"></script>

<script>
    window.onerror = function(error, url, line) {
        controller.sendLog({acc:'error', data:'ERR:'+error+' URL:'+url+' L:'+line});
    };

    $(document).ready(function(){
        getCategories();
/*

        $("#postForm").submit(function(e){
            e.preventDefault();
        });
*/

        $('#postForm').validate({ // initialize the plugin
            rules: {
                title: {
                    required: true,
                    minlength : 2
                },
                url: {
                    required: true
                },
                desc: {
                    required : true,
                    minlength : 2
                },
                keywords : {
                    required : true,
                    minlength : 2
                },
                urlType :
                    {
                        required : true
                    },
                postType :
                    {
                        required : true
                    },
                category :
                    {
                        required : true
                    },
                file1 :
                    {
                        required : true
                    }
            },
            submitHandler: function (form) {


                var url = document.getElementById('urlType').value;

                if(validate_url(document.getElementById('url').value) == 'facebook' && url == 6)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'facebook' && url == 7)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'facebook' && url == 3)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'facebook' && url == 2)
                {
                    alert('Please enter valid facebook image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 3)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 2)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 4)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'instagram' && url == 5)
                {
                    alert('Please enter valid instagram image,video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'vimeo' && url != 3)
                {
                    alert('Please enter valid vimeo video url or select valid url type.');
                }
                else if(validate_url(document.getElementById('url').value) == 'youtube' && url != 2)
                {
                    alert('Please enter valid youtube video url or select valid url type.');
                }
                else {


                    userAction('add');

                  /*  var data = new FormData();
                    jQuery.each(jQuery('#file')[0].files, function(i, file) {
                        data.append('file-'+i, file);
                    });

                    $.ajax({
                        type: "POST",
                        url: 'addPost.php',
                        dataType: 'text',
                        data: $('#postForm').serialize(),
                        async: false,
                        cache: false,
                        success: function (result) {
                            //alert(report);
                            $(".result").html(report);
                            $("#postForm").trigger('reset');
                        }
                    });
*/

                    /*             jQuery.ajax({
                                     url: 'addPost.php',
                                    // data: data,
                                     data: $('#postForm').serialize(),
                                     cache: false,
                                     contentType: false,
                                     processData: false,
                                     encctype: "multipart/form-data",
                                     type: 'POST',
                                     success: function(report){
                                         alert(report);
                                        // $(".result").html(report);
                                         $("#postForm").trigger('reset');
                                     }
                                 });*/
                 //   e.preventDefault();
                }
            }
        });

    });

    function getCategories() {

        $.ajax({
            type: "POST",
            url: 'getCategories.php',
            dataType: 'text',
            async: false,
            cache: false,
            success: function (result) {

                $('#category').html(result);
            }
        });

    }


    function userAction(type,id){

    /*    var statusArr = {add:"added",edit:"updated",delete:"deleted"};

*/


        var form = $('#postForm')[0];

        // Create an FormData object
        var data = new FormData(form);

        if (type == 'add') {

            $('#action_type_id').val(type);
            $('#p_id').val(id);
        }

        $.ajax({
            type: 'POST',
            url: 'add.php',
            processData: false,
            contentType: false,
            data : data,
            success:function(report){
                // replace data to report

            $(".result").html(report);
            $("#postForm").trigger('reset');
            }
        });
     //   e.preventDefault();

/*
    $("form#data").submit(function(){

        var formData = new FormData($(this)[0]);

        $.ajax({
            url: 'addPost.php',
            type: 'POST',
            data: formData,
            success: function (data) {
                $(".result").html(report);
                $("#postForm").trigger('reset');
            },
            cache: false,
            contentType: false,
            processData: false
        });*/

      /*  var data = new FormData();
        jQuery.each(jQuery('#file')[0].files, function(i, file) {
            data.append('file-'+i, file);
        });


        jQuery.ajax({
            url: 'addPost.php',
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            type: 'POST',
            success: function(report){
                $(".result").html(report);
                $("#postForm").trigger('reset');
            }
        });*/

    }

    function myFunction(obj) {

        var type = obj.value;
        var x = document.getElementById('link');
        var y = document.getElementById('filediv');


        if(type == "2")
        {
            x.style.display = 'block';
            y.style.display = 'none';
        }
        else {
            x.style.display = 'none';
            y.style.display = 'block';
        }

    }

    function validate_url(url)
    {
        if (/^(https?:\/\/)?((w{3}\.)?)facebook.com\/.*/i.test(url))
            return 'facebook';

        if (/^(https?:\/\/)?((w{3}\.)?)facebook.com\/.*/i.test(url))
            return 'facebook';

        if (/^(https?:\/\/)?((w{3}\.)?)instagram.com\/.*/i.test(url))
            return 'instagram';

        if (/^(https?:\/\/)?((w{3}\.)?)vimeo.com\/.*/i.test(url))
            return 'vimeo';

        if (/^(https?:\/\/)?((w{3}\.)?)youtube.com\/.*/i.test(url))
            return 'youtube';

        return 'unknown';
    }

</script>

</body>
</html>

添加.php

<?php

echo "<pre>"; print_r($_FILES); 
exit();


 ?>

【讨论】:

  • 为了在 jquery 中使用 formdata,您必须设置正确的选项 processData: false, contentType: false,
  • 不工作,点击提交没有任何反应。你发送数据两次?还有效吗? @大雄
  • 它只是清除了提交的onClick表单,我在addPost.php中添加了print $files,它也没有打印,发布链接工作正常,但不适用于文件上传。 @大雄
  • w8 我把我的作品发布出来了,你可以看看它是否正常
  • 问题在于您的 ajax 部分要在 jquery 中使用 formdata,您必须设置选项 processData: false, contentType: false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2023-03-20
  • 2015-08-14
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多