【问题标题】:javascript function to parse multiple forms on same pagejavascript函数解析同一页面上的多个表单
【发布时间】:2014-07-19 18:47:34
【问题描述】:

我有一个包含两个选项卡的页面,每个选项卡都包含一个表单。表单以相同的方式解析,只是它们被用于不同的 URL/API。

我想使用相同的函数来解析表单,而不是重复相同的函数,所以我在 URL 中获取哈希以获取选项卡编号,然后将其添加到 jquery 目标,请参见下面的代码:

$(document).ready(function () {
$('#tab-container').easytabs();

var tab = '#tab1'; // when index loaded, there is no hash, so I set tab to be #tab1 by default

window.onhashchange= function() {
   tab = window.location.hash;
   console.log(tab);
};


$(tab + ' form').submit(function(e) {
    e.preventDefault(); // Prevents the page from refreshing

    var url = $(this).attr('action')

    $.ajax({
       type: "POST",
       url: url,
       data: $(tab + ' form').serialize(), // serializes the form's elements.
       success: function(data)
       {
           var result = JSON.parse(data);

           // check to see if there are more than one value in the response. values are separated by commas
           if (result.response.indexOf(",") > -1){ 
                var results = result.response.split(", ");

                // show the results to the left of the form if there are any
                $(tab + ' #results').removeClass('hide');

                for (i=0; i < results.length; i++){
                    $(tab + " #list").append('<li>' + results[i] + '</li>');
                }
           }else{
                results = result;
                $(tab + " #list").append('<li>' + results.response + '</li>');
           }


       }
     });

    return false;
});

这似乎不起作用,因为它仅适用于选项卡 1。任何其他选项卡都会对相应的 URL 进行操作,而不是调用该函数。

我希望能够对表单使用相同的功能,但我不确定如何在更改选项卡时针对特定表单。

感谢任何帮助! :)

【问题讨论】:

    标签: javascript jquery ajax json forms


    【解决方案1】:

    做与 event.target 相关的所有事情(这将是提交的表单)

    另外,不要对列表和结果元素使用 ID,它们应该是类。我无法确定,因为我没有 HTML 标记参考。

    http://jsfiddle.net/3HkU6/5/

    function validateForm(event) {
    
        // Prevent the page from refreshing
        event.preventDefault();
    
        var form_el = event.target,
            $form = $(form_el),
            type = $form.attr('method'),
            url = $form.attr('action');
    
         var $results = $form.siblings('.results'),
             $list = $results.find('.list');
    
    
        $.ajax({
           type: type,
           url: url,
           data: $form.serialize(), // serializes the form's elements.
           success: function(data) {
               var results,
                   result = JSON.parse(data);
    
               // check to see if there are more than one value in the response. values are separated by commas
               if (result.response.indexOf(",") > -1){ 
    
                   var results = result.response.split(", ");
    
                    // show the results to the left of the form if there are any
                    $results.removeClass('hide');
    
                    for (i=0; i < results.length; i++){
                        $list.append('<li>' + results[i] + '</li>');
                    }
               } else {
                    results = result;
                    $list.append('<li>' + results.response + '</li>');
               }
    
    
           }
         });
    
    }
    
    
    $('form').each(function() {
    
        this.addEventListener('submit', validateForm);
    
    })
    

    HTML

    <div>
       <form>
       </form>
    
       <div class="results">
           <ol class="list">
           </ol>
       </div>
    </div>
    

    【讨论】:

    • 这太棒了,正是我想要的!非常感谢!一旦我确定它有效,我会将它标记为答案。
    • 这行得通,但是 $list.append 不会将我的结果附加到我的带有列表类的 ol 元素中。不知道我做错了什么,希望我能弄清楚。
    • 我不知道,我看不到标记。
        确实需要是表单的兄弟。
      • @Narutkowski 啊,所以 .list 是 .results 的子级。只需使用 $.find() jquery 方法来选择一个子元素。答案已更新。
      • 谢谢,这正是我所做的。非常感谢您的帮助!
      【解决方案2】:

      只需检查 ID 并做出相应反应

      $('#tab1 form, #tab2 form').submit(){
          if( $(this).is( '#tab1 form') ){
              /* any special form 1 handling */
          }else{
      
          }     
      });
      

      至于结果,只需遍历主选项卡内容元素并在该实例中查看

      /* defined within submit handler and not inside ajax*/
      var $list= $(this).closest('.tabContentClass').find('.listClass');
      

      【讨论】:

      • @charliefl 这几乎就是我想要做的。我对第二部分不熟悉,所以谢谢你!
      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多