【问题标题】:jQuery - Calling a function inlinejQuery - 内联调用函数
【发布时间】:2009-08-22 12:57:01
【问题描述】:

我正在尝试将一个变量传递给内联的 jQuery 函数(即:在实际链接中使用 onMouseOver="function();"(这是图像映射中的区域标签))。

该函数只有在我将它放在$(document).ready(function(){ 行之前才会被调用,但是这样做会导致 jQuery 出现各种问题。

我想要的只是一个简单的标签(例如<area shape="circle" coords="357,138,17" onMouseOver="change('5');" id="5" /> 来启动一个包含在普通jQuery代码主体中的函数。

为了说明这一点,以下工作:

<script type="text/javascript">
function myfunction(x)    {  alert(x); //Alerts 2  
}
</script>

<img src="/shared_images/loading.gif" border="0" usemap="#Map">
<map name="Map"><area shape="rect" coords="171,115,516,227"
onMouseOver="myfunction('2')"></map>

但以下没有

<script type="text/javascript" src="scripts/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
function myfunction(x)    {  alert(x); //Nothing happens   
}
}
</script>

<img src="/shared_images/loading.gif" border="0" usemap="#Map">
<map name="Map"><area shape="rect" coords="171,115,516,227"
onMouseOver="myfunction('2')"></map>

【问题讨论】:

    标签: javascript jquery inline jquery-events


    【解决方案1】:

    在您的第二个示例中,您已将 myfunction inside 声明为您传递给 .ready() 的匿名函数。这意味着myfunction 是一个局部变量,它只在该匿名函数的范围内,您不能从其他任何地方调用它。

    有两种解决方案。

    首先,您可以在调用.ready() 之外(之前或之后)声明它。这不应该对 jQuery 造成任何干扰。如果确实如此,那么我们欢迎您在 StackOverflow 问题中提出其他问题(可能是简单的语法错误?)。

    其次,您不应该使用onMouseOver="" 来附加事件处理程序(因为它将 JavaScript 与 HTML 混合在一起),所以让我们完全取消它。用这个替换你的 JavaScript:

    $(document).ready(function() {
        $("#that-area-down-there").mouseover(function() {
            alert(2);
        });
    });
    

    还有你的 HTML:

    <area shape="rect" coords="171,115,516,227" id="that-area-down-there" />
    

    (当然,您可能希望将 id 替换为在上下文中更有意义的内容。)

    【讨论】:

    • 这是一个很好的答案。您写到 myfunction 是一个局部变量。你能解释一下函数如何成为变量吗?非常感谢。
    • 在 JavaScript 中,everything 是一个变量(或者,使用更传统的语言,所有东西都是 data),包括函数。当您编写function f() { }; 时,您实际上只是在使用var f = function() { }; 的别名,这使得在JavaScript 中使用“匿名”函数成为可能。在其他语言中,您可以写成int x = 2; f(x); 或简单地写成f(2)。在 JavaScript 中,由于函数和其他所有东西一样都是数据,所以你可以写 var foo = function() {}; f(foo); 或只写 f(function() {}); 理解这一点是理解 JavaScript 的关键。
    【解决方案2】:

    代码不起作用有两个原因。首先,您在调用 ready 函数时缺少右括号,因此会出现语法错误。

    其次,您在函数内部定义的函数仅存在于该范围内。当您退出该功能时,它不再存在。

    例子:

    $(document).ready(function(){
       function myfunction(x) {
          alert(x);
       }
       myfunction(42); // here it works
    }
    
    myfunction(-1); // here it doesn't exist
    

    您可以像这样在函数内全局定义函数:

    $(document).ready(function(){
      myfunction = function(x) {
        alert(x);
      }
    });
    

    【讨论】:

    • 在您的第二个代码示例中,该函数在文档的其余部分中的行为是否与正常函数一样?它可以像普通的javascript函数一样调用 onMouseOver="go();"谢谢
    猜你喜欢
    • 2014-09-04
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多