2013-01-01 57 views
1

可能重复:
JavaScript not being called in inline event handler在行功能没有定义

试图建立使用AJAX执行的操作基于喜欢/不喜欢系统一个JavaScript。喜欢和不喜欢的功能被命名为“likeit”和“dislikeit”。

HTML:

<a class="btn" data-toggle="tooltip" title="I like this." id="like" onclick="likeit('abc123');"><i class="icon-thumbs-up"></i></a> 
<a class="btn" data-toggle="tooltip" title="I didn't like this." id="dislike" onclick="dislikeit('abc123');"><i class="icon-thumbs-down"></i></a> 

JS:

$(document).ready(function() { 
    "use strict"; 
    (function likeit(id) { 
     $.post("likeDislike.php", {likeID:id}, function(data) { 
      alert(data); 
      // Nothing to be displayed. 
     }); 
    }); 
    (function dislikeit(id) { 
    }); 
}); 

我得到谷歌浏览器的错误检查元素是:

Uncaught ReferenceError: likeit is not defined 
Uncaught ReferenceError: dislikeit is not defined 

然而,他们被定义在那里。

+0

所以你应该!你的功能被埋在封闭之下。 –

回答

7

您的onclick=".."东西(您不应该使用它)只能访问全局范围。您的函数在document.ready回调函数的范围内定义。

正确的解决方案是使用JavaScript而不是内联事件注册您的处理程序。

$(document).ready(function() { 
    "use strict"; 

    function likeit(id) { ... } 
    function dislikeit(id) { ... } 

    var funcMap = { 
     'like': likeit, 
     'dislike': dislikeit 
    }; 

    $('.btn').on('click', function(e) { 
     e.preventDefault(); 
     var action = $(this).data('action'); 
     var id = $(this).data('id'); 
     var func = funcMap[action]; 
     if(func) { 
      func.call(this, id); 
     } 
    }) 
}); 

你的HTML也需要一些修改:

<a class="btn" data-toggle="tooltip" title="I like this." id="like" data-id="abc123" data-action="like"><i class="icon-thumbs-up"></i></a> 
<a class="btn" data-toggle="tooltip" title="I didn't like this." id="dislike" data-id="abc123" data-action="dislike"><i class="icon-thumbs-down"></i></a> 
+0

那么我怎样才能让它访问全球范围? – TechKat

+0

@TechKat:将其分配给'window.whatever'。但它实际上是一个可怕的解决方案。查看我更新的答案,了解如何正确执行此操作。 – ThiefMaster

+1

亲吻答案,而不是将其标记为解决方案! :) –

1

试试这个

//make sure jquery library loaded here 

<a class="btn" data-toggle="tooltip" title="I like this." id="like" onclick="likeit('abc123');"><i class="icon-thumbs-up"></i></a> 
<a class="btn" data-toggle="tooltip" title="I didn't like this." id="dislike" onclick="dislikeit('abc123');"><i class="icon-thumbs-down"></i></a> 

<script type="text/javascript"> 
function likeit(id){ 
$.post("likeDislike.php", {likeID:id}, function(data) { 
      alert(data); 
      // Nothing to be displayed. 
     }); 

} 
function dislikeit(id) { 
    } 
</script>