2011-02-01 8 views
17

JavaScriptまたはjQueryを使用して確認または警告ボックスが表示されているかどうかを検出する方法はありますか?警告または確認がページに表示されているかどうかを検出する

+1

"表示中"とはどういう意味ですか?コード内でコマンドへの参照があるかどうかは分かりますか? –

+0

Web Workersを使えば... –

+0

@SimeVidasどうやって説明できますか? – Raynos

答えて

5

いいえありません。 confirmコマンドの戻り値が実際にtrueまたはfalseであることを確認できますが、そこに視覚的に存在するかどうかは確認できません。

これらはDOMの一部ではないブラウザの一部です。私はWindows OSの卑劣な子供だからIEのために働く汚れたハックがあると確信している。

+4

あなたの2番目の段落がほぼ確実に真実であることを+1します。 – Moses

+0

@モーゼスWindows OSへのリンクを見つけることができます。あなたは、警告が物理的にIEに表示されていることを確認できます – Raynos

+0

これは私があなたの回答のおかげで感謝したことです! – Uggers2k

1

イベントをブロックしているボックスを確認して警告する - これらのイベントが表示されている間は、JavaScriptコードの実行が停止されます。だから、私が知る限り、あなたが現在表示されているかどうかを検出することはできません。私はChromeでテストしてみた

、私はブラウザのサポートについてはよく分からない:あなたはalert()火災は、あなたがこのような何かを試すことができたときに、いくつかのコードを実行したい場合は

+0

これはUIスレッドをブロックするのは当てはまりますが、これでスニッフィングできるわけではありません。 –

16

例:もちろんhttp://jsfiddle.net/Q785x/1/

(function() { 
    var _old_alert = window.alert; 
    window.alert = function() { 
        // run some code when the alert pops up 
     document.body.innerHTML += "<br>alerting"; 
     _old_alert.apply(window,arguments); 
        // run some code after the alert 
     document.body.innerHTML += "<br>done alerting<br>"; 
    }; 
})(); 

alert('hey'); 
alert('you'); 
alert('there'); 

これだけアラートの前と後のコードを実行することができます。 @kanderが指摘したように、アラートが表示されている間、javascriptの実行は停止されます。これまであなたがしたい場合は、これを行うことができます

+0

これもクールです。 –

+0

甘い解決策! +1されました。 – kander

+0

警告が発せられたガーラントゥーはありません。あなたはwindow.alertが正しく実装されていると仮定します! – Raynos

2

...

(function() { 

    // remember the normal alert 
    var oldAlert = (function(){ return this.alert; }()), 
     oldConfirm = (function(){ return this.confirm; }()); 

    // inject ourself into the window.alert and window.confirm globals 
    alert = function (msg) { 
     oldAlert.call(document, msg); 
     document.onAlert(msg); 
    }; 
    confirm = function (msg) { 
     var result = oldConfirm.call(document, msg); 
     document.onConfirm(msg, result); 
     return result; 
    }; 

    // these just chill and listen for events 
    document.onAlert = function (msg) { 
     window.console && console.log('someone alerted: ' + msg); 
    }; 
    document.onConfirm = function (msg) { 
     window.console && console.log('someone was asked: ' + msg); 
     window.console && console.log('and they answered: ' + (msg ? 'yes' : 'no')); 
    }; 

}()); 

欠点は

  • あなたはいけないブラウザ(もののホスト方法をハッキングしているということです一般的に行う - http://perfectionkills.com/whats-wrong-with-extending-the-dom/
  • は、あなたは自分のalert()confirm()利用状況をより良く維持トラックでなければなりません、笑
2

これらがブロックされているかどうかを検出したい場合。表示するメッセージであなた自身のことをする必要がありますが、ネイティブのアラートを上書きする/確認します。

window.nativeAlert = window.alert; 
window.alert = function (message) { 
var timeBefore = new Date(); 
var confirmBool = nativeAlert(message); 
var timeAfter = new Date(); 
if ((timeAfter - timeBefore) < 350) { 
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!"); 
    } 
} 

window.nativeConfirm = window.confirm; 
window.confirm = function (message) { 
var timeBefore = new Date(); 
var confirmBool = nativeConfirm(message); 
var timeAfter = new Date(); 
if ((timeAfter - timeBefore) < 350) { 
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!"); 
} 
return confirmBool; 
} 

明らかに、私は3.5ミリ秒に時間を設定しました。しかし、いくつかのテストの後、私たちは約5ミリ秒でダイアログをクリックまたは閉じることができました。

+0

confirm()では、時間枠が短すぎる場合はnullを返すこともできます。これは発信者によって検出されるだけでなく、ほとんどの通常の使用に対して「偽」のように見えることがあります。 –

+0

時間枠があまりにも短い場合にnull(またはfalse)に戻すことを無効にすると、誰かがフォーム投稿を送信してもEnterキーを長押ししてしまうと誤った自動確認を防ぐことができます。 –

+0

これは悪い考えではありませんが、ユーザーの決定を無効にすることについて心配しています。確認があることが分かっている可能性があります。私はそれを行うことの利点を見ていますが、これを行う際にそれが1つの抜け穴であるためです。入力を保持できる人は特別なダイアログを起動します。しかし、それは時間の99.9%で動作します。 – DeadlyChambers

1

@ user113716の回答に追加するには、時間を頼​​りにすることができます。私は確認ダイアログが200ミリ秒未満であった場合、それはブラウザによってブロックされていると仮定します。以下は、確認ダイアログがブロックされている場合にtrueを返します(デフォルトではfalseを返し、コードはTypeScriptにあります)。

let oldConfirm = window.confirm; 
    window.confirm = (msg) => { 
     let time = new Date().getTime(); 
     let conf = oldConfirm(msg); 

     return new Date().getTime() - time > 200 ? conf : true; 
    } 
関連する問題