none
webBrowserでjavascriptで書かれたalertを表示させない方法はありませんか RRS feed

  • 質問

  • 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のみを表示させない方法を模索しております。

    よろしくお願いいたします。

    2011年10月9日 10:20

回答

  • 横からなんですが、自作アプリケーションに張り付けている WebBrowser コントロールの話ですよね?

    javascript の alert は UI オブジェクトの OnShowMessage イベントを作成しますので、OnShowMessage イベントでその表現を差し替えることができます。 Handled を true にすると標準のメッセージボックスも表示されません。

     

    • 回答の候補に設定 山本春海 2011年10月27日 6:19
    • 回答としてマーク 山本春海 2011年10月28日 8:27
    2011年10月21日 1:00

すべての返信

  • レスがなかなか付かないのでやはり難しいのかなと思います。

    他の掲示板にも投稿させていただきました。

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=62506

    2011年10月15日 10:05
  • 例えば、WebBrowser.DocumentでなくJavaScriptでならお望みのことは実現できるでしょうか?
    それが可能ならC#でもできるのかなと思います。
    できないのならこの問題はC#ではなくHTML / JavaScriptの問題ではないかと思います。
    2011年10月17日 1:18
  • >例えば、WebBrowser.DocumentでなくJavaScriptでならお望みのことは実現できるでしょうか?

    すみません、この意味がちょっと分からないのですが、 webBrowser1.DocumentTextなどでJavaScriptを書き出し、それをC#から操作するということでしょうか。

    お手数をおかけいたします。

     

     

    2011年10月18日 12:56
  • ですから、C#ではなく、JavaScriptで書けるでしょうか? いったんC#から離れてみてください。

    JavaScriptで実現できないようでしたらC#でも実現できないでしょう。
    # JavaScriptのalert()関数を止めたいんですよね?

    2011年10月20日 6:43
  • 外していたら、ごめんなさい。外池です。

    girou2さんの意図されていることは、

    1) コンテンツをダウンロード後、javascriptが走るより前の時点で介入して
    2) コンテンツの中身を走査して、javascriptの部分を見つけて、取り除き、
    3) その上で、コンテンツの表示を行う。

    ということなのでは?

    WebBrowserコントロールのDocumentCompletedイベントの発生のタイミングを私もよく知りませんが、3) の後だとしたら、ダメですよね?

    私なら、HttpWebRequest(だったかな?)で、HTMLのコンテンツを素のまま取得して、それをREGEXかなにかで走査してjavascriptの部分を取り除き、その上で、コンテンツをWebBrowserコントロールに渡す・・・、ってやると思います。

    ーー追記ーー

    javascriptゴテゴテでしたか。

    その中から、alert()関数のところだけ取り出して、何もせずに戻るように書き換えることも可能だとは思いますが・・・、

    ある特定のページのalert()関数ダケを無効化ということであれば、決め打ちで書き換えるのもアリなのかな・・・。


    (ホームページを再開しました)
    • 編集済み 外池 2011年10月20日 9:25
    2011年10月20日 8:35
  • bookmarklet的なものでalert()関数を置き換えてしまえばいいのでは、と思いました。

     

    追記への返信…?

    対象としているのはwindowオブジェクトが持つalertメソッドですよ?

    • 編集済み 佐祐理 2011年10月20日 12:02
    2011年10月20日 9:36
  • みなさん、ありがとうございす。

    外池 様のご推察のとおりです。
    DocumentCompletedイベントは3)の後のようで駄目みたいです。

    >その中から、alert()関数のところだけ取り出して、何もせずに戻るように書き換える
    >ある特定のページのalert()関数ダケを無効化ということであれば、決め打ちで書き換
    というつもりで書いたのが質問の部分でした。この辺のやり方、他に何かないでしょうか。

    Cookieも使っているようなので、HttpWebRequestでは難しいのではと思っています。


    佐祐理 様
    bookmarkletの知識がないもので、ちょっと調べてみたいと思います。

    2011年10月20日 10:40
  • 外池です。

    佐祐理さんが仰っている「windowsオブジェクトのalert()関数」ですと、この関数には手をつけられないですよね・・・。すいません、alert()関数が独自に定義されているものと誤解していました。

    呼び出し側を消すことも、原理的にはできるとは思いますが。

    Cookieを使っていても、HttpWebRequestでやれますよ? ただ、面倒ではありますが。


    (ホームページを再開しました)
    2011年10月20日 21:41
  • window.alertも差し替え可能なはずなので「JavaScriptで書けるでしょうか?」と提案していましたが「手をつけられない」のでしょうか?
    2011年10月20日 22:03
  • 外池です。自己レスですが、関係ありそうな記事がありました。

    http://ja.w3support.net/index.php?db=so&id=77659
    (英語の原文がどこにあるかはわからないです・・・)

    他のところでは、window.alert() = function (){ hogehoge } ってオーバーライドのようなことができるとも書いてありました・・・。なら、やっぱり、何もせずに戻るように書き換えることは可能ですね。 (佐祐理さんが、「windowオブジェクトのalert」とご指摘になった理由を、てっきり書き換え不能と仰りたかったのかと、勝手な思い込んでました。)


    (ホームページを再開しました)
    2011年10月20日 22:29
  • 「できないのならこの問題はC#ではなくHTML / JavaScriptの問題」と書いたのは質問する場が異なるという意味です。書き換え不可能ならこのような誘導はしません。可能だからこそ一貫して「JavaScriptで書けるでしょうか?」と問い続けていました。

    実際のところ、JavaScriptは大抵のものが書き換え可能なかなりグロい言語です。しかし、それを逆手にとって書き換え対策も可能です。ですので、本当の意味でalert()を書き換え可能かどうかは個々のページの作りに依ります。こうなってくるとC#のフォーラムで扱うべき内容ではなくなるため最初から解答・具体例を挙げずにいました。

    # 外池さんは根拠なくできない旨を回答しないでください。「知らない」だけですよね?

    2011年10月20日 23:08
  • 外池です。

    仰るとおりです。javascriptの個々のオブジェクトやメソッドの書き換え可能性は私は知りませんでした。以下、釈明。

    ただ、一方で、クライアントサイドのjavascriptの働き方として、webから応答のあったHTMLの中にjavascriptのすべての動作が記述されている、というところは理解しているつもりです。基本的に、javascriptの任意の部分を、まずコードの文字面を書き換えることは可能だと理解しています。

    しかし、それが、意図しない副作用で受け入れられない書き換えではいけない、実質的に書き換え不能なこともあろうかと。佐祐理さんはこの点を指摘されようとしているものと思っていました。

    girou2さんが、まず取り組んでおられることは、javascriptの書き換えの前の段階の課題であって、WebBrowserコントロール上でjavascriptが走ってしまう前に介入するために適切なイベントや、他の方法でHTMLのコンテンツを受け取る方法を探しておられると思ったので、javascriptの中身の詳細はテキトーに答えていました。

    なので、佐祐理さんのご指摘は正しいです。ごめんなさい。


    (ホームページを再開しました)
    2011年10月21日 0:08
  • ただ、一方で、クライアントサイドの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#に書き写す作業になると捉えました。

    2011年10月21日 0:32
  • 横からなんですが、自作アプリケーションに張り付けている WebBrowser コントロールの話ですよね?

    javascript の alert は UI オブジェクトの OnShowMessage イベントを作成しますので、OnShowMessage イベントでその表現を差し替えることができます。 Handled を true にすると標準のメッセージボックスも表示されません。

     

    • 回答の候補に設定 山本春海 2011年10月27日 6:19
    • 回答としてマーク 山本春海 2011年10月28日 8:27
    2011年10月21日 1:00
  • やはり手段がありましたか。その手の回答が出てくることを期待して1週間ほど黙っていたんですが、誰も回答しなかったので…。
    2011年10月21日 1:38
  • こんにちは、girou2 さん。

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。
    しばらく時間が経ちましたが、みなさんからのアドバイスはご確認いただけましたか?

    有効な情報をいただいていると思われましたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    アドバイスくださったみなさん、ありがとうございます。

    girou2 さん、その後いかがでしょうか。
    実装の際に不明点など出てきましたら、ご質問を続けてくださいね。
    このスレッドの内容が気になっていらっしゃる方もおられると思いますので、こちらのフォーラムだけではなく、もう一方の掲示板のほうの情報の更新もしていただけるとうれしいです。

    今後とも MSDN フォーラムをよろしくお願いします。
                                                                                                                  
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年10月28日 8:26