“函数”在Javascript中没有定义错误:什么是调用我的函数的正确方法?

问题描述:

我明白一点,因为这个职位:JQuery, setTimeout not working为什么它不工作,但保持一切这样,什么是正确的方式来呼吁_finalvalidate()内我的div?“函数”在Javascript中没有定义错误:什么是调用我的函数的正确方法?

<script type="text/javascript"> 

$(document).ready(function(){ 

//On Submitting 
function _finalvalidate(){ 
    alert('ppp'); 
    if(validateName() & validateEmail() & validatePhone()){ 
     alert('OK'); 
     return true 
    } 
    else{ 
     alert('false'); 
     return false; 
    } 
} 
}); 

</script> 


<div onclick="_finalvalidate();"> Take action </div> 

这样做会是这样的jQuery的方法:

<script type="text/javascript"> 

    $(document).ready(function(){ 

     //When clicking on the div, execute this 
     $("#validation").click(function() { 
      alert('ppp'); 
      if(validateName() & validateEmail() & validatePhone()){ 
       alert('OK'); 
       return true 
      } 
      else{ 
       alert('false'); 
       return false; 
      } 
     }); 
    }); 

</script> 
.... 
<div id="validate"> Take action </div> 

如果你真的想使用javascript函数样式,您必须将函数放在document.ready()函数之外,然后您可以使用onclick属性调用它:

<script type="text/javascript"> 

    function _finalvalidate(){ 
     alert('ppp'); 
     if(validateName() & validateEmail() & validatePhone()){ 
      alert('OK'); 
      return true; 
     } 
     else{ 
      alert('false'); 
      return false; 
     } 
    } 


</script> 
.... 
<div onclick="_finalvalidate();"> Take action </div> 

在这种情况下,你不再拥有jQuery了。

+0

谢谢大家的回答,这对我们帮助很大。我决定使用上面的第一个例子,它是完美的 – Joel

如果你想从div的onclick属性中调用你的方法,你需要使它在全局范围内可用。以下是一些选项。不过,我要指出的是,选项1在这些日子里一般都会皱眉,而选项2只是愚蠢的。对于这种事情,推荐的方法是不要显眼地连接你的事件处理程序,就像在Cory的答案中一样。

选项1

<script type="text/javascript"> 

function _finalvalidate(){ 
    alert('ppp'); 
    if(validateName() & validateEmail() & validatePhone()){ 
     alert('OK'); 
     return true 
    } 
    else{ 
     alert('false'); 
     return false; 
    } 
} 

</script> 


<div onclick="_finalvalidate();"> Take action </div> 

选项2

<script type="text/javascript"> 

var _finalvalidate; 

$(document).ready(function() { 
    _finalvalidate = function(){ 
     alert('ppp'); 
     if(validateName() & validateEmail() & validatePhone()){ 
      alert('OK'); 
      return true 
     } 
     else{ 
      alert('false'); 
      return false; 
     } 
    }; 
}); 

</script> 


<div onclick="_finalvalidate();"> Take action </div> 
+0

我认为他想要使用JQuery的答案 –

+0

详细说明,这将函数放入全局命名空间(显然是你想要的)。正如所写,您的函数是传递给'document.ready'的匿名函数的局部变量,并且只会在该匿名函数内部可见。 – harpo

为了保持它在jQuery的,我想给你的DIV ID标签,并使用一个jQuery onclick事件调用它。你也确定你想在你的if或逻辑中按位操作&

<script type="text/javascript"> 

$(document).ready(function() { 
    $('#callme').click(function() { 
     alert('ppp'); 
     if(validateName() && validateEmail() && validatePhone()){ 
      alert('OK'); 
      return true; 
     } else { 
      alert('false'); 
      return false; 
     } 
    } 
}); 

</script> 

<div id="callme"></div> 

您的函数不存在于您要调用它的窗口范围内。我想你的代码更改为:

<div id="action">Take Action</div> 

然后你的JavaScript是:

<script type="text/javascript"> 

$(document).ready(function(){ 

    //On Submitting 
    $('#action').click(function() { 
     alert('ppp'); 
     if(validateName() & validateEmail() & validatePhone()){ 
      alert('OK'); 
      return true 
     } else { 
      alert('false'); 
      return false; 
     } 
    }); 

</script> 
+0

感谢您的回答。你是否告诉我,用“onclick”事件直接从我的div调用它是不可能的? (无论是否它的良好做法) – Joel

如果您使用jQuery,您应该将事件与jQuery事件绑定。但是,至于为什么它不起作用,以下是关于JS范围规则的一些信息。


你申报稍后使用不应该在jQuery的文档准备回调的任何功能。你不能得到它,因为它隐藏在一个函数中,它提供了它自己的私人范围,你无法从外面获得。

var f = function() { 
    var inner = function() {}; 
}; 
inner(); // out of scope 

您可以将其导出到全局对象,使它在任何地方都可用。

var f = function() { 
    window.inner = function() {}; 
}; 
inner(); // works! 

但最好的方法是在第一个地方简单地声明它在全局范围内。

var f = function() {}; // Now this function has no purpose anymore at all! 
var inner = function() {}; 
inner(); // works 

您的代码问题在于您的函数没有在全局上下文中定义,而是它在document.ready回调函数中定义。因此,当浏览器获得onclick并对字符串进行评估时,它在全局上下文中找不到该函数名称。你能解决这个问题的一些不同的方式:

1)更改功能在全球范围内被定义如下:

//On Submitting 
window._finalvalidate = function(){ 

2)将您的_finalvalidate()功能document.ready()外侧,以便它在全球范围。没有理由在document.ready(),因为它没有马上执行。

3)更改为指定事件处理程序的“jQuery”方式,而不是将Click = xxx放在HTML中,因为Cory在他的答案中已经说明了这一点。