【问题标题】:Problems with jquery ajax search form div displayjquery ajax搜索表单div显示的问题
【发布时间】:2020-11-13 22:09:23
【问题描述】:

我正在构建一个具有下拉菜单的搜索表单。当您在下拉菜单中选择一个项目时,它会使用 ajax 调用另一个 php 文件,并返回标签以调整下拉列表和搜索文本框字段的大小。另一个 jquery ajax 使用输入事件进行调用,以在另一个 DIV 列表中显示搜索结果项,该列表显示在搜索 txt 框下方。当您使用其中任何一个时,这一切都很好,但它们都只在第一次工作。如果您在下拉列表中选择一个项目,它会调整大小,但搜索 txt 下拉列表和下拉列表调整大小将不再起作用,除非您刷新浏览器。如果您输入 search txt,它会执行良好并在 txt 框下显示下拉 div 标签。使用按键的搜索 txt 输入每次都有效,但是当我调用调整下拉列表的大小时,一切都会停止工作。我尝试了许多不同的方法,但没有任何方法可以解决此问题。我是 jquery 的新手,因此不胜感激。一个代码块调用调整下拉列表的大小,如果在下拉列表中选择了不同的项目,一个代码块调用更改搜索 txt div 标签结果,另一块代码刷新每个按键的 div 标签结果搜索文本框。我尝试了 document.ready 和许多其他方法,但似乎没有任何效果。

Here is a link to the test search form

//Code block #1 resizes the drop down list and search txt box when new //item is selected in the drop down list

$('#TESTsearchtxtboxdepartmentslist').on('input', function () {


    $.ajax({    //create an ajax request to ajax.php
        type: "GET",
        url: "../test/TESTajx.php?class=classTESTTopBar&func=funcTESTCreateSearchDeptList&wif=1&depID=" + $("#TESTsearchtxtboxdeplist").val(),
        dataType: "html", 
        success: function (response) {
            $("#TESTidsearchproductsform").html(response); 


        }


    });


});



//Code block #2 changes search results in DIV tag when a different item //is selected in the drop down list


    $('#TESTsearchtxtboxdepartmentslist').on('change', function () {


          $.ajax({    //create an ajax request to ajax.php
              type: "GET",
              url: "../test/TESTajx.php?class=classTESTTopBar&func=funcTESTSearchTxtInput&SearchTxtString=" + $("#TESTsearchtxtbox").val() + "&sdepID=" + $("#TESTsearchtxtboxdeptlist").val(),
              dataType: "html",
              success: function (response) {


                  if (response.trim() == '') {

                      $("#TESTsearchtxtboxlistcontent").hide();

                  } else {

                      $("#TESTsearchtxtboxlistcontent").html(response); 

                      $("#TESTsearchtxtboxlistcontent").show();
                  }

              }

          });

    });


//Code block #3 displays DIV tag under the search txt box every time a //new key is entered or removed

    $('#TESTsearchtxtbox').on('input', function () {


        $.ajax({    //create an ajax request to ajax.php
            type: "GET",
            url: "../test/TESTajx.php?class=classTESTTopBar&func=funcTESTSearchTxtInput&TESTSearchTxtString=" + $(this).val() + "&DEPID=" + $("#TESTsearchtxtboxdeptlist").val(),
            dataType: "html", 
            success: function (response) {


                if (response.trim() == '') {

                    $("#TESTsearchtxtboxlistcontent").hide(); 


                } else {

                    $("#TESTsearchtxtboxlistcontent").html(response);

                    $("#TESTsearchtxtboxlistcontent").show();
                }


            }

        });

    });

]1

【问题讨论】:

    标签: php html jquery ajax forms


    【解决方案1】:

    问题很可能是因为您将 html 内容替换为来自 ajax 调用的响应。例如,查看下拉列表,您在“#TESTsearchtxtboxdepartmentslist”上设置了一个“输入”事件。一旦触发该事件,您的代码将替换“#TESTidsearchproductsform”中的所有 html,其中包括下拉列表本身。如此有效,您现在在页面上有一个 new 下拉菜单,没有附加任何事件。

    您想使用 jQuery 查看事件委托:https://learn.jquery.com/events/event-delegation/

    你可以这样做:

    $("#TESTidsearchproductsform").on('input', '#TESTsearchtxtboxdepartmentslist', function(){
    ...
    });
    

    这样,事件仍然附加到“#TESTidsearchproductsform”,并将应用于可能在页面上创建的任何新的“#TESTsearchtxtboxdepartmentslist”。


    更新以下评论

    还有很多其他的编码方式,所以我根据你已经拥有的代码和我能理解的内容来回答:

    1. 保留以$("#TESTidsearchproductsform").on('input', '#TESTsearchtxtboxdepartmentslist', function () { 开头的代码即可,没关系
    2. 更改以$('#TESTsearchtxtboxdepartmentslist').on('change', function () { 开头的代码,以便将其委托给表单,即$("#TESTidsearchproductsform").on('change', '#TESTsearchtxtboxdepartmentslist', function () {
    3. 更改以$('#TESTsearchtxtbox').on('input', function () { 开头的代码,使其也被委托给表单,即$("#TESTidsearchproductsform").on('input', '#TESTsearchtxtbox', function () {
    4. 移动 div#TESTsearchtxtboxlistcontent 使其位于原始 html 中的 form 标记之外,以免被 ajax 结果覆盖

    【讨论】:

    • 非常感谢您提供的信息。你说的很有道理。我使用您的示例对其进行了更改,它使我的下拉列表完美运行,但我的搜索 txt 输入字段仍不会显示 div 下拉搜索结果。我尝试了一些不同的东西,但仍然无法让那部分工作。我会更详细地研究它,但我可能不得不改变我的 php 返回 html 标签的方式。 php返回的是下拉列表、搜索txt框和搜索结果列表项,而不是显示搜索结果的DIV标签。
    • 它应该不需要返回 DIV。我刚刚查看了代码,您的“#TESTsearchtxtbox”仍然直接附加输入事件,而不是像您的下拉菜单一样委托。如果它被 html 取代,那么您也必须委托该事件。
    • 顺便说一下,如果您的搜索结果 DIV 被返回的 html 替换,则将其移出表单。您的 CSS 绝对定位它,因此它在页面上的位置并不重要。这样 ajax 就不需要每次都返回它。
    • 所有响应都在一个 ajax 调用中返回。我尝试这样做... $("#TESTidsearchproductsform").on('input', '#TESTsearchtxtboxdepartmentslist', '#TESTsearchtxtbox', function ()。我的问题是如何编码它以使其返回为TESTsearchtxtboxdepartmentslist 和 TESTsearchtxtbox?
    • 我已经更新了我的答案。看来,您的每个事件都做了不同的事情,所以我不认为像您在评论中建议的那样将它们组合起来会奏效。希望我更新的答案会有所帮助。顺便说一句,委托事件的第二个参数是一个普通的 jQuery 选择器,所以如果你了解 jQuery 选择器,你就会明白为什么你尝试的没有达到你的预期。参数 3 必须是回调函数。无论如何,请查看我的更新答案,如果有帮助,请告诉我。
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多