【问题标题】:How to prevent after submitting a form to revert back to the previous Tab提交表单后如何防止恢复到上一个​​选项卡
【发布时间】:2013-09-23 20:51:58
【问题描述】:

我有几个选项卡,每次我选择一个选项卡时,都会提交表单,发送一个不同的值(对用户隐藏)。如果我说从 TAB1 到 TAB2,variable99 将获得 2 的值,TAB3 将获得 3 的值等等......我遇到的问题是当我选择 TAB2 时,我不希望页面恢复到 TAB1。这是我的代码:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Submit a Form on Tab Click</title>

<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>


<style type="text/css">
</style>

<script>
$(function() {
$("#Main").tabs();
$('[id^=ui-id-]').click(function(){
var tabId = $(this).attr('id');
var tabNum = tabId.split('-')[2];
$('#form-' + tabNum).submit();
});
});
</script>


</head>

<body>



<div id="Main">
<ul>
<li><a href="#Tab1">Tab1</a></li>
<li><a href="#Tab2">Tab2</a></li>
<li><a href="#Tab3">Tab3</a></li>
<li><a href="#Tab4">Tab4</a></li>
<li><a href="#Tab5">Tab5</a></li>
<li><a href="#Tab6">Tab6</a></li>
</ul>

<form id="form-1" action="Tab_Click_v00.html" method="post">
<input type="hidden" name="Nb_var99" value="1">
</form>   

<form id="form-2" action="Tab_Click_v00.html" method="post">
<input type="hidden" name="Nb_var99" value="2">
</form> 

<form id="form-3" action="Tab_Click_v00.html" method="post">
<input type="hidden" name="Nb_var99" value="3">
</form>

<form id="form-4" action="Tab_Click_v00.html" method="post">
<input type="hidden" name="Nb_var99" value="4">
</form>

<form id="form-5" action="Tab_Click_v00.html" method="post">
<input type="hidden" name="Nb_var99" value="5">
</form>

<form id="form-6" action="Tab_Click_v00.html" method="post">
<input type="hidden" name="Nb_var99" value="6">
</form>

<div id="Tab1">
<p>Tab1</p> 
</div>
<div id="Tab2">
<p>Tab2</p>
</div>
<div id="Tab3">
<p>Tab3</p>
</div>
<div id="Tab4">
<p>Tab4</p>
</div>
<div id="Tab5">
<p>Tab5</p>
</div>
<div id="Tab6">
<p>Tab6</p>
</div>
</div>


</body>
</html>

这是我现在的代码,我删除了一些从那时起就没有的东西:

<!DOCTYPE html>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Submit a Form on Tab Click</title>

<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>


<style type="text/css">
</style>

<script>
$(function() {//Open function
$("#Main").tabs();
$('[id^=ui-id-]').click(function(){ //Open [id^=ui-id-]

       if (tabId == 'ui-id-1')
     {
        doAjax('1');
        }
    else if (tabId == 'ui-id-2') 
     {
      doAjax('2');
     }
    else if (tabId == 'ui-id-3') 
     {
      doAjax('3');
     }
function doAjaxSubmit(formID) { //Open doAjaxSubmin
$.ajax({
    type: "POST",
    url: "Tab_Click_v00.html",
    data: "Nb_var99=" + formID,
})
} //Close doAjaxSubmin
}); //Close [id^=ui-id-]
});//Close function
</script>


</head>

<body>



<div id="Main">
<ul>
<li><a href="#Tab1">Tab1</a></li>
<li><a href="#Tab2">Tab2</a></li>
<li><a href="#Tab3">Tab3</a></li>
<li><a href="#Tab4">Tab4</a></li>
<li><a href="#Tab5">Tab5</a></li>
<li><a href="#Tab6">Tab6</a></li>
</ul>



 <div id="Tab1">
 <p>Tab1</p> 
 </div>
 <div id="Tab2">
 <p>Tab2</p>
 </div>
 <div id="Tab3">
 <p>Tab3</p>
 </div>
 <div id="Tab4">
 <p>Tab4</p>
 </div>
 <div id="Tab5">
 <p>Tab5</p>
 </div>
 <div id="Tab6">
 <p>Tab6</p>
 </div>
 </div>


</body>
</html>

这不起作用。它也杀死了css风格??我会继续努力的。

