解決js代碼中加入alert()就成功執行,不加就不對的問題!

由於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重複執行獲得值的代碼,直到獲得值爲止

相關文章
相關標籤/搜索