webbrowserコントロール(VBからJScriptの関数を実行できますか?)


ぽむりん  2003-09-05 04:25:35  No: 79300

はじめまして。
VB6.0でwebbrowserコントロール(IE)を使用してます。

VBのボタンからコントロールに表示したHTML内のJScriptの関数を
使用しようしたいのですが、この様な処理は可能でしょうか?
ご存知の方いらっしゃいましたら教えて頂けませんでしょうか?

また、html内に<EMBED ID="SVGFile" SRC="test.svg" />などと
埋め込まれたSVGファイルの内容をDHTML形式?(TagName、IDなど)で
参照する方法がありましたら、こちらも教えて頂けましたら幸いです。

宜しくお願い致します。


魔界の仮面弁士  2003-09-05 09:19:17  No: 79301

> VBのボタンからコントロールに表示したHTML内のJScriptの関数を
> 使用しようしたいのですが、この様な処理は可能でしょうか?

内容によっては呼べる事もあります。具体的には、どのような関数でしょうか?

例えば、「http://www.makoto3.net/」というURLが示すページには
   //num1からnum2の間の数値をランダムに返す汎用関数
   function rangeRandom(num1,num2)
   {
      /* 省略 */
   }
のようなJScriptが含まれていますが、たとえば、この戻り値を得るために、
以下のようなコードを書くことができます。(スマートな方法では無いですが…)

Option Explicit

Private Sub Form_Load()
    Me.WebBrowser1.Navigate2 "http://www.makoto3.net/"
End Sub

Private Sub Command1_Click()
    Me.WebBrowser1.Navigate2 "javascript:function POMURIN(){document.body.benshi=rangeRandom(1,20)}POMURIN()"
    Do
        DoEvents
    Loop While Me.WebBrowser1.Busy
    MsgBox "rangeRandom(1,20)の結果は、" & Me.WebBrowser1.Document.body.benshi & "です。"
End Sub

> また、html内に<EMBED ID="SVGFile" SRC="test.svg" />などと
> 埋め込まれたSVGファイルの内容をDHTML形式?(TagName、IDなど)で
> 参照する方法がありましたら、こちらも教えて頂けましたら幸いです。

EMBEDエレメントのSCR属性の値(すなわち、"test.svg"という文字列)を
得る事は可能です。document.getElementById("SVGFile").src ですね。

しかしDHTMLからは、それが指し示すSVGファイルの内容を得る事はできません。

もし、SVGファイルの内容を得たい場合は、WebBrowser/MSHTML経由ではなく、
XMLHTTPオブジェクトを使うなどして、別途、読み出せば良いかと思います。


ぽむりん  2003-09-05 11:18:46  No: 79302

魔界の仮面弁士様、
回答ありがとう御座いました。

> 内容によっては呼べる事もあります。具体的には、どのような関数でしょうか?

理想としましては、WebBrowser1にSVGファイルを表示しまして、
そのSVGファイル中のSCRIPTタグで埋め込まれたJScriptの関数を
VBから実行出来ればと思ってます。
(ちょっと説明がわかり辛いですね。すみません。)

> Me.WebBrowser1.Navigate2 "javascript:function POMURIN()
> {document.body.benshi=rangeRandom(1,20)}POMURIN()"

関数の呼び出しだけではなく、返値まで取得出来るのですね。
感激です。もう1ヶ月近く一人で悩んでたのでとても助かりました。
ところで、benshiやPOMRIN()等の書式は初めて拝見しましたが、
これらはどの様な意味があるのでしょうか?
もしよろしければスクリプトの書式についても教えて頂けませんか?
宜しくお願い致します。

> しかしDHTMLからは、それが指し示すSVGファイルの内容を得る事はできません。
> もし、SVGファイルの内容を得たい場合は、WebBrowser/MSHTML経由ではなく、
> XMLHTTPオブジェクトを使うなどして、別途、読み出せば良いかと思います。

XMLHTTPオブジェクトですね。
早速、調べてみたいと思います。

色々とありがとう御座いました。


魔界の仮面弁士  2003-09-05 11:48:52  No: 79303

今回の目的には合致しませんが、単純にJScriptを実行する事だけが
目的の場合は、スクリプトコントロールを利用する事ができます。
http://www.microsoft.com/japan/msdn/scripting/default.asp

例えば、フォーム上に ScriptControlを貼り付けて、
    Me.ScriptControl1.Language = "JScript"
    Me.ScriptControl1.AddCode _
        "function Test(a, b) {" & vbCrLf & _
        "  return a + b;" & vbCrLf & _
        "}"
    MsgBox Me.ScriptControl1.Eval("Test(12, 111)")