【问题讨论】:

  • 您介意编辑您的问题并告诉我们一些有关 Nb_var99 数据在到达 Tab_Click_v00.html 时会发生什么情况吗?用户是否需要在那里做一些事情(也就是说,用户甚至需要查看该页面吗?),或者一旦数据(Nb_var99==3、Nb_var99==4 等)到达该 HTML 文件会发生什么?此外,您的服务器是否执行 PHP 或 ASP.NET 或? (如果我们需要添加一些服务器端代码来完成答案?)
  • 另外,在将 Nb_var99 值发布到 Tab_Click_v00.html 之后,您是否要更新当前页面 - 可能会显示成功消息,或者通过显示 Tab_Click 页面发回的数据(对于这个我们需要知道 PHP/ASP.NET 的问题...做起来超级简单,我们只需要知道。)
  • 您好,胡言乱语,Nb_var99 是一个包含在嵌入式网络服务器中的变量(这个网络服务器不这样做,或者至少我不知道它运行 PHP 或 ASP.NET)。据我所知,它运行一个名为 PINK 的软件(由 Netburner 开发)。不幸的是,将值加载到其变量的方法是在表单上执行 post。他们无需提醒用户此操作,另一个嵌入式单元将收集此信息作为参考,以了解用户当前所在的位置。
  • 感谢您的见解 - 真的很有帮助。在这种情况下,我相信 AJAX 是要走的路。不需要.done() 函数(或者,在旧式AJAX 中,不需要success: 函数)。只需使用 AJAX 发布数据,您应该是金子。
  • 如果我使用表单 post 并且 url 是:Tab_Click_v00.html#tab1 并且我执行以下操作:
    那么它应该可以工作吗?

标签: javascript jquery html


【解决方案1】:

对于你想做的事情,根本不需要使用&lt;form&gt;s 和&lt;input&gt;s。

仅基于所单击的选项卡,您可以通过 AJAX 将 1 或 2 或 3 发送到所需的 HTML 页面。

&lt;form&gt; 结构非常适合当您有多个字段并且希望将它们的数据发布到另一个服务器页面进行处理时。但是,在您的情况下,您似乎只想将值发送到另一个页面,然后返回。

这是使用 AJAX 的一种方法:

$(document).ready(function() {
    $( "#Main" ).tabs();

    $('[id^=ui-id-]').click(function() {

        if (tabId == 'ui-id-1') {
            doAjax('1');
        }else if (tabId == 'ui-id-2') {
            doAjax('2');
        }else if (tabId == 'ui-id-3') {
            doAjax('3');
        }

    }); //END ui-id-#.click fn
}); //END document.ready

function doAjaxSubmit(formID) {
    $.ajax({
        type: "POST",
        url: "myphpprocessor.php",
        data: "Nb_var99=" + formID,
    })
    .done(function( recd_from_PHP ) {
        //No need to put ANYTHING in here, but for eg, you can do:

        //AS AN EXAMPLE ONLY, display message sent from server side
        alert("PHP side said: " + recd_from_PHP);

        //AS AN EXAMPLE ONLY, click the third tab...
        $('[id^=ui-id-3]').click();
    });

}

另一种发送表单数据的方法(使用&lt;form&gt;)是在您的页面上创建一个隐藏的&lt;iframe&gt;,其中包含Tab_Click_v00.html 页面——然后发布到该页面。

因为表单的目标已经在&lt;iframe&gt; 中的页面上,所以当前页面不应刷新。因为&lt;iframe&gt; 是隐藏的,所以用户应该看不到任何异常。

【讨论】:

  • 嗨 Gibberish,我对隐藏的
【解决方案2】:

这是一个新的答案,请试试这个。

这个答案也使用 AJAX。我将发布另一个示例,解决您对隐藏 iframe 想法的更多信息的请求。

请注意,当您从一个选项卡单击到另一个选项卡时,用户仍停留在该选项卡上。

