使用 jQuery 模拟选择并提交表单,无需选择

Posted

技术标签:

【中文标题】使用 jQuery 模拟选择并提交表单,无需选择【英文标题】:Simulate a select and submit form with jQuery without a select 【发布时间】:2013-07-28 01:43:11 【问题描述】:

为了避免使用 jQuery 插件对select 进行样式化,我使用 html 和 CSS 创建了一个自定义解决方案隐藏了一个 select 和一个表单。

当我点击 fake select 的链接时,它会在 real select 中选择相同的选项值并提交表单。

您是否有避免这种行为并“删除”select 的想法? 是否有可能只有一个表单并仅使用 jQuery 提交像真正的select 这样的信息?

HTML 和 php

<div class="sorter">
    <span class="legend">Sort by</span>
    <form method="post" class="sort">

        <?php
            $orderby = array(
                "date" => "Year",
                "director" => "Director",
                "production" => "Production"
            );
        ?>

        <a href="#" id="order_result"><?= (!empty($_POST["select"])) ? $orderby[$_POST["select"]] : "Year" ?></a>
        <ul>
            <li><a href="#" data-sort="date">Year</a></li>
            <li><a href="#" data-sort="director">Director</a></li>
            <li><a href="#" data-sort="production">Production</a></li>
        </ul>

        <select name="select" id="orderby">
            <?php foreach ($orderby as $k => $v) : ?>
            <option value="<?= $k ?>" <?php selected($_POST["select"], $k, 1) ?>><?= $v ?></option>
            <?php endforeach ?>
        </select>
    </form>
</div>

jQuery

​​>
$(".sorter a").on("click", function(e)
    var text = $(this).text();
    $("#order_result").text(text);
    $(this).closest("form").find($("select option[value=" + $(this).data('sort') + "")).prop("selected", true);
    $(this).closest("form").submit();
    e.preventDefault();
);

【问题讨论】:

“但是有一个隐藏的选择和一个表单。” - 你为什么不使用 &lt;input type="hidden"&gt; 字段并直接从你的伪中单击的项目设置它的值-选择? 为什么不使用插件?您应该永远记住,有些人禁用了 javascript。所以一个好的插件完全不显眼,所以如果你禁用了 javascript,你会看到正常的选择列表。 我没有提交按钮,需要使用javascript提交表单,所以…… 【参考方案1】:

如何从select 列表动态创建ul 列表,然后创建hidden input 并删除select 列表?

<script type="text/javascript">
  $(function() 
    var select  = $("select#orderby").hide(0);
    var ul      = $("<ul />").insertBefore( select );
    var input   = $("<input />","type":"hidden","name":select.attr("name"),"value":select.val()).insertAfter( ul );

    $("option",select).each(function() 
      var val = $(this).val();
      var txt = $(this).text();
      var li  = $("<li />").appendTo( ul ),
          a   = $("<a />","href":"#").on("click", function(event) 
            event.preventDefault();
            input.val( val );
            //select.val( val );
            $(this).parents("form:first").trigger("submit");
          ).html( txt ).appendTo( li );
    );

    select.remove();
  );
</script>

【讨论】:

【参考方案2】:

带有隐藏输入的解决方案(感谢@nnnnnn,我不经常使用它们……)效果很好!

<form method="post" class="sort">
    <input type="hidden" name="sortby" id="sortby">
    <?php
        $orderby = array(
            "date" => "Année",
            "director" => "Réalisateur",
            "production" => "Production"
        );
    ?>
    <a href="#" id="order_result"><?= (!empty($_POST["sortby"])) ? $orderby[$_POST["sortby"]] : "Année" ?></a>
    <ul>
        <?php foreach ($orderby as $k => $v) : ?>
        <li><a href="#" data-sort="<?= $k ?>"><?= $v ?></a></li>
        <?php endforeach ?>
    </ul>
</form>

-

$(".sorter a").on("click", function(e)
    $("#order_result").text($(this).text());
    $(this).closest("form").find("#sortby").val($(this).data("sort"));
    $(this).closest("form").submit();
    e.preventDefault();
);

【讨论】:

以上是关于使用 jQuery 模拟选择并提交表单,无需选择的主要内容,如果未能解决你的问题,请参考以下文章

HTML表单的jQuery验证

jQuery ajax 提交表单并从 datepicker、按钮获取值

使用 jQuery 和 ASP.NET MVC 异步上传文件,无需表单提交和异步

选择多个单选按钮(通过 jquery、javascript?)

在选择更改事件上通过 jquery 提交表单

jquery中怎么选取规定的表单名称