由於return false的做用域在each循環中,它只起到告終束當前循環的做用,至關於break,並無返回任何類型的值php
轉衆多網友意見html
問題:jquery
我是作一個回車事件處理,翻頁的那種,在一個頁面上成功了,換到另外兩個頁面上就出錯了。反正就是跳到1,若是加上alert(),就跳轉成功。ajax
可能狀況: 這種狀況通常出如今 alert() 以後的某個代碼須要頁面元素進入必定的狀態才能使用,json
加上 alert() 以後,至關於頁面元素有足夠的時間進入必定的狀態了,若是肯定你的代碼沒有問題,服務器
你能夠把 alert() 以後的代碼放到一個 setTimeout 的函數中,也就是停一會再運行下面的代碼,app
應該就沒問題了。dom
解決辦法:異步
這文章幫我解決了今天煩了半天的東西--類中使用的this+setTimeout。轉載過來了。async
setTimeout (表達式,延時時間)
setTimeout(表達式,交互時間)
延時時間/交互時間是以豪秒爲單位的(1000ms=1s)
setTimeout 在執行時,是在載入後延遲指定時間後,去執行一次表達式,僅執行一次
setTimeout 在執行時,它從載入後,每隔指定的時間就執行一次表達式
1,基本用法:
執行一段代碼: var i=0; setTimeout("i+=1;alert(i)",1000); 執行一個函數: var i=0; setTimeout(function(){i+=1;alert(i);},1000); //注意比較上面的兩種方法的不一樣。 下面再來一個執行函數的: var i=0; function test(){ i+=1; alert(i); } setTimeout("test()",1000); 也能夠這樣: setTimeout(test,1000); 總結: setTimeout的原型是這樣的: iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])
setTimeout有兩種形式
setTimeout(code,interval)
setTimeout(func,interval,args)
其中code是一個字符串 func是一個函數.
注意"函數"的意義,是一個表達式,而不是一個語句. 好比你想週期性執行一個函數
function a(){
//...
}
可寫爲
setTimeout("a()",1000)
或
setTimeout(a,1000)
這裏注意第二種形式中,是a,不要寫成a(),切記!!!
展開來講,無論你這裏寫的是什麼,若是是一個變量,必定是一個指向某函數的變量;
若是是個函數,那它的返回值就 要是個函數
2,用setTimeout實現setInterval的功能
思路很簡單,就是在一個函數中調用不停執行本身,有點像遞歸
var i=0; function xilou(){ i+=1; if(i>10){alert(i);return;} setTimeout("xilou()",1000); //用這個也能夠 //setTimeout(xilou,1000); }
3,在類中使用setTimeout
終於到正題了,其實在類中使用你們遇到的問題都是關於this的,只要解決了這個this的問題就萬事無憂了。 呵呵。讓咱們來分析一下:
function xilou(){ //by 西樓冷月 www.chinacms.org this.name="xilou"; this.sex="男"; this.num=0; } xilou.prototype.count=function(){ this.num+=1; alert(this.num); if(this.num>10){return;} //下面用四種方法測試,一個一個輪流測試。 setTimeout("this.count()",1000);//A:當下面的x.count()調用時會發生錯誤:對象不支持此屬性或方法。 setTimeout("count()",1000);//B:錯誤顯示:缺乏對象 setTimeout(count,1000);//C:錯誤顯示:'count'未定義 //下面是第四種 by 西樓冷月 www.chinacms.org var self=this; setTimeout(function(){self.count();},1000);//D:正確 } var x=new xilou(); x.count(); 錯誤分析: A:中的this其實指是window對象,並非指當前實例對象 B:和C:中的count()和count其實指的是單獨的一個名爲count()的函數,但也能夠是window.count(),由於window.count()能夠省略爲count() D:將變量self指向當前實例對象,這樣js解析引擎就不會混餚this指的是誰了。 話說回來,雖然咱們知道setTimeout("this.count()",1000)中的this指的是window對象,但仍是不明白爲何會是 window對象^_^(有點頭暈...) 那咱們能夠想象一下這個setTimeout是怎樣被定義的: setTimeout是window的一個方法,全稱是這樣的:window.setTimeout() 那應該是這樣被定義的: window.setTimeout=function(vCode, iMilliSeconds [, sLanguage]){ //.....代碼 return timer//返回一個標記符 } 因此當向setTimeout()傳入this的時候,固然指的是它所屬的當前對象window了。
==============================================
須要alert後代碼能夠生效是由於dom對象的時間問題。
若咱們在執行完上一行代碼後,稍等片刻再開始執行下一行代碼,那麼咱們的問題就解決了。
最簡單的辦法,延尺執行:
window.setTimeout("document.getElementById('headserch').focus();",10); //DOM對象超時不能設置焦點
當我把這句話延遲 了十毫秒來執行,肉眼是分辨不出來的。但機器能夠。因而就解決了DOM對象時間同步,而不能再執行下面的代碼。
用ajax得到數據,但是頁面顯示的時不加個alert就顯示不出來,隨意加個alert就能夠 解決辦法
這是由於Ajax的異步處理的引發的 只須要把jQuery中的$.ajaxSettings.async = false;
就能夠了 默認爲true;
AJax能夠經過兩種方法訪問服務器,即同步(腳本會停留並等待服務器發送回覆而後再繼續) 和 異步(腳本容許頁面繼續基進程並處理可能的回覆)
/* 【異步提交返回處理結果】 Ajax獲取結果 */ function ajax_GetJsonData() { $.ajaxSettings.async = false; $.ajax({ type: "POST", //用POST方式傳輸 dataType: "json", //數據格式:JSON url: 'IMenu.aspx', //目標地址 data: "action=getmenu", beforeSend: function () { }, //發送數據以前 complete: function () { }, //接收數據完畢 error: function (XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown); }, success: function (msg) { $("#menutdiv").empty(); $("<font>測試</font>").appendTo("#menudiv"); } }); } function CheckForm(){ if($("#username").val() == ''){ $("#warnning").html("<font color=red>ERROR</font>"); return false; } return CheckUserName(); //這裏的返回值不起做用 } function CheckUserName(){ var username = $("#username").val(); $.get("b.php",{ name:username}, function (data){ if(data == 1){ $("#warnning").html("<font color=#FF3300>Account is used.</font>"); return false; //這裏是返回給CheckUserName()的嗎? } else { $("#warnning").html("<font color=#00CC66>You can register.</font>"); return true; //這裏是返回給CheckUserName()的嗎? } } ); }
CheckForm()這個函數是表單驗證的;CheckUserName()是判斷用戶名是否存在的,存在的時候return false,不存在的話return true,爲什麼這裏的return true/false沒效果呢?
邏輯沒弄清楚,要將ajax設置爲同步的,須要使用$.ajax,$.get默認是異步的,而且不是在回調函數內return,而是在CheckUserName函數中申明一個變量來接受回調函數的返回值,而後CheckUserName返回這個值。
function CheckForm(){ if($("#username").val() == ''){ $("#warnning").html("<font color=red>ERROR</font>"); return false; } return CheckUserName(); //這裏的返回值不起做用 } function CheckUserName(){ var username = $("#username").val(); var result=false; $.ajax({async:false//要設置爲同步的,要不CheckUserName的返回值永遠爲false ,url:'b.php',data:{name:username} ,success:function(data){ if(data == 1){ $("#warnning").html("<font color=#FF3300>Account is used.</font>"); result=false; } else { $("#warnning").html("<font color=#00CC66>You can register.</font>"); result=true; } }}); return result;//==========這裏纔是CheckUserName的返回值,回調函數返回值沒有意義 }
jquery的方法默認都是返回jquery的對象,你在ajax的方法中返回對象也是枉然。只能用變量或是其餘東西存儲起來。
默認異步的,不會等待ajax方法執行完了了才執行下面的代碼。因此有時候也是不能獲得值的,要改爲「同步」
也能夠用$("div").data("result", true);獲得值用$("div").data("result")
若是要異步又要獲得值,能夠考慮用setTimeout重複執行獲得值的代碼,直到獲得值爲止