【问题标题】:How do i run a function() once then toogle and make them run simultaneously?我如何运行一个函数()然后togle并让它们同时运行?
【发布时间】:2020-07-15 04:25:04
【问题描述】:

我想问我如何只“drawTable”一次并切换它?我不想每次单击元素时都调用我的 ajax。当我单击 tableA 时,drawTable() 加载时间过长,并且 tableA 的类已经首先切换,因为我的 tableA 的 onclick 上有另一个 toggleSetting() 函数,我如何确保它同时更改?

$("#tableA").on("click", (function () {

                $.ajax({
                    type: "POST",
                    url: "Acc.ashx",
                    success: function (output) {
                        try {
                            output = JSON.parse(output);
                            DrawATable(output);
                        }
                        catch (ex) {
                            alert("error");
                            $('#tableA').empty();
                        }
                    }
                    , complete: function (data) {
                        isClicked = false;

                    }
                }).then($('#tableSAOnce').toggleClass('accordion accordion2'))
            }));
    function toggleSetting(setting, ctrl) {

        var stt = document.getElementById(setting);
        if (stt.style.display == 'none') {
            stt.style.display = '';
            ctrl.className = "accordion2";
        }
        else {
            stt.style.display = 'none';
            ctrl.className = "accordion";
        }           
    }
            <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
                <tr>
                    <td>
                        <table id="tableAOnce" class="accordion" onclick="toggleSetting('toggleA',this)">
                        <tr>
                            <td align="left">TableA</td>
                        </tr>
                        </table>
                    </td>
                </tr>
                <tr style="display:none;" id="toggleA" >
                    <td>
                        <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0" id="tableA"></table>
                    </td>
                </tr>
            </table>


【问题讨论】:

    标签: javascript html jquery asp.net


    【解决方案1】:

    我觉得有点难以理解你到底想做什么,但我想我现在已经理解了。

    我更改了标记的类和 ID 以使 jQuery 代码更简单。如果您现在单击.accordion .accordion-toggler,则data-toggle 的元素将通过切换类hide 可见。每次切换时,代码都会检查表格是否已经有内容。如果没有内容,则调用doAjax 函数。然后你必须改变你的 DrawATable 函数,正如我在新函数 drawTable 中描述的那样。

    希望对你有帮助。

    var $tableToggler = $('#tableToggle');
    
    function onTogglerClick(event) {
      var $triggerElement = $(event.currentTarget);
      var $target = $($triggerElement.data('toggle'));
    
      if ($target.length) {
        $target.closest('.toggle-parent').toggleClass('hide');
    
        // check if indicator for contents exists
        if (!$triggerElement.hasClass('has-contents')) {
          doAjax($target);
        }
      }
    }
    
    function doAjax($target) {
      $.ajax({
        type: "POST",
        url: "Acc.ashx",
        dataType: 'json',
        success: function(output) {
          // you can simply use "dataType: 'json'", so your response is a json object
          // and then you don't need to try to parse the output into json
          drawTable($target, output);
        },
        error: function() {
          $target.empty();
        },
        /* complete: function(data) {
          // do you need this line anymore?
          // isClicked = false;
        } */
      });
    }
    
    function drawTable($target, content) {
      // example start
      var sb = new StringBuilder();
      
      sb.append('<tr><td>' + content[0] + '</td></tr>');
      $target.html(sb.toString());
      // example end
      
      if ($target.children().length) {
        $target.addClass('has-contents');
      }
    }
    
    $tableToggler.on('click', '.accordion-toggler', onTogglerClick);
    .hide {
      display: none;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td>
          <table id="tableToggle" class="accordion">
            <tr>
              <td align="left" class="accordion-toggler" data-toggle="#tableA">TableA</td>
            </tr>
            <tr>
              <td align="left" class="accordion-toggler" data-toggle="#tableB">TableB</td>
            </tr>
          </table>
        </td>
      </tr>
      <tr class="toggle-parent hide">
        <td>
          <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0" id="tableA"></table>
        </td>
      </tr>
      <tr class="toggle-parent hide">
        <td>
          <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0" id="tableB"></table>
        </td>
      </tr>
    </table>

    【讨论】:

    • 谢谢您,先生!抱歉,我无法理解 $target 的工作原理以及 target.length 的作用是什么?如果我有不同的表格和不同的 drawTable 函数,例如 drawTableA、drawTable B 等,该怎么办?我如何确定他们如何切换各自的表格切换?
    • 请检查我上面的答案和问题~很抱歉打扰你
    • @LeeWyncent 您能否将DrawATable 函数的内容添加到您的问题中?然后我可以展示新的drawTable 函数的代码是什么样子的。 $target 是对表格的引用,所以你可以这样做:$target.html('&lt;tr&gt;&lt;td&gt;1st row 1st field&lt;/td&gt;&lt;/tr&gt;);
    • function drawTableA($target, output) { //这里? var 一般 = 输出; var sb = new StringBuilder(); sb.append("
      general[0]
      "); //$('#tableA').empty().html(sb.toString()); $target.html(sb.toString()); if ($target.children().length) { $target.addClass('has-contents'); } } 像这样的?
    • @LeeWyncent 我已经用你的问题编辑了我的答案。你可以在drawTable函数中看到结果。
    【解决方案2】:
            $("#tb1").on("click", function () {
    
                if (($("#tb2 tr").length) > 0) {
                    $("#tb2").toggle();
                }
                else {
                    $.ajax({
                        type: "POST", url: "Test.ashx"
                        , success: function (output) {
                            try {
                                output = JSON.parse(output);
                                DrawTable(output);
                                
                            }
                            catch (ex) {
                                alert("error");
                                $('#tb2').empty();
                                
                            }
                        }
                        , complete: function (data) {
                            $("#tb2").show();
                        }
                    })
                }
            });
    
    
            <table>
                <tr>
                    <td>
                        <table id="tb1">
                            <tr>
                                <td>TableA</td>
                            </tr>
                        </table>
                   </td>
                </tr>
                <tr><td>&nbsp;</td></tr>
                <tr>
                    <td>
                         <table id="tb2"></table>
                    </td>
                </tr>
            </table>
    

    【讨论】:

    • 您应该真正更新您的问题,而不是添加多个答案。不要说“无法工作”,请更明确地说什么不起作用以及您遇到了什么错误。您要求 jQuery(客户端)的解决方案,我给了您一个答案。我现在不能告诉你如何将它包含在你的 VS 项目(服务器端)中。您还包含了两个不同版本的 jQuery,这不可避免地会导致错误。你也有一个无意义的标记,也许你可以在所有问题都解决后编辑它。
    • @UfguFugullu 很抱歉先生,但我通过参考您的代码设法做到了这一点。谢谢你的帮助! :)
    • 很高兴我能帮上忙。请不要忘记标记您对这个问题的回答:)
    • @UfguFugullu 所以我只是将我的做法编辑成这个答案?抱歉,我对这个平台很陌生,我不知道正确的做法
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2011-05-31
    相关资源
    最近更新 更多