随笔 - 68  文章 - 0 评论 - 10 trackbacks - 0

今天在给Html控件注册事件的时候,发生了奇怪的现象

 

最初的代码,

$(document).ready(function () {

   $("#blog1" ).click(function () { setTab('blog', 1,5) });

   $("#blog2" ).click(function () { setTab('blog', 2,5) });

   $("#blog3" ).click(function () { setTab('blog', 3,5) });
   $("#blog4" ).click(function () { setTab('blog', 4,5) });
      

    function setTab(tab, cursel, n) {
        for (i = 1; i < n; i++) {
            var menu = document.getElementById(tab + i);
            var con = document.getElementById("displayBlog" + i)

            menu.className = i == cursel ? "however" : "";
            con.style.display = i == cursel ? "block" : "none";
        }
    }
});

 

正常工作,可现在的 blog的控件可能是变化的,于是我做了修改

$(document).ready(function () {

    var _blogs= $("#Blogs").find("li[id*='blog']");   
  
    for(i=1 ;i<=_blogs.length;i++)
    {     
        $("#blog" + i).click(function () { setTab('blog', i.toString(), _blogs.length + 1) });        
    }

    function setTab(tab, cursel, n) {
        for (i = 1; i < n; i++) {
            var menu = document.getElementById(tab + i);
            var con = document.getElementById("displayBlog" + i)

            menu.className = i == cursel ? "however" : "";
            con.style.display = i == cursel ? "block" : "none";
        }
    }
});

结果发现,setTab 函数发生时  cursel的值总是blog控件的个数,

很郁闷,询问同事

闭包作怪。

 

修改代码

$(document).ready(function () {

    var _blogs= $("#Blogs").find("li[id*='blog']");   
  
    for(i=1 ;i<=_blogs.length;i++)
    {    
      (function(cu){
        $("#blog" + cu).click(function () { setTab('blog', cu.toString(), _blogs.length + 1) });
     
      })(i);    
    }

    function setTab(tab, cursel, n) {
        for (i = 1; i < n; i++) {
            var menu = document.getElementById(tab + i);
            var con = document.getElementById("displayBlog" + i)

            menu.className = i == cursel ? "however" : "";
            con.style.display = i == cursel ? "block" : "none";
        }
    }
});

正常工作。

关于闭包:

http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html#clClose

或者百度,google里面输入  javascript 闭包.

 

 

 

 


 

posted @ 2011-12-01 17:17 逐风流浪 阅读(48) 评论(0) 编辑