【问题标题】:JavaScript function not called from onclick attribute correctly未从 onclick 属性正确调用 JavaScript 函数
【发布时间】:2013-09-04 20:43:22
【问题描述】:

重要提示!:我必须使用 onclick 属性。在我的情况下,在事件侦听器/处理程序上使用 Jquery 不是一个选项。为什么?我的代码中有很多其他的东西依赖于属性及其在代码中的表现。

onclick 属性中添加警报时,它按预期工作,警报显示在弹出窗口中并返回 false 防止通过按下按钮提交表单:

<script>
    $().ready(function() {
        $('.pretty .prettycheckbox').click(function () {

            var myType = $('.pretty .prettycheckbox').find("input[class^=car-type]:checked").val();

            if (myType == 1) {
                $('#sendButton').attr("onclick", "alert('Direct!'); return false;");
            } 

            if (myType == 2) {
                $('#sendButton').removeAttr("onclick");
            }

        });
    });
</script>

但是从 onclick 属性调用函数时它不起作用,例如:

<script>
    $().ready(function() {
        $('.pretty .prettycheckbox').click(function () {

            var myType = $('.pretty .prettycheckbox').find("input[class^=car-type]:checked").val();

            if (myType == 1) {
                $('#sendButton').attr("onclick", "submitDB(); return false;");
            } 

            if (myType == 2) {
                $('#sendButton').removeAttr("onclick");
            }

        });
    });
</script>

<script>
    $().ready(function(){
        function submitDB() {
            alert('From function!');
        }
    });
</script>

知道为什么吗?

为什么这个函数被忽略了?

【问题讨论】:

  • 你使用的是jQuery,使用on绑定事件处理器,不要添加事件处理器属性。
  • @zzzzBov 我需要使用onclick 属性。
  • @JimmyHendrikz 为什么。您需要添加 onclick 而不是正常的点击事件的原因很可能是由于另一个需要修复的问题。
  • @JimmyHendrikz “为什么”非常重要。父级的 .outerHTML 或 .innerHTML 的目标是返回具有该属性的元素吗?还是将事件绑定到元素。您尝试做的事情可能有解决方案,但除了添加 onclick 属性外,我们还需要知道您到底要做什么。添加所述属性的目的是什么?为什么需要以这种方式添加它?你已经知道它不能按照你的方式工作。
  • 这并没有告诉我为什么......

标签: jquery


【解决方案1】:

您的代码不起作用,因为您的范围问题很大。 onclick 属性只能针对全局范围内的函数。在您的情况下,您的函数不在全局范围内。

<script>
    $().ready(function(){
        function submitDB() {
            alert('From function!');
        }
    });
</script>

应该是

<script>
        function submitDB() {
            alert('From function!');
        }
</script>

演示:http://jsfiddle.net/ZeLXY/

我仍然不明白为什么“学校”会尝试教如何使用 jquery 添加 onclick 属性。没有理由你会想要使用 javascript 向元素添加 onclick 属性,更不用说 jQuery。

【讨论】:

    【解决方案2】:

    总而言之,你做错了。

    如果要将事件处理程序绑定到元素,请使用on(或适当的别名,例如click):

    $('#sendButton').on('click', function () {
        alert('Direct!');
        return false;
    });
    

    绝对没有理由使用onclick 属性,甚至尝试动态设置此类属性。

    要取消绑定事件处理程序,请使用off

    $('#sendButton').off('click');
    

    【讨论】:

    • @JimmyHendrikz,鉴于您的更新,您仍然做错了。不要永远依赖onclick 或其他此类事件属性。他们不可靠。
    【解决方案3】:

    试试这个:

    if (myType == 1) {
        $('#sendButton').on("click", function() {
            alert("clicked"); //sorry forgot to edit the callback in!
        });
    } 
    if (myType == 2) {
        $('#sendButton').off("click");
    }
    

    如果您必须使用 onclick,请不要使用 jquery。

    【讨论】:

      【解决方案4】:

      这不是一个好习惯。您应该将事件绑定到不更改属性的元素。

      $('#sendButton').off("click").on("click", submitDB);
      

      我刚刚发现了问题-> http://jsfiddle.net/VJSRy/ IE。如果你真的想使用这种错误的方法,你应该将你的函数定义为全局函数。即:

      submitDB = function() {
         alert('From function!');
      }
      

      即跳过 submitDB 前面的 var

      【讨论】:

      • 不需要在属性前面加上javascript:
      • 谢谢,但是 submitDB() 函数没有被触发 ;(
      • $().ready(function(){ 应该是 $(document).ready(function(){ 不是吗?即你确定调用了就绪处理程序。还要检查jsfiddle.net/VJSRy 它在那里工作。
      • 该死,如果我使用 $(document).ready(function(){ ,表单仍然会被触发,并且 onclick 会忽略 ecen,但无论如何感谢。当我无法使用 onclick 触发简单的警报功能时,真是令人沮丧。知道为什么它不起作用吗?
      • @JimmyHendrikz 当我们逐行获取您的代码并简单地删除函数周围准备好的文档时,它正在工作。
      猜你喜欢
      • 2012-06-26
      • 2023-03-18
      • 2015-07-30
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多