C#调用JS的几种方法

下面我将详细讲解C#调用JS的几种方法,并提供两个示例说明。

目录

  1. 通过WebBrowser控件调用
  2. 通过接口调用
  3. 通过JavaScriptSerializer序列化调用
  4. 示例说明
  5. 示例一:通过WebBrowser控件调用
  6. 示例二:通过接口调用

通过WebBrowser控件调用

WebBrowser控件可以加载本地HTML文件,也可以通过设置Navigate方法加载网页,这样就可以很方便地调用JS代码了。

private void button1_Click(object sender, EventArgs e)
{
    // 加载本地HTML文件
    webBrowser1.Url = new Uri(@"C:\test.html");
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // 调用JS代码
    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement script = webBrowser1.Document.CreateElement("script");
    script.SetAttribute("text", "function alertFromCsharp() { alert('Hello from C#'); }");
    head.AppendChild(script);

    webBrowser1.Document.InvokeScript("alertFromCsharp");
}

在上述代码中,我们首先通过设置WebBrowser控件的Url属性加载了本地的HTML文件,当该文件加载完成后,我们就可以通过webBrowser1.Document.InvokeScript方法来调用JS代码,这里我们定义了一个名为alertFromCsharp的JS函数,并且在调用时弹出了一个Hello from C#的提示框。

通过接口调用

除了通过WebBrowser控件调用,我们还可以通过接口来实现调用JS的功能,具体步骤如下:

  1. 创建一个类,并添加一个ComVisible属性。

csharp
[ComVisible(true)]
public class ScriptApi
{
public void callFunction(string str)
{
MessageBox.Show(str);
}
}

  1. WebBrowser控件的DocumentCompleted事件中,将JS对象注入到HTML中。

csharp
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.ObjectForScripting = new ScriptApi();
HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement script = webBrowser1.Document.CreateElement("script");
string js = "function callCSharpFunction(str) { window.external.callFunction(str); }";
script.SetAttribute("text", js);
head.AppendChild(script);
}

在上述代码中,我们首先通过ObjectForScripting属性将ScriptApi类注入到了HTML中,然后添加了一个名为callCSharpFunction的JS函数,在该函数中调用了window.external.callFunction来调用注入的ScriptApi对象中的callFunction方法。

  1. 通过JS调用C#方法。

javascript
<input type="button" onclick="callCSharpFunction('Hello from JS.');" value="调用C#方法">

在上述代码中,我们通过一个按钮来调用callCSharpFunction函数,并且将'Hello from JS.'作为参数传递给该函数,这样就可以实现JS调用C#方法的功能了。

通过JavaScriptSerializer序列化调用

除了上述两种方法,我们还可以通过JavaScriptSerializer来将C#对象序列化为JS代码,然后再执行该代码,实现C#调用JS的功能。

JavaScriptSerializer serializer = new JavaScriptSerializer();
string obj = serializer.Serialize(new { param1 = "value1", param2 = "value2" });
webBrowser1.Document.InvokeScript("your_js_function", new object[] { obj });

在上述代码中,我们将一个匿名对象进行了序列化,并且通过InvokeScript方法调用了名为your_js_function的JS函数,并将序列化后的字符串作为参数传递给该函数。

示例说明

示例一:通过WebBrowser控件调用

创建一个名为test.html的文件,并添加以下代码:

<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <meta charset="utf-8" />
</head>
<body>
    <h1>Demo</h1>
    <script>
        function alertFromCsharp() {
            alert("Hello from C#");
        }
    </script>
</body>
</html>

然后创建一个Windows Forms应用程序,在窗体中添加一个WebBrowser控件和一个Button控件,其代码如下:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.Url = new Uri(@"C:\test.html");
    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
        HtmlElement script = webBrowser1.Document.CreateElement("script");
        script.SetAttribute("text", "function alertFromCsharp() { alert('Hello from C#'); }");
        head.AppendChild(script);

        webBrowser1.Document.InvokeScript("alertFromCsharp");
    }
}

在运行该程序后,点击按钮就可以调用JS代码并弹出Hello from C#的提示框。

示例二:通过接口调用

创建一个Windows Forms应用程序,添加一个WebBrowser控件,并在窗体中添加如下代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        webBrowser1.ObjectForScripting = new ScriptApi();
        HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
        HtmlElement script = webBrowser1.Document.CreateElement("script");
        string js = "function callCSharpFunction(str) { window.external.callFunction(str); }";
        script.SetAttribute("text", js);
        head.AppendChild(script);
    }
}

