js 閉包,匿名函數要點; js 鍵盤輸入; js 執行文本代碼; js 非同步回呼函數,如何避免sysfader錯誤

來源:互聯網
上載者:User

(1) dom元素的onclick事件綁定到方法

   dom.onclick=function(){otherfunctiong()};

   使用js定義onclick觸發的函數,一定要用匿名函數,包圍被調用函數,否則被調函數會被直接執行.

 例子:

   正確:

                    tempA.onclick=function(){getInfo(residentInfo.ResidentID)};

 錯誤:

                    tempA.onclick=getInfo(residentInfo.ResidentID);

   這種寫法會讓onclick事件發生前就直接getInfo(residentInfo.ResidentID);

(2)functionA()執行完之後回呼函數B

  正確寫法:

function initInput(callback){        var aj=new ajax();    var url="../AddedHandlers/ResidentInfo.ashx?type=getAllBindInfo";    aj.post(url,null,false,function(info){     ..........     if(callback!=null){callback();}     )};       }
  initInput(function(){getInfo(id,true);});

 

錯誤寫法:

initInput(getInfo(id,true));

  錯誤原因:會先執行getInfo方法

 

(3)迴圈內為dom元素繫結事件

      

 for(var i=0;i<n;i++){            var resiIDNode=resiBriefs[i].selectSingleNode("ResidentID");            var residentId=resiIDNode.text;            var resiNameNode=resiBriefs[i].selectSingleNode("ResidentName");            if(resiNameNode!=null){                var residentName=resiNameNode.text;                var httpstr="";                if(resiRelationNode!=null&&resiRelationNode.text!=""){                    if(resiRelationNode.childNodes[0].nodeValue=="戶主"){                        var tempA=document.createElement("a");                        tempA.style.fontWeight="bold";                        tempA.setAttribute("id",residentId);                        //tempA.onclick=function(){ alert(residentId);getInfo(residentId);}//錯誤寫法 所有dom元素繫結的參數都是for的最後一個值
               tempA.onclick=function(){getInfo(this.getAttribute("id"));}    //正確寫法 tempA.appendChild(document.createTextNode(residentName)); document.getElementById("peopleList").appendChild(tempA); }
          }
        }
   }

  

二、鍵盤輸入

<body onkeypress ="bodyKeyPressed()">

/*body keypressed
*/
function bodyKeyPressed(){
   if(event.keyCode==13){checkUsrPsw();}
}

三、執行文本代碼

  Function;   eval

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>無標題頁</title><script type="text/javascript" >function execute(){    /*方式1    var sScript="(function(){"+document.getElementById("txScript").value+"})()";//執行函數    var func=new Function(sScript); //Function的最後一個參數預設是函數體    try{        func();     }*/    //方式2    var sScript=document.getElementById("txScript").value;    try{        eval(sScript);    }    catch(e){        alert(e.description);    }}</script></head> <body><textarea id="txScript" style=" width:400px; height:300px;"></textarea></br><input type="button" value="執行js代碼" onclick ="execute()"/></body></html>

 

三、js 非同步回呼函數,如何避免sysfader錯誤

 背景:經常需要將回呼函數綁定到匿名函數上,如果綁定語句未生效,就會在方法執行後引發sysfader.

 例子:三維社區系統,更新房間位置.

解決方式: 在執行非同步方法呼叫前(createPoint),檢查用戶端回呼函數書否綁定正確.

  var type=obj.getAttribute("litype");    top.usearth.Event.OnPoiClicked=top.emptyPoiClicked;//禁止點擊效果,防止sysfader    //添加點        top.usearth.Event.OnCreatePoint=function(pVal){          .......................            var endStr="The event is well set";    };    top.usearth.ShapeCreator.Clear();    try{       if(top.usearth.Event.OnCreatePoint.toString().indexOf('The event is well set')!=-1){//檢測OnCreatePoint是否綁定正常         top.usearth.ShapeCreator.createPoint();       }       else{ throw "位置移動失敗,請重新移動";}    }        catch(e){       alert(e);       return;    } 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.