【问题标题】:Ajax not populatig dropdown if selected to fast如果选择快速,Ajax 不会填充下拉列表
【发布时间】:2015-12-04 06:12:06
【问题描述】:

我正在尝试创建一个带有两个下拉列表的过滤器,一个带有节目,另一个带有它们的位置。当在第一个下拉列表中选择一个节目时,第二个下拉列表中的位置列表将被修改为仅包含播放该特定节目的位置。现在我遇到的问题是,如果用户在选择节目后快速单击位置下拉菜单,它有时只会在用户做出选择修改列表并因此删除他们的选择后更新(这经常发生在边缘)。有没有办法更快地更新位置下拉列表中的列表?或者至少强制它更新,即使它被选中?

这是我正在使用的 JavaScript,它使用了我在 Wordpress 中添加到 functions.php 中的“example_ajax_request”函数,您可以在脚本下方看到它。

 $('#select_show').change( function(){
        var show = $("#select_show :selected").text();

        $.ajax({
            type: "post",
            url: ajaxurl,
            data: {
                'action':'example_ajax_request',
                'show' : show
            },
            dataType:"json",
            success:function(data) {
                console.log("what is happening al of a sudden");
                console.log(data);
                $('#province').children('option').remove();

                for(var i = 0; i < data.length; i++)
                {
                    if( data[i] == 'Choose a province')
                        var value = "all";
                    else
                        var value = data[i];

                    $('#province').append( $("<option value=" + value +"></option>").text(data[i]) );
                }

            },
            error: function(errorThrown){
                console.log(errorThrown);
            }
        });

    });

我的函数获取位置(省)列表

 function example_ajax_request() {

    $arrayList = array();
    $arrayList[] = "Choose a province";

    $selected = $_POST['show'];

    if( $selected == "Choose a show" )
        $selected = "";

    $arg = array(
        'posts_per_page' => -1,
        'post_type' => 'address',
        'meta_key' => 'show',
        'meta_value' => $selected,
    );

    $the_query = new WP_Query( $arg );

    if( $the_query->have_posts() )
    {
        while ( $the_query->have_posts() )
        {
            $the_query->the_post();
            $arrayList = get_option_list('province', $arrayList);
        }
    }
    print json_encode($arrayList);
    wp_reset_query();

    die();
    }

    add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );
    add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

这些是下拉菜单及其查询

    <?php
     $arg = array(

    'post_type' => 'address',
    'posts_per_page' => -1,
    'meta_key' => 'show',
    'meta_value' => ''
     );

     $the_query = new WP_Query( $arg );

     $showlist = array();

     if( $the_query->have_posts() )
     {
     while ( $the_query->have_posts() )
     {
        $the_query->the_post();
        $showlist = get_option_list('show', $showlist);
     }
     }


     $arg = array(


    'post_type' => 'address',
    'posts_per_page' => -1,
    'meta_key' => 'show',
    'meta_value' => '',
     );

     $the_query = new WP_Query( $arg );

     $provincelist = array();

     if( $the_query->have_posts() )
     {
     while ( $the_query->have_posts() )
    {
        $the_query->the_post();
        $provincelist = get_option_list('province', $provincelist);
    }
    }

    ?>

    <div class="block-go-to">
    <form action="reserve-tickets" method="get">
      <select id="select_show" name="show">
          <option value="all">Choose a show</option>
            <?php
                foreach($showlist as $show)
                {
                    ?>
                    <option value="<?php echo $show; ?>">
                        <?php echo $show; ?>
                    </option>
                <?php
                }
            ?>
        </select>

        <select id="province" name="province">
            <option value="all">Choose a province</option>
            <?php
            foreach($provincelist as $province)
            {
                ?>
                <option value="<?php echo $province; ?>">
                    <?php echo $province; ?>
                </option>
            <?php
            }
            ?>
        </select>

        <button id="show_map" class="cta right">Show map</button>
    </form>
</div>

<?php
session_start();
if(isset($_POST['province']))
    $_SESSION['province'] = $_POST['province'];
?>

【问题讨论】:

  • 您可以通过在获取位置时禁用下拉菜单来解决该问题
  • 如果用户在 ajax 请求响应之前选择快速的位置,则不可能不费力地维护用户的选择。您可以做的是禁用位置下拉菜单,直到它更新,然后再次启用它以允许用户选择。

标签: javascript php jquery ajax wordpress


【解决方案1】:

在您输入 #select_show 选择的更改事件时添加它

$('#province').attr('disabled', true);

这将禁用选择,这意味着用户将无法手动单击它(这对 javascript hacks 是开放的)。 然后,当您确定已获取所有位置时,只需将其转回 false

$('#province').attr('disabled', false);

这当然会重新启用输入以让用户使用它。

请注意,可能有很多其他方法可以解决这个问题,但这种方法只是我想到的第一个方法!

【讨论】:

  • 这也是我会做的,尽管我建议只是为了清楚起见,在你的答案中添加它的作用以及它如何解决问题。
  • 谢谢,这就是我所做的。虽然我必须使用 .prop 才能让它工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多