只需复制/粘贴到两个文件中:
index.php(或任何您想命名的文件)和
myphpprocessor.php(如果更改此文件的名称,也必须在 AJAX 代码块中更改其名称

index.php(或 mytest.html,或其他)

<html>
<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.1/themes/base/jquery-ui.css" />

    <style>
        #msg{width:30%;height:80px;padding:10px;margin-top:20px;background-color:wheat;}
        .hidden{display:none;}
    </style>

        <script type="text/javascript">
            $(document).ready(function() {

                $( "#Main" ).tabs();

                $('[id^=ui-id-]').click(function() {
                    var tabId = $(this).attr('id');

                    if (tabId == 'ui-id-1') {
                        doAjax('1');
                    }else if (tabId == 'ui-id-2') {
                        doAjax('2');
                    }else if (tabId == 'ui-id-3') {
                        doAjax('3');
                    }else if (tabId == 'ui-id-4') {
                        doAjax('4');
                    }else if (tabId == 'ui-id-5') {
                        doAjax('5');
                    }

                }); //END ui-id-#.click fn
            }); //END document.ready

            function doAjax(formID) {
                $.ajax({
                    type: "POST",
                    url: "myphpprocessor.php",
                    data: "Nb_var99=" + formID,
                })
                .done(function( recd_from_PHP ) {
                    //No need to put ANYTHING in here, but for eg, you can do:
                    //alert('In done fn...');

                    //AS AN EXAMPLE ONLY, display message sent from server side
                    //alert("PHP side said: " + recd_from_PHP);
                    $('#msg').html('<h2>Here is what the PHP side sent:</h2>' + recd_from_PHP);

                    //AS AN EXAMPLE ONLY, click the third tab...
                    //$('[id^=ui-id-3]').click(); //Warning, this will cause endless loop -- but just demonstrating
                });

            }
        </script>
    </head>
<body>

    <div id="Main">
        <ul>
            <li><a href="#Tab1">Tab1</a></li>
            <li><a href="#Tab2">Tab2</a></li>
            <li><a href="#Tab3">Tab3</a></li>
            <li><a href="#Tab4">Tab4</a></li>
            <li><a href="#Tab5">Tab5</a></li>
            <li><a href="#Tab6">Tab6</a></li>
        </ul>

        <form id="form-1" action="Tab_Click_v00.html" method="post">
            <input type="hidden" name="Nb_var99" value="1">
        </form>   

        <form id="form-2" action="Tab_Click_v00.html" method="post">
            <input type="hidden" name="Nb_var99" value="2">
        </form> 

        <form id="form-3" action="Tab_Click_v00.html" method="post">
            <input type="hidden" name="Nb_var99" value="3">
        </form>

        <form id="form-4" action="Tab_Click_v00.html" method="post">
            <input type="hidden" name="Nb_var99" value="4">
        </form>

        <form id="form-5" action="Tab_Click_v00.html" method="post">
            <input type="hidden" name="Nb_var99" value="5">
        </form>

        <form id="form-6" action="Tab_Click_v00.html" method="post">
            <input type="hidden" name="Nb_var99" value="6">
        </form>

        <div id="Tab1">
            <p>Tab1</p> 
        </div>
        <div id="Tab2">
            <p>Tab2</p>
        </div>
        <div id="Tab3">
            <p>Tab3</p>
        </div>
        <div id="Tab4">
            <p>Tab4</p>
        </div>
        <div id="Tab5">
            <p>Tab5</p>
        </div>
        <div id="Tab6">
            <p>Tab6</p>
        </div>
    </div>

    <div id="msg"></div>

</body>
</html>

服务器端:myphpprocessor.php(必须以 .php 结尾)

<?php

    $id = $_POST['Nb_var99'];

    if ($id == 4) {
        $msg = "Return of the Tab Four";
    }else{
        $msg = 'PHP side receieved: ' .$id;
    }

    echo $msg;

与往常一样,请为任何对您有帮助的答案投票,并在满意后选择正确答案关闭问题。

【讨论】:

    【解决方案3】:

    发帖到隐藏的&lt;iframe&gt;

    我自己从来没有这样做过,可以看出它有点棘手。以下是一些讨论如何做到这一点的帖子:

    How do you post to an iframe?
    Hidden iframe submit
    Remember to specify the name= attr
    Post form in an iframe

    您会注意到,这比我之前两个答案中建议的简单提交基本 AJAX 表单要复杂得多。


    我不确定为什么 AJAX 解决方案在您的情况下没有吸引力,但我记得 AJAX 和 PHP 对我来说是未知商品,也许这就是您正在努力解决的问题。

    如果是这样,不要再挣扎了。两者都比您想象的要简单得多。

    对于基本的、免费的、从头开始的 10 分钟 PHP 教程:
    phpAcademy.org
    thenewboston.com


    接下来,这里有一些了解 AJAX 基础的好帖子:

    A simple example

    More complicated example

    Populate dropdown 2 based on selection in dropdown 1


    我的建议是使用 AJAX 解决方案,但我不明白您最终要达到什么目的。 Tab_Click_v00.html 文件将如何处理它收到的数据?

    也许如果您在Tab_Click 方面提供更多关于所需最终结果的信息(作为本文下方的评论),我可以提供更多帮助。

    【讨论】:

    • 对不起,我对这一切都是新手,而且很多事情都只是通过我的知识。我使用 Ajax 从网站收集动态信息。网络服务器制造商的开发人员/构建者以这种方式制作了他/她的软件,我无法控制。我将不得不进入并编写一个全新的软件来改变它的行为方式(我真的不想这样做;耗时+学习曲线)。我有一个嵌入式单元,它使用该信息来检测用户在网站上的位置,然后执行一些操作。
    • 当您尝试按照 AJAX 示例(尤其是第二个示例)中所述发布数据时会发生什么。有联系卖家吗?他们是否同意使用 AJAX 是/不是这样做的方式?直接咨询他们,我相信他们会回答这样的问题。
    • 这是来自供应商的回复:嗯,将加载的页面已在您的表单中定义。如果您更改操作值,那么新页面将加载到您的新操作指向的任何内容。至于提交表单帖子而不刷新,您需要查看 Ajax。位于 forum.embeddedethernet.com 的论坛上有一个示例描述了如何使用 Ajax。 NetBurner 支持
    • This may be the AJAX example 他们所说的。他们使用的是直接的 javascript,没有 jQuery(你仍然可以使用 jQuery,因为 AJAX 是在客户端完成的。服务器端只是将 AJAX 通信视为普通的 POST,就像来自表单一样。jQuery much 更容易,恕我直言)。 Here's another -- 看起来你想在他们的论坛上与 Tod 交谈。
    【解决方案4】:

    鉴于您正在使用jQuery Tabs 控件,您可以使用window.location.hash 并绑定到load 事件(并使用active 选项显示相应的选项卡):

    $(window).load(function(){
      if(window.location.hash){
        $('#main').tabs('option','active',window.location.hash.substring(1));
      }
    });
    

    然后使用somepage.html#tabindex将用户重定向回来

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多