2010-07-15 53 views
3

我知道有很多關於如何擊敗彈出窗口阻止程序的主題。在這種情況下,我並不是真的想這樣做。默認情況下,瀏覽器不會阻止彈出式窗口。合法的,比如用戶點擊它時,是允許的。這是一個很好的測試:http://www.popuptest.com/goodpopups.html(適用於IE,Firefox,Chrome,Opera)對用戶點擊啓動合法的彈出窗口

上述測試網站如何允許合法的彈出窗口是通過直接耦合onclick事件啓動一個新窗口。

就我而言,我不能只是啓動彈出式窗口。我需要檢查用戶輸入的字母數字密碼是否有效。我所做的是通過ajax檢查輸入,如果有效,將調用window.open()來啓動窗口。唉,所有彈出窗口阻止程序都會阻止它。

有沒有另一種方法可以做到這一點?如果輸入無效,我不想啓動窗口。如果輸入無效,則錯誤消息顯示在即時頁面上,而不顯示在新彈出窗口中。啓動一個窗口只是爲了告訴用戶它是無效的,這很愚蠢。

任何想法或建議如何檢查輸入,並允許顯示合法的彈出窗口?

謝謝。

編輯,包括我(簡化)代碼

HTML表單:

<form id="form-passcode"> 
<input id="input-passcode" type="text" name="input-passcode" /><a class="submit" onclick="javascript:passcode_check(); return false;" href="javascript:">Go</a> 
</form> 

的Javascript(使用jQuery):

function passcode_check() { 
    var refPasscode = $('#input-passcode'); 
    var data = $('#form-passcode').serialize(); 
    $.ajax({ 
     url: check_passcode.php', 
     data: data, 
     dataType: 'json', 
     type: 'post', 
     success: function (j) { 
     if (j.status == 1) { 
      newwindow = window.open('http://google.com','Google','menubar=no,height=500,width=300,resizable=no,toolbar=no,location=no,status=no'); 
      if (window.focus) {newwindow.focus()} 
     } 
     else { 
      // show error to end-user 
     } 
     } 
    }); 
} 

}

我也嘗試一個不太理想的選擇,其中在通過ajax檢查輸入是否有效時,我會插入一個鏈接,例如<a href="http://google.com" onclick="newwin(this.href);return false" onfocus="this.blur()">Launch</a> via $('#form-passcode').html();其中用戶隨後將點擊以啓動彈出窗口。這適用於所有瀏覽器,但我還是很樂意讓用戶更完美的..

再次感謝:)

回答

4

爲什麼不動驗證碼到您的onclick事件?

示例: onclick =「javascript:validateInput();」

然後,在validateInput()中,如果密碼有效,您將打開新窗口。

此外,請確保您沒有動態地使用jQuery分配onclick處理程序。它應該靜態指定爲HTML屬性。

+1

謝謝。我只是嘗試了你的方法,通過將所有內容移動到onclick函數中,禁用表單和按鈕的所有jquery處理程序。它現在可以在IE8中運行,但彈出窗口仍然在Chrome和Firefox中被屏蔽:(。 – Lyon 2010-07-15 05:55:52

+0

@Lyon:Chrome和FireFox可能只有一層深度,或者只是幾條語句到代碼路徑中。 – 2010-07-15 11:08:26

+0

@Jeroen謝謝:)建議我編輯我的問題以包含代碼.. – Lyon 2010-07-15 14:56:59

4

同意dacris。調用window.open的代碼需要更接近按鈕點擊處理程序。如果您正在使用異步響應處理程序對服務器執行AJAX調用,那麼您已經從按鈕單擊處理程序解耦了window.open調用。瀏覽器只能跟蹤堆棧深度的幾個級別(某些只有一個調用深度,其他調用深度很少),以查看是否從用戶事件的執行上下文中調用window.open。異步AJAX處理程序在按鈕點擊處理程序執行並返回給調用方之後執行很長時間。

解決您的問題的一種方法可能是將問題從內部解決:首先在按鈕單擊處理程序中打開彈出窗口,然後使您的異步AJAX調用驗證輸入,然後更新彈出窗口的URL到異步處理程序中的AJAX調用的結果。