如何将参数传递给 jQuery document.ready() 函数(ASP.NET MVC、C#)

Posted

技术标签:

【中文标题】如何将参数传递给 jQuery document.ready() 函数(ASP.NET MVC、C#)【英文标题】:How to pass parameters to jQuery document.ready() function (ASP.NET MVC, C#) 【发布时间】:2011-08-24 00:46:32 【问题描述】:

我想从我的视图中将参数传递给 jQuery document.ready() 函数

$(document).ready(function (parameter)
        $('select[name=Product]').val(parameter);
);

如何从我的视图中触发事件并传递参数?我使用 Razor 作为视图引擎。

谢谢

【问题讨论】:

【参考方案1】:

你不能。 document.ready 函数不带参数。例如,您可以将此参数定义为视图中的全局变量:

<script type="text/javascript">
    var model = @html.Raw(Json.Encode(Model));
</script>

然后在你单独的 javascript 文件中使用这个全局变量:

$(function() 
    $('select[name=Product]').val(model.SomeProperty);
);

【讨论】:

感谢您的回答。我使用母版页 (_Layout) 放置 和所有 Javascript,但我想将此行为限制为特定视图。 @Francesco,在这种情况下,您可以在 _Layout 中定义一个 Scripts 部分,您可以在特定视图中覆盖该部分,其中包含全局 javascript 变量的定义。 我使用了这个实现,但没有 @Html.Raw(Json.Encode()) 部分。【参考方案2】:

为避免使用全局变量,可以定义一个闭包,然后将此函数返回给ready()

function start(parameter)

    return function()
    
        /*...use parameter */
        alert('parameter: ' + parameter);
    

然后拨打ready():

$(document).ready(start('someValue'));

您还可以在外部 .js 文件中定义启动函数,并在主 html 文件中调用 ready(例如)。 例子: 外部脚本.js:

function start(parameter)

   return function()
   
        /*...use parameter */
        alert('parameter: ' + parameter);
   

html 文件:

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript" src="script.js"></script>
<script>
$(document).ready(start('someValue'));
</script>
</head>
<body>
</body>
</html>

在后一个文件中调用ready() 允许您将服务器参数传递给您的函数。示例(使用 php。在这种情况下,您必须将扩展名从 html 更改为 php 到此文件):

$(document).ready(start('<?php echo $serverParameter; ?>'));

【讨论】:

【参考方案3】:

您可以通过闭包有效地完成此操作。也就是说,如果您正在调用类似 $(document).ready(startup) 的东西,那么您可以轻松地重写 startup 以便您可以使用参数调用它,例如$(document).ready(startup(7))。巴勃罗给出了一个很好的被低估的答案,值得举一个更详细的例子。

示例

这是一个显示警报的页面,由$(document).ready() 调用,计算6*9

<html>
  <head>
    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script>
      function startup() 
        alert('6 * 9 = ' + 6 * 9);
      
    </script>
  </head>

  <body>
    Hello!
    <script>
      $(document).ready(startup);
    </script>
  </body>
</html>

假设您想用可变参数替换“9”。执行此操作的 4 步方法是:

    参数化函数。 将函数体包装在一个闭包中。即return function() ...。 参数化主体。 使用参数调用函数。

将其应用于上述代码:

<html>
  <head>
    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script>
      function startup(x)  // Step 1 - Parameterize the function
        return function()  // Step 2 - Put body in "return function() ..."
        alert('6 * '+x+' = ' + 6 * x); // Step 3 - Parameterize the body.
         // (closing brace for step 2)
      
    </script>
  </head>

  <body>
    Hello!
    <script>
      $(document).ready(startup(7)); // Step 4 - Call function with parameter.
    </script>
  </body>
</html>

这会显示警报“6 * 7 = 42”。

发生了什么?

$(document).ready() 将函数作为其参数。这就是为什么在上面的第一个版本中只使用startup 作为参数来调用它。相反,如果您使用startup() 调用它,您将不再传递startup 函数,您将传递startup返回值

由于$(document).ready() 将函数作为其参数,这就是我们给它的:startup 在上面的第二个版本中被转换为一个返回函数的函数,它的参数 x 设置为我们的值最初通过它。也就是说,startup(7) 将一个函数返回到 $(document).ready(),并将 x 的值设置为 7

OP 的问题

要专门将此应用于 OP 的问题,请将调用重写为

$(document).ready((function(x)  return function() 
    $('select[name=Product]').val(x);
)('name'));

其中'name' 可以是替换x 的任何其他值。不需要全局变量。

更多信息:JavaScript closures。

【讨论】:

我不明白为什么您需要步骤 2 和 3。步骤 1 和 4(参数化并使用该参数调用)就足够了,不是吗?你有'启动'函数范围来隐藏你的变量和里面的所有东西。为什么需要额外的功能? 根据您指出的那个“JavaScript 闭包”问题,“在 JavaScript 中,如果您在另一个函数中声明一个函数,那么外部函数的局部变量在从它返回后仍然可以访问。”所以这是一种私人访问它们的方法。 如果你只做了第 1 步和第 4 步,startup(7) 会返回什么?答:没什么。这就是为什么您需要第 2 步和第 3 步来返回函数的原因。 $(document).ready(f) 不会立即执行 f。一旦文档准备好,它就会调用f()。你需要给它传递一个函数。【参考方案4】:

如果参数值内联在您的视图中,您可以简单地将参数值回显到 Javascript 代码中。

$(document).ready(function ()
        $('select[name=Product]').val('@ViewBag.Parameter');
);

【讨论】:

感谢您的回答。我从不使用 ViewBag,因为我无法测试它的行为 ViewBag 只是一个例子。当然,这也适用于模型属性。

以上是关于如何将参数传递给 jQuery document.ready() 函数(ASP.NET MVC、C#)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过将参数传递给 URL 来使用 jQuery 刷新页面

如何将附加参数传递给 jQuery DataTable ajax 调用?

jquery动画回调 - 如何将参数传递给回调

如何使用 jquery 将可变参数传递给匿名函数?

将参数传递给更高级别的事件处理程序

如何使用 Kendo UI 将参数传递给 HttpHandler?