簡體   English   中英

在 jquery 函數中無法識別 JavaScript for 循環中的“i”值

[英]“i” value in JavaScript for loop is not being recognized in a jquery function

我正在使用 jQuery 和 ajax 打開引導模式窗口。 我的代碼在不循環時完美運行,並且我的內容在模式窗口中正確顯示。 但是我在頁面上有五個模態,自然我想使用 for 循環,所以我不會重復我的代碼五次。

寫一個for循環來執行5次代碼似乎很容易,但不知何故,出現了問題,當我將代碼放入for循環時,模態內容不會顯示在打開的窗口中。

這是我需要的代碼,因此我的 modal1.php 文件中的模態內容顯示在模態彈出窗口中。 注意i變量被使用了 3 次; 一次在 jQuery 選擇器中,兩次在 $.ajax(...) 區域:

var i = 1;

$('#modal' + i).on('show.bs.modal', function(e) {
    var id = e.relatedTarget.dataset.id;
    $.ajax({
        type:'post',
        url:'modals/modal' + i + '.php',
        data:{id:id},
        success:function(data){
            $('#modal' + i).html(data);
        }
    });
});

下面的代碼使用變量 i 的方式與上面的代碼完全相同。 但是,在下面的代碼中,modal1.php 內容不顯示(也不顯示任何其他名為“modal[i].php”的文件)。 相反,當它們打開時只出現一個空白的深色背景。

for (i = 1; i < 6; i++) {
    $('#modal' + i).on('show.bs.modal', function(e) {
        var id = e.relatedTarget.dataset.id;
        $.ajax({
            type:'post',
            url:'modals/modal' + i + '.php',
            data:{id:id},
            success:function(data){
                $('#modal' + i).html(data);
            }
        });
    });
}

所以我不明白為什么代碼的 $.ajax() 區域不會識別 for 條件中的 i 變量,但它會在初始 jQuery 選擇器 $('#modal' + i) 中識別它,其中我已經測試過,發現是真的。 有沒有辦法編寫這個循環,以便 ajax 區域識別 i 變量? 或者我的代碼中是否存在我忽略的錯誤?

順便說一句,我注意到有人問過類似的問題,但由於寫得不清楚而被否決了。 我已經閱讀了所有內容,但它們沒有回答我今天提出的問題。

這里的問題是您(無意中)通過閉包引用了一個變量( i )。

因為作用域是由 JavaScript 中的函數決定的,所以用另一個(立即調用的)函數包裝你on用法,以便保存唯一的i

for (i = 1; i < 6; i++) {
    (function() {
        var iModalNumber = i;
        $('#modal' + iModalNumber).on('show.bs.modal', function(e) {
            var id = e.relatedTarget.dataset.id;
            $.ajax({
                type:'post',
                url:'modals/modal' + iModalNumber + '.php',
                data:{id:id},
                success:function(data){
                    $('#modal' + iModalNumber).html(data);
                }
            });
        });
    }());
}

這些問題被否決的原因如此之多,是因為對閉包的問題/誤解太普遍了。 誠然,這是一個難以掌握的概念,您的問題寫得很好。

更多信息: JavaScript 閉包如何工作?

您可能可以不使用循環而是使用 jQuery .each() 並為您的 html 元素添加值屬性來執行此操作。 警告...前面未經測試的代碼。

    jQuery('.modal').each(function(){               // use a class instead of an id
        $(this).on('show.bs.modal', function(e) {    //use $(this) to target
            var i = $(this).val();                   // get the value id            
            var id = e.relatedTarget.dataset.id;    // do your code
            $.ajax({
                type:'post',
                url:'modals/modal' + i + '.php',
                data:{id:id},
                success:function(data){
                    $('#modal' + i).html(data);
                }
            });
        });
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM