2013-03-07 65 views
1

以下是該方案。我有一些可以即時生成的JavaScript代碼。因此,我沒有使用打開用於讀取userinput的輸入框的prompt(),而是製作了一個自定義元素。因爲我可以設置我的自定義輸入框而不是使用正常的輸入框。JavaScript中提示()的替代方法

因此,爲了顯示自定義輸入框的功能是一樣的東西,show_input()

和動態生成的代碼,在使用eval()年底執行。所以在代碼中,在調用show_input()函數之後,程序應該等待直到用戶輸入值並按下按鈕(我自定義的輸入表單中的按鈕)。並且在生成的代碼中會有多次調用此函數。

我不知道如何找到解決方案。也就是說,使其行爲就像停止整個代碼的執行一樣。

我試過的是,在我們的自定義輸入框中,使用一個布爾標誌,當用戶輸入數值並按下按鈕時,該布爾標誌將被設置。所以,當我的show_input()被調用時,它會顯示自定義輸入框,然後進入一個無限循環,只有當這個布爾標誌設置時纔會停止。但是這會凍結網頁,使其無法響應。所以,這不是一個好的解決方案。

有沒有什麼辦法模仿prompt()函數的工作原理。我的意思是,暫停整個頁面,直到用戶按下按鈕?

setTimeout()函數在我的情況下不是一個好的選擇。因爲原因是,產生我的代碼會是這個樣子:

statement1; 
statement2; 

show_input(); //call the function to show my custom inputbox 

statement3; 

show_input(); 

statement4; 
statement5; 
// etc... 

所以,statement2後,函數調用是用於顯示自定義輸入框,要求用戶輸入的值,並按下一個按鈕。只有按下此按鈕後,才能轉到statement3。直到那時,它應該等待用戶按下我的自定義輸入框中的按鈕。

我正在使用jQuery,並且該按鈕有一個點擊事件添加到它。

在運行時生成上面的代碼中,使用eval()

任何想法,將高度讚賞執行。 謝謝

+1

你所說的input()究竟是什麼?這不是原生JavaScript。 – 2013-03-07 13:07:23

+0

使用事件。這意味着你將不得不讓你的代碼更加安全。例如,調用'show_input()'後,你不應該有更多的代碼「等待」。您的代碼應該完成,並且一旦用戶觸發事件(OK按鈕),您將執行另一個功能。 – TheBronx 2013-03-07 13:10:03

+0

你最好的選擇是使用[showModalDialog()](https://developer.mozilla.org/en-US/docs/DOM/window.showModalDialog),否則這對於JavaScript來說是不可能的。 – Teemu 2013-03-07 13:15:32

回答

2

JavaScript的執行模型不允許您嘗試實現的目標,因爲無法「阻止」等待DOM輸入的腳本執行。就像你在循環嘗試中注意到的一樣,頁面被凍結,直到腳本結束運行,然後才恢復正常的事件處理。

因此,請改爲創建一個回調函數,其中包含要在用戶輸入後執行的語句,並讓輸入系統調用它。例如:

// statement 1 and 2 here 

var callback = function(value) { 
    // statement 3 here 
} 

show_input(callback); 

然後內部show_input綁定用戶確認檢索的值的函數然後調用使用所述值提供給它的回調函數。例如(使用jQuery的簡潔的語法,但是這不是絕對必要使用它):

function show_input(callback) { 
    // create the input form 
    $(confirm_button).click(function() { 
     callback($(input).value()); 
    }); 

這當然可以被嵌套到任意級別需要。在嵌套時,如果重新使用現有的窗口小部件(而不是創建新的窗口小部件),必須小心以前的回調事件在綁定新的窗口之前未被綁定 - 如果需要,您還可以保留對事件處理程序的引用以便將其刪除明確地說,但是對於大多數情況下,解除所有事件都應該足夠了。

看到一個例子小提琴:http://jsfiddle.net/YTcy8/

+0

謝謝。並且對於延遲迴復感到抱歉。正在逐一閱讀。我試圖找出是否有更好的解決方案。我想我可能最終會有這樣的事情。 – 2013-03-07 13:40:28

+0

經過測試,這似乎是最好的解決方案。謝謝:) – 2013-03-07 14:39:47

+0

嗯..我喜歡這種方法,並正在測試它。但嵌套時似乎不工作。你能檢查一下嗎? – 2013-03-07 15:54:47

1

我發現你的情況很難遵循,但假設你面臨的困難是將用戶交互綁定到生成的代碼。爲了嘗試更清楚地瞭解您所面臨的問題,下面的工作會是什麼?如果不是,爲什麼不呢?

$('#thebutton').on('click', statement3); 

Here's a fiddle with an abstraction of the whole thing - 用叉按鈕來創建你自己的修改,如果你想擴展或糾正。

+0

謝謝,但這並沒有幫助。因爲我想要做的是在運行時創建JavaScript代碼(只有幾行代碼),然後通過'eval()'執行它。所以,問題在於使用替代'input()'。我想讓代碼暫停,直到用戶按下按鈕。請注意,我有事件附加到按鈕和其他東西。當用戶按下按鈕(我的自定義輸入框上的按鈕)時,將會設置一個全局布爾標誌。 – 2013-03-07 13:11:15

+0

你能詳細說明這個'alternative'input()'是什麼嗎?我現在不太明白。就執行生成的代碼而言,[我更新了我的示例以使用textarea來包含任何代碼,以此作爲執行在運行時不知道的代碼的概念驗證](http://jsfiddle.net/barney/HkARv/1 /) - 當用戶點擊按鈕時,它將作爲'statement3'的一部分執行。我仍然認爲一個澄清的用例解釋了什麼是生成的,什麼不是,input()的意思,以及'暫停'的意思,這將是一個好主意...... – Barney 2013-03-07 13:17:07

+0

對不起。使用了錯誤的函數名稱。它是'prompt()',輸入框。 – 2013-03-07 13:18:39

1

您需要檢測輸入框按鈕上的單擊事件。您可以使用onclick來觸發一個函數,該函數檢測用戶是否填充了輸入,如果輸入已填充,則繼續按照您的要求進行操作。您也可以使用overlay box來放置輸入和按鈕

+0

謝謝。我知道那一部分,我已經實現了它。這不是我遇到的問題。試圖停止執行程序。然後在輸入後重新開始。 – 2013-03-07 13:20:04

0

我們有類似的情況,我們不得不停止爲用戶輸入腳本執行,我們無法搜索了將近2 3個月後找到任何解決方案。之後,我們放棄了這個想法,因爲這是不可能的。

然而,我們採取的方法是如下

statement 1 
statement 2 
showInput(function() { 
    statement3; 
    showInput(function() { 
       statement4; 
       statement5; 
      }) 
     }) 

我沒有這除了一個你的問題的任何解決方案。如果您發現除此之外的解決方案,請提供相同的解決方案。我發現很多在相同情況下被阻止的人

+0

謝謝。如果我找到一個好的解決方案,會讓你知道。 – 2013-03-07 13:26:56