javascript append onclick func未定义

时间:2017-12-29 04:50:11

标签: javascript jquery onclick append

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

为什么不定义它?

我该如何解决?

3 个答案:

答案 0 :(得分:0)

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); 且未返回值,您也可以直接将该函数用作侦听器:

function timeout(ms, promise) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            reject(new Error("timeout"))
        }, ms);
        promise.then(resolve, reject)
    })
};

timeout(1000, fetchData.fetchGetResp(restUrl, userToken)).then(responseJson => {
    // console.log(res);
    if (responseJson != '' && responseJson != undefined) {

    }else {
        console.log(responseJson);
        try {
        } catch (error) {
            alert(error.message);
            console.log(error + 'from js file');
        }

     }

}).catch(error => {
    alert(error.message + "Please try again after sometime");
});

答案 1 :(得分:0)

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%正常工作..检查一下,你甚至可以把事件放在点击...

之外

答案 2 :(得分:-1)

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

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

&#13;
&#13;
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');"; }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="ID"></div>
&#13;
&#13;
&#13;