[ComVisible(true)]
public class ScriptApi
{
    public void callFunction(string str)
    {
        MessageBox.Show(str);
    }
}

在运行该程序后,当WebBrowser控件加载完成后,我们就可以通过JS代码来调用C#中的callFunction方法了。在HTML文件中添加一个按钮,并在按钮的onclick事件中添加如下代码:

<input type="button" onclick="callCSharpFunction('Hello from JS.');" value="调用C#方法">

点击该按钮后,就可以弹出一个消息框显示Hello from JS.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#调用JS的几种方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • asp.net实现的DES加密解密操作示例

    创建ASP.NET项目 首先,在您的本地计算机上使用Visual Studio或其他可用IDE工具创建一个新的ASP.NET项目。 添加DES加密算法库 为了实现DES加密解密操作,需要添加一个DES算法库,这里我们可以使用.NET框架内置的System.Security.Cryptography命名空间,该命名空间提供了强大的加密算法库。 在您的项目中,通…

    C# 2023年6月3日
    00
  • Unity制作游戏自定义按键详解

    Unity制作游戏自定义按键详解 在 Unity 中,通过自定义按键来更好地控制游戏角色或执行一些特殊动作是很常见的需求。在这篇文章中,我们将详细讲解如何使用 Unity 的 Input Manager 来自定义按键。 1. Input Manager 输入管理器(Input Manager)是 Unity 中一个非常常用的工具,它可以让我们很方便地管理游戏…

    C# 2023年5月15日
    00
  • C# 执行CMD命令并接收返回结果的操作方式

    下面我会详细讲解如何在C#中执行CMD命令并接收返回结果的操作方式,步骤如下: 第一步:引入命名空间和创建Process对象 using System.Diagnostics; 通过引入System.Diagnostics命名空间,我们可以使用Process类来执行CMD命令并接收返回结果。我们需要先创建一个Process对象来执行CMD命令,以便可以设置P…

    C# 2023年5月15日
    00
  • C# Directory.GetFiles()函数案例详解

    C# Directory.GetFiles()函数案例详解 1. 函数介绍 C# Directory.GetFiles() 函数是一个用于获取指定目录下的所有文件的方法。该方法接受一个目录路径作为参数,并返回一个字符串数组,包含了指定目录中所有文件的路径信息。 该函数的定义如下: public static string[] GetFiles(string …

    C# 2023年6月1日
    00
  • 利用C#实现进程管理器

    利用C#实现进程管理器 概述 进程管理器是一款常见的系统工具,用于查看当前系统正在运行的进程,以及进行操作,例如结束进程,查看进程详细信息等等。本文将利用C#语言,实现一个进程管理器。 实现步骤 获取系统中所有的进程 利用.NET Framework提供的System.Diagnostics命名空间,可以很方便地获取当前系统中正在运行的进程。可以使用Proc…

    C# 2023年6月6日
    00
  • C#中后台post请求常用的两种方式总结

    C#中后台post请求常用的两种方式总结 在C#后台开发中,我们常常需要使用HTTP请求来和其它服务器进行通信。使用POST请求可以在请求体中携带参数,更适合传输大量数据,因此本文将主要介绍C#中后台post请求常用的两种方式:HttpClient和WebRequest。 HttpClient HttpClient是一个相对简单易用的类库。它的作用是向指定U…

    C# 2023年5月31日
    00
  • asp.net(C#)防sql注入组件的实现代码

    防止 SQL 注入攻击一直是 WEB 应用程序中的一个大问题。ASP.NET C# 是一个强大的技术框架,它也提供了多种方法来防止 SQL 注入攻击,其中一种方法是使用防 SQL 注入组件,我们可以编写一个可重复使用的防 SQL 注入组件,然后在应用程序中重复使用它。下面将介绍如何在 ASP.NET C# 中开发防 SQL 注入组件,以及代码示例。 防 SQ…

    C# 2023年6月3日
    00
  • c#如何显式实现接口成员

    当一个类实现了一个接口时,它必须实现该接口中所定义的所有成员。这些成员可以是抽象的或者是具有实现的。 在某些情况下,我们可能需要在实现类中对接口的方法进行定制化的实现,而又不希望这个接口的方法对外暴露。这时候,我们可以使用“显式实现接口成员”的方式来实现。 以下是实现的步骤: 第一步:定义接口 在开始定义类时,首先要定义一个接口,该接口必须在类中实现。例如,…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部