C# 如何将存储在字符串中的函数添加到jquery。单击事件

C# 如何将存储在字符串中的函数添加到jquery。单击事件,c#,javascript,jquery,C#,Javascript,Jquery,我正在尝试编写一个通用的表生成器,在这里我可以告诉它在每个单元格的onclick事件中调用的函数。然后在页面上的其他位置定义该函数 问题是我无法在正确的时刻获取页面来评估函数。我希望它在构建DOM时将字符串转换为函数,而不是在触发click事件时。也许这在Javascript/JQuery中是不可能的 我最初用C#编写的服务器端代码的简化版本是: 然后,当它在浏览器中呈现为html时,它就起作用了。它变成了: function DoSomething(p) { alert(p);

我正在尝试编写一个通用的表生成器,在这里我可以告诉它在每个单元格的onclick事件中调用的函数。然后在页面上的其他位置定义该函数

问题是我无法在正确的时刻获取页面来评估函数。我希望它在构建DOM时将字符串转换为函数,而不是在触发click事件时。也许这在Javascript/JQuery中是不可能的

我最初用C#编写的服务器端代码的简化版本是:

然后,当它在浏览器中呈现为html时,它就起作用了。它变成了:

 function DoSomething(p)
 {
      alert(p);
 }

<td onclick="DoSomething(4)"></td>
<td onclick="DoSomething(5)"></td>
出于某种原因,它不会在IE7中触发该事件,但会在Chrome中触发该事件

如果我这样做:

var functionCall = 'DoSomething(4);';
$('#detailCell').attr('onclick', functionCall);
var functionCall = 'DoSomething(4);';
$('#detailCell1').click(function () { eval(functionCall); });
functionCall = 'DoSomething(5);';
$('#detailCell2').click(function () { eval(functionCall); });
var functionCall = 'DoSomething(4);';
$('#detailCell1').click(eval(functionCall));
当添加click事件时,它不会将functionCall更改为一段文本。而是在单击单元格时评估functionCall。这意味着functionCall的值现在是错误的

e、 g.它总是做一些事情(5),即使我点击detailCell1,因为那是functionCall的最后一个值

如果我这样做:

var functionCall = 'DoSomething(4);';
$('#detailCell').attr('onclick', functionCall);
var functionCall = 'DoSomething(4);';
$('#detailCell1').click(function () { eval(functionCall); });
functionCall = 'DoSomething(5);';
$('#detailCell2').click(function () { eval(functionCall); });
var functionCall = 'DoSomething(4);';
$('#detailCell1').click(eval(functionCall));
添加单击事件时,而不是单击事件时,它会立即在functionCall中运行函数

我希望这有点道理,因为很难解释

基本上我只是想能做到

<td onclick="any javascript I feel like storing in a string"></td>

使用JQuery

这可能吗

这是我第一次在stackoverflow上发表文章,所以请温柔点……

试试这个

var functionCall = 'DoSomething(4);';

$('#detailCell1').click((function (code) {
  return function () { 
     eval(code); 
  };
}(functionCall)));
这里发生的事情是,在创建处理程序时,通过将字符串分配给参数“code”来捕获该字符串

在当前场景中,单击处理程序在单击时使用字符串的值,而不是在创建处理程序时使用

这就是所谓的结束

(function (code) {
  return function () { 
     eval(code); 
  };
}(functionCall));
functionCall值分配给代码参数。
现在,当您更改functionCall时,代码参数仍然引用旧值。

不清楚为什么函数调用应该是字符串。正如我所看到的,您有许多单元格,它们应该为每个单元格启动一个具有不同参数的函数

在这种情况下,我下一步要做:

TableCell detailCell = new TableCell();
detailCell.Attributes.Add("class", "detailCell");
detailCell.Attributes.Add("data-num", "4");

detailCell = new TableCell();
detailCell.Attributes.Add("class", "detailCell");
detailCell.Attributes.Add("data-num", "5");
然后,在js中的某个地方:

$(function() {
    $(".detailCell").click(function(){
        DoSomething($(this).data("num"));
    });
})
需要表单元格上的
class
,以便轻松地将单击处理程序分配给所有详细信息单元格,因此不需要编写类似以下内容:

$('#detailCell1').click(function () { DoSomething(4); });
$('#detailCell2').click(function () { DoSomething(5); });
detailCell.Attributes.Add(“data num”,“5”)
允许输入应该用作
剂量测量的参数的数字
。您可以在此行中看到它:
DoSomething($(this.data(“num”))
jQuery.data
函数正在使用。而
将指向正在单击的元素。
$(function(){})
-这是
jQuery.ready
函数的缩写。使用它,您可以保证当页面准备好使用时,该函数中的代码将被执行

您可以简单地创建一个函数值(函数在JS中也是对象),而不是首先将其创建为字符串,然后尝试对该字符串求值

所以不是

var functionCall = 'DoSomething(4);';
$('#detailCell1').click(eval(functionCall));

这将为每次单击创建一个新函数。(在您的例子中,您可以省略e参数,它只是为了方便地进行任何更改

如果有一组要传递的参数,可以创建一个工厂方法

var doSomethingFactory = function(num){
    return function(e) { DoSomething(num);};
}
$('#detailCell1').click(doSomethingFactory(4));

根据我的理解,您必须使用不同的参数调用不同的函数。要实现这一点,您需要生成字符串,并尝试使用eval()函数调用这些函数。让我们按照以下步骤进行操作

1.只需将这些functioncalls字符串作为数组传递,以便在加载javascript代码时如下所示:

var functioncalls = ['DoSomething(1)','DoSomethingMore(1,2)','DoDifferent("hello world")'];
$(function(){
      functioncalls.forEach(function(functioncall,index){
          $("detailCell"+index).click(function(){ 
                eval(functioncall);
           })
      });
    })
2.然后在javascript中循环函数调用数组并将它们分配给不同的点击事件,为了避免复杂性,我假设您的选择器是#detailCell0、#detailCell1、#detailCell2等等。然后您的代码如下所示

var functioncalls = ['DoSomething(1)','DoSomethingMore(1,2)','DoDifferent("hello world")'];
$(function(){
      functioncalls.forEach(function(functioncall,index){
          $("detailCell"+index).click(function(){ 
                eval(functioncall);
           })
      });
    })

注意:有很多方法可以做到这一点。

为什么你需要它像字符串一样?为什么你问他为什么需要它像字符串一样?为什么你不能直接调用函数。这种方法很奇怪,我不确定为什么函数调用必须存储在字符串变量中。没有任何字符串,这可以用更好的方法来完成。但也许有什么原因这使得使用OP trys之类的字符串变得更容易。@jAndy因为了解任务有助于更好的解决方案可能是一个可行的答案哇,这是可行的,但我并不真正理解它。如果我能在浏览器中编写可爱的编译C#,我将对闭包进行一些研究。非常感谢你的时间Bart。@user2010602而不是emitting函数调用作为字符串使用函数文本。它使代码更快、更易于阅读。没有理由让您有额外的步骤来计算常量(函数调用)。感谢FAngel,如果我找不到一种方法来实现我最初设想的方法,那么使用id属性将成为我的备份方法。