2011-03-25 71 views
5

我試圖延遲單擊鏈接的默認操作,直到用戶單擊「是」或「否」進行確認。問題是,while循環凍結瀏覽器(甚至不顯示的對話框中,儘管「開放」被稱爲第一):JavaScript「while」循環沒有凍結瀏覽器?

$(".remove").click(function() { 
    $("#dialog").dialog("open"); 

    while (1) { 
    // Count sheep 
    } 
}); 

顯然,「1」是唯一有用於測試目的。最終我希望它檢查由對話框設置的變量。但現在,我想知道如何使用這樣的循環來延遲默認的點擊操作。

感謝,

邁克爾

回答

4

你不能。您必須退出該對話框才能顯示的功能。只要功能正在運行,瀏覽器就不會執行任何更新。

您必須使用事件來處理用戶輸入。

1

你需要添加一行,以防止點擊事件的默認行爲的發生。

$(".remove").click(function(event) { 
    event.preventDefault(); 
    $("#dialog").dialog("open"); 

    .... 
}); 
+0

我不想丟掉這個事件。我只想推遲它。我希望有一種直接的方式,不需要重新構建鏈接並重新定向用戶(目的地取決於訪問者點擊的鏈接)。 – Michael 2011-03-25 01:31:18

4

一個非常簡單的答案是使用window.setInterval,而不是一個while循環,但仍然不是一個很好的答案。

正確的答案是您的對話框在用戶單擊按鈕時有回調。編輯:既然你使用jQuery,你不必寫回調的東西,在該對話框的功能需要一個第二個回調參數:

$("#dialog").dialog("open", function() { 
    // do your stuff for when they click OK 
}); 
3

您可以使用超時和回調此

setTimeout(FunctionHere, 3000); 

編輯:我也認爲值得注意的是有一個jQuery .delay()功能,以防萬一你想把它鏈接成某些東西。

+1

最好使用'setTimeout(FunctionHere,3000);' – 2011-03-25 01:28:19

+0

好知道,介意如果我問原因?我不懷疑這是準確的,我只想知道爲什麼。我不花很多時間在JavaScript中。 – sclarson 2011-03-25 01:35:08

+0

看起來你們都寫了同樣的東西.. – Michael 2011-03-25 01:52:47

1

快速點:

  1. 「而」循環是通過設置定時器或間隔回調
  2. 更好,但這樣做,你可以改爲綁定事件到按鈕或點擊的形式來測試剛剛發生了什麼。
  3. 最好,它看起來像你使用jQuery UI,你可以設置一個函數,當點擊對話框按鈕時被調用。

    $('form').dialog({ 
        autoOpen: true, 
        buttons: { 
         "Yes": onRequestSubmit, // function defined elsewhere 
         "No": function() { $(this).dialog("close"); } // function defined here 
        }, 
        modal: true 
    }); 
    
1

一個BIG問題依然存在......爲什麼每當它發生變化時,都檢查變量的值?

我已經使用setTimeout()延遲循環來檢查服務器執行僞服務器推送(這意味着瀏覽器發送請求到服務器)。即使在10秒的時間間隔內,它也消耗了太多的CPU資源,並大大減緩了瀏覽器的響應速度(特別是對於廉價的車間機器)。

在處理javascript時,您必須從桌面.NET事件驅動的編程中改變思維範式。持久循環對性能沒有好處。

有兩種選擇:

設計,你知道在代碼變量可以被改變,檢查是否一旦任何代碼這些點已經執行的變量改變這樣的方式申請流程。我知道,如果你來自C#,C或C++,這似乎是無法理解的乏味。

但是,我認爲更好的選擇是創建一個隱藏文本輸入HTML表單項。

<FORM NAME='dingoSam'> 
<INPUT TYPE='hidden' onChange='changed()' NAME='bingoSem'/> 
</FORM> 

我需要共享一個信號量的所有代碼都會引用dingoSam.bingoSem來更改它的值。

您應該利用瀏覽器的事件管理系統,而不是創建自己的事件循環,因爲JavaScript運行時利用與OS流程的協作來優化其事件驅動程序。然而,用JavaScript編寫的自己的事件循環遠不能與OS進程進行最佳協作。

+0

http://www.w3schools.com/js/js_events.asp – 2011-03-25 01:55:11