ソースページが別のドメインにあるiframeのページがあります。時々、ソースページはアラートを生成します。その場合、ユーザーがアラートに対して[OK]をクリックするまで、実行中の処理を停止します。
私がやりたいのは、プログラムでこのアラートの[OK]をクリックして、ソースページが再び役立つようにすることです。これは可能ですか?
ソースページが別のドメインにあるiframeのページがあります。時々、ソースページはアラートを生成します。その場合、ユーザーがアラートに対して[OK]をクリックするまで、実行中の処理を停止します。
私がやりたいのは、プログラムでこのアラートの[OK]をクリックして、ソースページが再び役立つようにすることです。これは可能ですか?
JavaScriptはシングルスレッドです。つまり、関数を呼び出すと、関数が返されるまでブロックされます。alert()を呼び出すと、ブラウザに制御が渡され、ブラウザがその処理方法を決定します。UIダイアログを表示しているのはJavascriptではなく、ブラウザです。alert()は、ブラウザが「OK」イベントを受信して制御を返すまで戻りません。javascriptスレッドは、それが発生するまで停止されます。
したがって、上記の段落で述べた少なくとも2つの異なる理由により、答えはノーです:)
私はそれが不可能だとかなり確信しています。
コードでno-opを使用してアラートをオーバーライドするとどうなりますか?
例えば
<script>
// uncomment next line to swallow alerts
// function alert(nope) { return; }
<script>
<script>
$(document).ready(function() { alert("Hello, world!"); });
</script>
行がコメントアウトされると、アラートが表示されます。コメント入力された行では、アラートは表示されません。
アラートのテキストを知っていて、汚れてもかまわない場合は、問題はありません。
iframeウィンドウのアラートを独自のものでオーバーライドして、効果を上げるために何かを行うことができます。
document.getElementById("InnerFrameName").contentWindow.alert = function(){
if (arguments[0].toLowerCase() == "innerframe alert text")
return; //supress
else
alert(arguments[0]);
};
編集:プロキシハンドラーを使用して少しテストを行いました(asp.net/c#にありますが、アイデアを得る必要があります)...
私のテストの外部ページは、アラートを表示するボタンのあるw3ページであり、アラートはユーザー定義関数を通過します。
これはあなたが手に入れたいよりもずっと汚れていると確信しています。
ページ:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Hello From MyPage</title>
<script type="text/javascript">
function frameLoaded() {
document.getElementById("InnerFrameName").contentWindow.alert = function() {
if (arguments[0].toLowerCase() == "i am an alert box!!") {
alert("MESSAGES WOULD BE SUPRESSED: " + arguments[0]);
return; //supress
} else {
alert(arguments[0]);
}
};
}
</script>
</head>
<body onload="alert('Hello from an unsupressed top level frame message!');">
<form id="form1" runat="server">
<div>
<h1>Internal Page (Top Level)</h1>
<hr />
<iframe id="InnerFrameName" onload="frameLoaded();" src="PageProxy.ashx?externalURI=http://www.w3schools.com/JS/tryit_view.asp?filename=tryjs_alert"
style="width: 800px; height: 600px;">Derp!...</iframe>
</div>
</form>
</body>
</html>
プロキシハンドラ:
<%@ WebHandler Language="C#" Class="PageProxy" %>
using System;
using System.Web;
public class PageProxy : IHttpHandler {
public void ProcessRequest (HttpContext context) {
byte[] externalPage = new System.Net.WebClient().DownloadData(context.Request["externalURI"]);
context.Response.OutputStream.Write(externalPage, 0, externalPage.Length);
context.Response.End();
}
public bool IsReusable {
get {
return false;
}
}
}
私はそれを非常に疑っています。別のドメインとは、自分で制御できないドメインを意味しますか?
制御できる場合は、アラートをモーダルJavascriptボックスに変更して制御できます。
煩わしいJavaScriptの問題を解決する最善の策は、Greasemonkeyのようなクライアント側のスクリプトツールでJavaScriptをオーバーライドすることです。