2009-09-15 55 views
1

我如何用這個函數做8次循環?循環8次

只有改變要被執行的固定次數都十分For循環完成了varñ

$(document).ready(function(){ 
    var n=2;         
    $forms = $('#form'+n); 
    $('#toogle'+n).hide(); 
    $('#hide'+n).hide(); 

$('a').bind('click', function(){ 
     switch(this.id){ 
      case 'c'+n: 
       $('#change'+n).hide(); 
       $('#phone'+n).hide(); 
       $('#hide'+n).show(); 
       $('#toogle'+n).show(); 
       return false; 
       break; 
      case 'd'+n: 
       $('#change'+n).show(); 
       $('#phone'+n).show(); 
       $('#hide'+n).hide(); 
       $('#toogle'+n).hide(); 
       return false; 
       break; 
     } 
    }) 

    $forms.bind('submit', function(){ 
     var $button = $('button',this).attr('disabled',true); 
     var params = $(this.elements).serialize(); 

     var self = this; 
     $.ajax({ 
      type: 'POST', 
      url: this.action, 
      data: params, 

     beforeSend: function(){ 
       $('#phone'+n).show(); 
       $('#hide'+n).hide(); 

       $('#phone'+n).html("Loading..."); 
      }, 
      success: function(txt){ 

       $('#top'+n).show(); 
       $('#cadastro'+n).hide (); 
       $('#hide'+n).hide (); 
       $('#toogle'+n).hide(); 
       $('#change'+n).show(); 

       $button.attr('disabled',false); 

       $('#phone'+n).html(txt); 

       self.reset(); 
      }, 

      error: function(txt){ 
       $('#phone'+n).html(txt); 
      } 
     }) 
     return false; 
    }); 

}); 
+0

非常感謝SLaks,你可以在代碼中展示這個,這是一個嘗試但沒有的工作。 – Mango 2009-09-15 03:44:34

+0

我只想評論一下,你不應該只在你的ID - > switch(this.id)中使用數字,也許可以把數字放到rel標籤中。 – Mottie 2009-09-15 05:45:18

回答

0

這是一個完整的代碼示例,它包含了我的兩個答案。

function handleForm(n) { 
    $forms = $('#form'+n); 
    $('#toogle'+n).hide(); 
    $('#hide'+n).hide(); 

    $('a#c' + n).click(function() { 
     $('#change'+n).hide(); 
     $('#phone'+n).hide(); 
     $('#hide'+n).show(); 
     $('#toogle'+n).show(); 

     return false; 
    }); 
    $('a#d' + n).click(function() { 
     $('#change'+n).show(); 
     $('#phone'+n).show(); 
     $('#hide'+n).hide(); 
     $('#toogle'+n).hide(); 

     return false; 
    }); 



    $forms.bind('submit', function(){ 
     var $button = $('button',this).attr('disabled',true); 
     var params = $(this.elements).serialize(); 

     var self = this; 
     $.ajax({ 
      type: 'POST', 
      url: this.action, 
      data: params, 

      beforeSend: function(){ 
       $('#phone'+n).show(); 
       $('#hide'+n).hide(); 

       $('#phone'+n).html("Loading..."); 
      }, 
      success: function(txt){ 

       $('#top'+n).show(); 
       $('#cadastro'+n).hide (); 
       $('#hide'+n).hide  (); 
       $('#toogle'+n).hide(); 
       $('#change'+n).show(); 

       $button.attr('disabled',false); 

       $('#phone'+n).html(txt); 

       self.reset(); 
      }, 

      error: function(txt){ 
       $('#phone'+n).html(txt); 
      } 
     }); 
     return false; 
    }); 
} 

for (n = 2; n < 10; n++) { 
    handleForm(n); 
} 
+1

謝謝大家,我從這個問題中學到了很多東西 – Mango 2009-09-15 13:18:15

0

循環。 W3C for loop reference

這將是這個樣子......

for (n = 2; n < 10; n++) { 
    // your code with 'n' in it here... 
} 
+0

請更正:此循環將執行九次。 – 2009-09-15 02:08:53

+0

錯誤。這將在所有處理程序中使用相同的值'n'(11)。看到我的答案。 – SLaks 2009-09-15 02:10:47

-1
$(document).ready(function(){ 
    var n = 2; 
    for(n = 2; n < 11; n++) {               
    $forms = $('#form'+n); 
    $('#toogle'+n).hide(); 
    $('#hide'+n).hide(); 

$('a').bind('click', function(){ 
     switch(this.id){ 
      case 'c'+n: 
         $('#change'+n).hide(); 
         $('#phone'+n).hide(); 
         $('#hide'+n).show(); 
       $('#toogle'+n).show(); 
       return false; 
       break; 
       case 'd'+n: 
         $('#change'+n).show(); 
         $('#phone'+n).show(); 
         $('#hide'+n).hide(); 
       $('#toogle'+n).hide(); 
       return false; 
       break; 
     } 
    }) 

    $forms.bind('submit', function(){ 
     var $button = $('button',this).attr('disabled',true); 
     var params = $(this.elements).serialize(); 

     var self = this; 
     $.ajax({ 
      type: 'POST', 
      url: this.action, 
      data: params, 

     beforeSend: function(){ 
       $('#phone'+n).show(); 
         $('#hide'+n).hide(); 

       $('#phone'+n).html("Loading..."); 
      }, 
      success: function(txt){ 

         $('#top'+n).show(); 
       $('#cadastro'+n).hide (); 
         $('#hide'+n).hide  (); 
         $('#toogle'+n).hide(); 
         $('#change'+n).show(); 

         $button.attr('disabled',false); 

       $('#phone'+n).html(txt); 

       self.reset(); 
      }, 

      error: function(txt){ 
       $('#phone'+n).html(txt); 
      } 
     }) 
     return false; 
    }); 
    } 
}); 

將要走的最簡單的方法,但其實我建議將所有的元素到DOM中一個for循環,並使用選擇器來處理其餘的代碼。

+0

錯了。這將在所有處理程序中使用相同的值'n'(12)。看到我的答案。 – SLaks 2009-09-15 02:10:14

+0

11,而不是12. – SLaks 2009-09-15 02:11:17

+0

如果您在第一條評論中發現錯誤,我該如何投票給您。 :P – Anthony 2009-09-15 02:12:52

2

將您的代碼移動到一個單獨的函數,該函數將n作爲參數,然後在循環中調用該函數。

您可能遇到的問題是嵌套函數在每次定義時都使用相同的n。因此,n將在所有的處理程序中爲8。通過將嵌套函數移動到單獨的函數中,可以爲每個函數創建一個不同的閉包,從而解決問題。

有關更詳細的解釋,請參見this answer

+0

不會在原始循環之外聲明'n'來解決這個問題嗎? js中的函數不處理全局變量而沒有將它們明確地傳遞給函數? – Anthony 2009-09-15 02:18:36

+0

這不會有幫助 - 你仍然只有1個「n」被所有8個處理程序共享。 – SLaks 2009-09-15 02:20:29

+0

我剛剛寫了一個非常簡單的腳本來看看你在看什麼,並且我仍然看到我期望的,這是每個函數都在每個循環中獲取n的新值。這對處理程序是如何獨特的,或者他是如何嵌套這些功能的?你是說每個函數只從所有的循環中調用一次,因此只有一次被傳遞給它? – Anthony 2009-09-15 02:30:17

0

你有沒有想過爲什麼你需要一個循環?也許不是使用id選擇器,你可以使用類選擇器一次選擇一組元素。

<div id="div1" class="thumbnail"></div> 
<div id="div2" class="thumbnail"></div> 
<div id="div3" class="thumbnail"></div> 

jQuery(".thumbnail").doStuff(); //will apply for all 3 divs. 
0

順便說一句,而不是增加8個單擊處理文檔中的每一個環節,你可以做這樣的事情:

$('a#c' + n).click(function() { 
    $('#change'+n).hide(); 
    $('#phone'+n).hide(); 
    $('#hide'+n).show(); 
    $('#toogle'+n).show(); 

    return false; 
}); 
$('a#d' + n).click(function() { 
    $('#change'+n).show(); 
    $('#phone'+n).show(); 
    $('#hide'+n).hide(); 
    $('#toogle'+n).hide(); 

    return false; 
}); 

此外,您還拼錯toggle