【问题标题】:The InvokeScript() Method returns nullInvokeScript() 方法返回 null
【发布时间】:2016-07-29 07:43:43
【问题描述】:

InvokeScript() 方法返回 null。

JavaScript:

function gpsToAddress(gpsX, gpsY) {
    var coords = new daum.maps.LatLng(gpsX, gpsY);
    geocoder.coord2detailaddr(coords, CallbackA)}

    function CallbackA(status, result) {
    if(status===daum.maps.services.Status.OK)
    {
        return result[0].jibunaddress;
    }
}

和 C#:

private void f_ret_gpstoaddress(double v_gps_x, double v_gps_y,out string v_address)
{
    object[] args = { "gpsToAddress(" + v_gps_x + "," + v_gps_y + ");" };
    v_address = (string)webBrowser1.Document.InvokeScript("eval", args);
    return;
}

private void button3_Click(object sender, EventArgs e)
{
    f_ret_gpstoaddress(37.353933, 127.944739, out v_address);
    MessageBox.Show(v_address);
}

“args”和“v_address”返回 null,messageBox 也返回 null。 我想返回一些值。 请帮帮我!

编辑:好的,我像这样编辑了 C# 代码:

private string f_ret_gpstoaddress(double v_gps_x, double v_gps_y, out string v_address)
        {
            var args =  "gpsToAddress(" + v_gps_x + "," + v_gps_y + ");" ;
            v_address = webBrowser1.Document.InvokeScript("eval",new object[] { args }).ToString();
            return v_address;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            f_ret_gpstoaddress(37.353933, 127.944739, out v_address);
            MessageBox.Show(v_address);
        }

所以,args 不为空,但 v_address 仍然为空。有什么问题??

【问题讨论】:

    标签: javascript c# invokescript


    【解决方案1】:

    您的函数 gpsToAddress 不返回任何内容。但它在进程完成时调用了一个回调函数。

    我建议你在调用函数时传递回调函数。

    请查看此主题以获取更多详细信息:Make async event synchronous in JavaScript

    编辑:基于上述问题:

    创建回调类

    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public class Callback
    {
       // allows an instance of Callback to look like a function to the script
       // (allows callback() rather than forcing the script to do callback.callMe)
       [System.Runtime.InteropServices.DispId(0)]
       public void callMe(string v_address)
       {
          MessageBox.Show(v_address);
       }
     }
    

    使用回调调用 js 函数:

    private string f_ret_gpstoaddress(double v_gps_x, double v_gps_y, out string v_address)
    {
        Callback cb = new Callback();
        var args =  "gpsToAddress(" + v_gps_x + "," + v_gps_y + "," + cb);" ;
        v_address = webBrowser1.Document.InvokeScript("eval",new object[] { args }).ToString();
        return v_address;
    }
    

    js函数以回调为参数:

    function gpsToAddress(gpsX, gpsY, callback) {
       function CallbackA(status, result) {
          if(status===daum.maps.services.Status.OK)
          {
             callback(result[0].jibunaddress);
          }
          else {
             callback('');
          }
       }
    
       var coords = new daum.maps.LatLng(gpsX, gpsY);
       geocoder.coord2detailaddr(coords, CallbackA)
    }
    

    编辑 2:(虚拟样本)

    namespace WindowsFormsApplication1
    {
       public partial class Form1 : Form
       {
           string javascript = @"<html><head><script type='text/javascript'>function gpsToAddress(param1, callback) {
        function CallbackA()
        {
            callback(param1);
        }
    
        setTimeout(function() { CallbackA() }, 1000);
     }</script></head></html>";
        public Form1()
        {
            InitializeComponent();
            webBrowser1.DocumentText = javascript;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            Callback cb = new Callback();
            webBrowser1.Document.InvokeScript("gpsToAddress", new object[] { 123, cb });
        }
    }
    
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public class Callback
    {
        // allows an instance of Callback to look like a function to the script
        // (allows callback() rather than forcing the script to do callback.callMe)
        [System.Runtime.InteropServices.DispId(0)]
        public void callMe(string v_address)
        {
            MessageBox.Show(v_address);
        }
    }
    }
    

    【讨论】:

    • 感谢您的回答。但我不明白。你能解释更多吗??
    • 好的,我明白了。但是会返回“WindowsFormsApplication6.Callback”。因此,会引发“未定义 WindowsFormsApplication6”异常。
    • 您的代码有错误。我在新编辑中放置了一个虚拟样本
    • 谢谢@Silvinus
    • 不,但是当我尝试上面的代码时,'123' 会打印在消息框中。但我不知道如何应用它。
    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2021-12-30
    相关资源
    最近更新 更多