javascript - 在加载的ajax内容上绑定(bind)点击事件

标签 javascript ajax function-binding

我正在尝试通过ajax加载内容,然后对这些内容执行一些点击事件。

所以基本上我想首先加载内容(在本例中为按钮),然后对其应用一些点击事件。

因此我使用回调来首先加载内容,然后应用点击事件,但这里我遇到一个问题,内容是在回调函数之后加载的,我不想这样,我想先加载内容然后执行回调函数,如何解决这个问题?

为了实现这一目标,到目前为止,我有以下代码。

我在food.php中执行了以下代码:

<button onclick="findWeek(fun)">week</button>    // fun is callback function passed to findWeek()

//findWeek 函数 ------ AJAX 请求加载按钮 ------:

function findWeek(fun)      
             {              
                var xhr =  new XMLHttpRequest();
                xhr.open("GET" ,"start.php",true);
                xhr.send(null);
                xhr.onreadystatechange = function(){
                    if( (xhr.readyState == '4') && ( xhr.status == '200') ){

                        document.getElementById("stats").innerHTML = xhr.responseText;
                    }

                };


                fun();
            }

//fun 函数,是一个回调函数,我假设当 findWeek()函数加载内容,这意味着它将从 start.php 页面加载所需的按钮,并将这些按钮插入 food.php 内的以下 div。

<div id = 'stats'>
</div>

之后,我希望能够单击那些加载的按钮,这些按钮应该位于上面的 div 中。

这就是为什么我有 fun() 函数,如下所示。

注意:我已经为加载的按钮定义了类.dayBtns

function fun(){

    function myfunction(){
        alert('just clicked the button');
    }
    var dayBtns = document.getElementsByClassName('dayBtns');
    alert('contents should be loaded');
    for(var i = 0; i < dayBtns.length; i++){
        console.log(dayBtns[i]);
        btns[i].addEventListener('click', myfunction);
        }

}

问题是fun()函数执行后正在加载内容,如何限制fun()函数在数据未加载之前不执行?

请帮忙,谢谢!

最佳答案

只需将 fun() 放入 onreadystatechange 中,如下所示 -

function findWeek(fun) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "start.php", true);
    xhr.send(null);
    xhr.onreadystatechange = function() {
        if ((xhr.readyState == '4') && (xhr.status == '200')) {

            document.getElementById("stats").innerHTML = xhr.responseText;
            fun();
        }

    };


}

innerHTML 是在调用函数 fun 之后设置的,因此此时 DOM 中没有元素。

这里的代码也有一个拼写错误:

 for(var i = 0; i < dayBtns.length; i++){
    console.log(dayBtns[i]);
    btns[i].addEventListener('click', myfunction);
 }

应该是:

 for(var i = 0; i < dayBtns.length; i++){
    console.log(dayBtns[i]);
    dayBtns[i].addEventListener('click', myfunction);
 }

注意dayBtnsbtns

关于javascript - 在加载的ajax内容上绑定(bind)点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55359762/

相关文章:

javascript - 如何柯里化(Currying) jQuery 方法——哪个 `this` 值将传递 jQuery 对象?

javascript - 在 jQuery 中创建元素时如何使用数据集属性?

javascript - jQuery Mobile - 仅在指向特定页面时删除后退按钮

javascript - POST 成功后 Ajax 重定向到另一个页面

javascript - Rails AJAX 部分无需提交表单

javascript - Google map API 页面未加载 - 解析 XML 错误

javascript - 确定 JavaScript 函数是否为绑定(bind)函数

php - Ajax调用PHP Mysql公共(public)静态函数

javascript - console.log() 在控制台以外的对象上调用