【问题标题】:javascript append onclick func is not definedjavascript append onclick func 未定义
【发布时间】:2018-06-09 14:18:02
【问题描述】:

function ABC(obj) {
  $("#ID").append('<div onclick="obj.func();">TEST</div>');
}

ABC({func: function() { alert("abc"); } })
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="ID"></div>

如果你运行这个函数,你将无法运行 obj.func

为什么不叫定义?

我该如何解决?

【问题讨论】:

  • obj.func() 函数里面有什么?obj 里面有什么?
  • @AlivetoDie: function() { alert("abc"); }

标签: javascript jquery onclick append


【解决方案1】:

HTML 属性不是附加事件侦听器的好方法,因为它们在全局范围内运行。 obj 存在于函数的作用域中,因此 onclick 属性中的代码不会看到它。您应该单独创建元素并附加侦听器:

function ABC(obj) {
    // Create a DIV element
    var div = $("<div>");

    // Add an event listener that calls the function
    div.on("click", function () {
        obj.func();
    });

    // Append the created element to #ID
    $("#ID").append(div);
}

函数表达式确实可以访问其父范围。

如果obj.func 不使用this 并且不返回值,您也可以直接将该函数用作监听器:

div.on("click", obj.func);

【讨论】:

  • 如果要追加的项目很多,一路怎么处理?
  • @YongBinLim:“一路”是什么意思?
  • 有一个whole lot of reasons不使用HTML事件属性。
  • 我使用翻译器。所以我的句子不自然。我有很多标签要“附加”去做。是否要按上述方式添加标签?
  • @YongBinLim:您可以在循环中将它用于任意数量的标签,如果这是您的要求。
【解决方案2】:
function ABC(obj) {

    $("#question-header").append('<div id="this-div">TEST</div>');
   $("body").off("click","#this-div").on("click","#this-div",function(){ obj.func(); });
}

ABC({func: function() { alert("abc"); } }); 

这是 100% 的工作..检查这个,你甚至可以放置点击以外的事件......

【讨论】:

  • 但是,您实际上并没有解释问题或解决方案。
【解决方案3】:

实际的问题是当元素被点击时,ABC 函数已经完成并且它的obj 参数将超出范围。由于您的代码将 obj 硬编码到点击事件代码中,因此 obj 在此时没有任何意义,您会收到 obj is not defined 错误。

现在,HTML 事件属性不再将函数作为其值,它们采用可执行的 JavaScript 指令。因此,您不希望将 onclick 设置为函数,而是希望将其设置为要执行的 JavaScript 字符串,并且可以从传入的函数返回:

function ABC(obj) {
  // By invoking the function stored in the passed in object, we can 
  // inject the appropriate JavaScript to run when the element gets clicked.
  $("#ID").append('<div onclick="' + obj.func() + '">TEST</div>');
}

ABC({ 
   func: function() { return "alert('abc');"; }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="ID"></div>

【讨论】:

  • 为什么对正确解释问题的有效解决方案投反对票?
  • 在字符串中嵌入 JavaScript 不是一个好主意。参见例如setTimeout.
  • @Ryan 这不是重点。我的回答不推荐这种方法。它正确回答了问题,并显示了如何使其发挥作用。
  • 我很确定我的想法是在点击时调用obj.func(),良好的做法永远不会离题*。
  • @Ryan 回答问题始终是排名第一的工作。这就是我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2011-09-30
相关资源
最近更新 更多