のように書いてみたり、もしくはレイトバインドにて

    Dim SC As Object
    Set SC = CreateObject("ScriptControl")
    SC.Language = "JScript"
    SC.AddCode _
        "function Test(a, b) {" & vbCrLf & _
        "  return a + b;" & vbCrLf & _
        "}"
    MsgBox SC.Eval("Test(12, 111)")

のように書く事もできたりします。

> そのSVGファイル中のSCRIPTタグで埋め込まれたJScriptの関数を
> VBから実行出来ればと思ってます。
実行できる場合と、実行できない場合とがあります。——内容次第ですね。

> (ちょっと説明がわかり辛いですね。すみません。)
そのSVGファイルは、どこかのWebサーバで公開されていますか?
具体的な例があった方がわかりやすいので。。。

> ところで、benshiやPOMRIN()等の書式は初めて拝見しましたが、
> これらはどの様な意味があるのでしょうか?
意味としては、benshi=弁士、POMRIN=ぽむりん、という事です。
……って、質問されているのは、そういう事じゃないですよね。(^^;

WebBrowser1.Navigate2 "javascript:〜〜" というのは、
http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/predefined/protocols.asp
に書かれている「javascriptプロトコル」という物で、
その後に記述された文字列を、JScriptとして処理する物です。

つまり、先の例の場合は、
    POMURINという名前の関数を定義し、それを呼び出している。
    なお関数POMURINとは
      『bodyオブジェクトにbenshiというプロパティを作成し、
        そこに、rangeRandom()関数の結果を代入する』
    という仕様。
という事になります。つまり、
  function POMURIN()
  {
     document.body.benshi = rangeRandom(1,20)
  }
という関数を定義し、その直後で
  POMURIN()
として、その関数を実行しているわけですね。


ぽむりん  2003-09-05 13:38:36  No: 79304

魔界の仮面弁士様、
早速のレスありがとう御座いました。

> 今回の目的には合致しませんが、単純にJScriptを実行する事だけが
> 目的の場合は、スクリプトコントロールを利用する事ができます。

色々なコントロールがあるのですね。
勉強になります。

> そのSVGファイルは、どこかのWebサーバで公開されていますか?
> 具体的な例があった方がわかりやすいので。。。

公開はされておりませんが、

[test.svg]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">

<svg xml:space="preserve" width="600px" height="400px">
  <script type="text/ecmascript" xlink:href="test.js"/>
  <rect id="rect1" x="0" y="0" width="1200" height="700" fill="black" stroke="black"/>
  <g id="TextData" fill="white" stroke="white" stroke-width="" onclick="DoOnClick(evt)">
    <text id="SAMPLE" x="10pt" y="20pt" fill="none"><tspan>TEST</tspan></text>
    <text id="t1" x="20pt" y="60pt" fill="none"><tspan>線1</tspan></text>
    <text id="t2" x="20pt" y="100pt" fill="none"><tspan>線2</tspan></text>
  </g>
  <g id="GraphData" fill="white" stroke="white" stroke-width="" onclick="DoOnClick(evt)">
    <use id="g1" xlink:href="#ldat" fill="none" x="20" y="42"/>
    <use id="g2" xlink:href="#ldat" fill="none" x="20" y="93" />
  </g>
  <defs>
    <g id="ldat">
      <line x1="10" y1="50" x2="300" y2="50" />
      <line x1="10" y1="51" x2="300" y2="51" />
      <line x1="10" y1="52" x2="300" y2="52" />
      <line x1="10" y1="53" x2="300" y2="53" />
      <line x1="10" y1="54" x2="300" y2="54" />
      <line x1="10" y1="55" x2="300" y2="55" />
    </g>
  </defs>
</svg>

[test.js]
function DoOnClick(evt){

  var node = evt.target;
  var col = node.getAttribute("fill").toLowerCase();

  node.setAttribute("fill","red");
  node.setAttribute("stroke","red");

}
function TestMsg(){
  alert('hello!!');
}

といった具合に使用してます。※コードは「UTF-8」限定です。
このSVGファイルをVBのWebBrowserコントロールに表示しまして、
先ほど教えて頂きました方法
    Me.WebBrowser1.Navigate2 "javascript:function ・・・
でVBからTestMsg()関数を呼ぼうとしたのですが、何度試しても
「オブジェクトを指定してください」のエラーになってしまいます。
何か良い方法は御座いませんでしょうか?

> WebBrowser1.Navigate2 "javascript:〜〜" というのは、
> その後に記述された文字列を、JScriptとして処理する物です。

定義と実行が書かれていたのですね。
ご丁寧なご説明、どうもありがとう御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加