トップ回答者
webBrowserでjavascriptで書かれたalertを表示させない方法はありませんか

質問
-
girou2と申します。
あるHPを検索したら検索結果表示時にalertが表示される仕様となっています。このalertを表示させないように次のようにDocumentCompleted内に記載しましたが、ダメでした。
HtmlElementCollection script = webBrowser1.Document.GetElementsByTagName("script");
foreach (HtmlElement sc in script)
{
if (sc.GetAttribute("language") == "javascript")
{
sc.OuterHtml = "";
}
}全く考え違いをしているのかも知れませんが、HTML内のscriptタグを取得しjavascriptであれば無効化したつもりなのですが。
javascriptゴテゴテのHPからpostでデータを送っているので、javascript自体を無効にすることはではなく、結果表示画面で、このjavascriptで作られたalertのみを表示させない方法を模索しております。
よろしくお願いいたします。
回答
すべての返信
-
レスがなかなか付かないのでやはり難しいのかなと思います。
他の掲示板にも投稿させていただきました。
-
外していたら、ごめんなさい。外池です。
girou2さんの意図されていることは、
1) コンテンツをダウンロード後、javascriptが走るより前の時点で介入して
2) コンテンツの中身を走査して、javascriptの部分を見つけて、取り除き、
3) その上で、コンテンツの表示を行う。ということなのでは?
WebBrowserコントロールのDocumentCompletedイベントの発生のタイミングを私もよく知りませんが、3) の後だとしたら、ダメですよね?
私なら、HttpWebRequest(だったかな?)で、HTMLのコンテンツを素のまま取得して、それをREGEXかなにかで走査してjavascriptの部分を取り除き、その上で、コンテンツをWebBrowserコントロールに渡す・・・、ってやると思います。
ーー追記ーー
javascriptゴテゴテでしたか。
その中から、alert()関数のところだけ取り出して、何もせずに戻るように書き換えることも可能だとは思いますが・・・、
ある特定のページのalert()関数ダケを無効化ということであれば、決め打ちで書き換えるのもアリなのかな・・・。
(ホームページを再開しました)- 編集済み 外池 2011年10月20日 9:25
-
みなさん、ありがとうございす。
外池 様のご推察のとおりです。
DocumentCompletedイベントは3)の後のようで駄目みたいです。>その中から、alert()関数のところだけ取り出して、何もせずに戻るように書き換える
>ある特定のページのalert()関数ダケを無効化ということであれば、決め打ちで書き換
というつもりで書いたのが質問の部分でした。この辺のやり方、他に何かないでしょうか。Cookieも使っているようなので、HttpWebRequestでは難しいのではと思っています。
佐祐理 様
bookmarkletの知識がないもので、ちょっと調べてみたいと思います。 -
外池です。自己レスですが、関係ありそうな記事がありました。
http://ja.w3support.net/index.php?db=so&id=77659
(英語の原文がどこにあるかはわからないです・・・)他のところでは、window.alert() = function (){ hogehoge } ってオーバーライドのようなことができるとも書いてありました・・・。なら、やっぱり、何もせずに戻るように書き換えることは可能ですね。 (佐祐理さんが、「windowオブジェクトのalert」とご指摘になった理由を、てっきり書き換え不能と仰りたかったのかと、勝手な思い込んでました。)
(ホームページを再開しました) -
「できないのならこの問題はC#ではなくHTML / JavaScriptの問題」と書いたのは質問する場が異なるという意味です。書き換え不可能ならこのような誘導はしません。可能だからこそ一貫して「JavaScriptで書けるでしょうか?」と問い続けていました。
実際のところ、JavaScriptは大抵のものが書き換え可能なかなりグロい言語です。しかし、それを逆手にとって書き換え対策も可能です。ですので、本当の意味でalert()を書き換え可能かどうかは個々のページの作りに依ります。こうなってくるとC#のフォーラムで扱うべき内容ではなくなるため最初から解答・具体例を挙げずにいました。
# 外池さんは根拠なくできない旨を回答しないでください。「知らない」だけですよね?
-
外池です。
仰るとおりです。javascriptの個々のオブジェクトやメソッドの書き換え可能性は私は知りませんでした。以下、釈明。
ただ、一方で、クライアントサイドのjavascriptの働き方として、webから応答のあったHTMLの中にjavascriptのすべての動作が記述されている、というところは理解しているつもりです。基本的に、javascriptの任意の部分を、まずコードの文字面を書き換えることは可能だと理解しています。
しかし、それが、意図しない副作用で受け入れられない書き換えではいけない、実質的に書き換え不能なこともあろうかと。佐祐理さんはこの点を指摘されようとしているものと思っていました。
girou2さんが、まず取り組んでおられることは、javascriptの書き換えの前の段階の課題であって、WebBrowserコントロール上でjavascriptが走ってしまう前に介入するために適切なイベントや、他の方法でHTMLのコンテンツを受け取る方法を探しておられると思ったので、javascriptの中身の詳細はテキトーに答えていました。
なので、佐祐理さんのご指摘は正しいです。ごめんなさい。
(ホームページを再開しました) -
ただ、一方で、クライアントサイドのjavascriptの働き方として、webから応答のあったHTMLの中にjavascriptのすべての動作が記述されている、というところは理解しているつもりです。基本的に、javascriptの任意の部分を、まずコードの文字面を書き換えることは可能だと理解しています。
しかし、それが、意図しない副作用で受け入れられない書き換えではいけない、実質的に書き換え不能なこともあろうかと。佐祐理さんはこの点を指摘されようとしているものと思っていました。
girou2さんが、まず取り組んでおられることは、javascriptの書き換えの前の段階の課題であって、WebBrowserコントロール上でjavascriptが走ってしまう前に介入するために適切なイベントや、他の方法でHTMLのコンテンツを受け取る方法を探しておられると思ったので、javascriptの中身の詳細はテキトーに答えていました。
なるほど、それはありますし質問に含まれているコードも「ダウンロードしたHTMLを編集するもの」ととらえることができるかもしれませんね。しかしそのコードも
var scripts = document.getElementsByTagName("script"); for(var i in scripts){ var sc = scripts[i]; if(sc.getAttribute("language") == "javascript"){ sc.outerHTML = ""; } }
とJavaScriptによるHTML DOM操作と等価だったりします。DocumentCompletedイベントも同等のものがJavaScript上でも発生しています。
ですのでまずはHTML内のJavaScriptで目的の操作を行い、それが実現できたらその操作コードをC#に書き写す作業になると捉えました。
-
こんにちは、girou2 さん。
MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。
しばらく時間が経ちましたが、みなさんからのアドバイスはご確認いただけましたか?
有効な情報をいただいていると思われましたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
アドバイスくださったみなさん、ありがとうございます。
girou2 さん、その後いかがでしょうか。
実装の際に不明点など出てきましたら、ご質問を続けてくださいね。
このスレッドの内容が気になっていらっしゃる方もおられると思いますので、こちらのフォーラムだけではなく、もう一方の掲示板のほうの情報の更新もしていただけるとうれしいです。
今後とも MSDN フォーラムをよろしくお願いします。
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海