我有一个包含 JavaScript 的网页,它使用 jQuery 和 AJAX 调用 C# 方法。这很好用。我想知道如何从 C# 代码调用 JavaScript 函数(如果可能的话)。如果不可能,有其他明智的选择吗?
最佳答案
假设浏览器发起交互
一般来说,您的服务器端 C# 代码将响应客户端代码发起的交互。如果您正在寻找 C# 代码在没有浏览器请求的情况下启动交互的方法,请参阅下面的下一部分。
如果您正在处理整页响应,那么您当然可以只输出包含您希望发生的调用的 script
标记。确保 script
在其调用的函数已由较早的 script
标记定义之后进行调用,并且如果需要要进行 DOM 交互,请务必将该脚本放在页面底部(或使用 jQuery 的 ready
功能)。
响应 Ajax 调用,C# 代码可以返回包含 JavaScript 代码的字符串,然后您的页内代码将执行该字符串(例如,通过 eval
或类似方法),但通常最好以避免这种情况。
相反,让 C# 代码返回数据以响应 Ajax 调用,并让页内代码通过调用适当的函数来响应该数据。
这两者的混合是让您的 C# 代码返回指示要调用哪个函数以及要向其提供什么参数的数据,并拥有一个使用函数名称索引的函数映射,例如:
var functions = {
foo: function(arg0, arg1) {
alert("foo called with " + arg0 + "," + arg1);
},
bar: function(arg) {
alert("bar called with " + arg);
}
};
$.ajax({
url: "/path/to/resource",
dataType: "json",
success: function(data) {
if (data && data.fname && data.args) {
functions[data.fname].apply(undefined, data.args);
}
}
});
在那里,您的 C# 代码将返回一个字符串,其中包含 JSON 中编码的信息。作为具有 fname
属性(给出函数名称的字符串)和 args
属性(传递给函数的参数数组)的对象,jQuery 将反序列化为给你的一个对象。然后我们使用名称 (functions[data.fname]
) 在映射中查找函数对象,并使用内置 Function#apply
调用它并传入参数。这是可行的,因为您可以使用点语法和属性名称文字 (obj.propName = 42
) 或使用括号语法和属性名称字符串 ( >obj["propName"] = 42
),在后一个示例中,字符串可以是任何表达式,包括变量或属性引用 (name = "propName"; obj[name] = 42;
) - 这就是我们在函数
map 上查找函数的方式。
我并不是建议你这样做,只是说这是可能的。
如果您尝试让服务器发起交互
如果您希望服务器连接到浏览器,则必须在它们之间建立一些通信 channel ,或者使用新的(并且受到各种支持)web sockets API,或各种Comet techniques .
关于c# - 从 WebService (.NET) 使用 C# 调用 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287133/