【问题标题】:Onchange within a loop循环内的 Onchange
【发布时间】:2020-06-20 02:04:57
【问题描述】:

我正在制作一个与 MediaWiki 相关的 JavaScript 解决方案,但它的用途并不是真正需要的信息,所以我将它留在那里。我有以下功能:

wgAjaxLicensePreview=true;
function getLicensePreview(num) {
    console.log('glp num', num);
    window.licenseSelectorCheck = function () {
        var selector = document.getElementById("license" + num);
        var selection = selector.options[selector.selectedIndex].value;
        if (selector.selectedIndex > 0) {
            if (selection == "") {
                // Option disabled, but browser is broken and doesn't respect this
                selector.selectedIndex = 0;
            }
        }
        // We might show a preview
        wgUploadLicenseObj.fetchPreview(selection);
    };
    var wpLicense = document.getElementById('license' + num);
    console.log('glp wpLicense', wpLicense);

    if (mw.config.get('wgAjaxLicensePreview') && wpLicense) {
        // License selector check
        wpLicense.onchange = licenseSelectorCheck;

        // License selector table row
        var wpLicenseRow = wpLicense.parentNode.parentNode;
        var wpLicenseTbody = wpLicenseRow.parentNode;

        var row = document.createElement('tr');
        var td = document.createElement('td');
        row.appendChild(td);
        td = document.createElement('td');
        td.id = 'mw-license-preview' + num;
        row.appendChild(td);

        wpLicenseTbody.insertBefore(row, wpLicenseRow.nextSibling);
        console.log('glp row', row);
    }

    window.wgUploadLicenseObj = {

        'responseCache': {
            '': ''
        },

        'fetchPreview': function (license) {
            if (!mw.config.get('wgAjaxLicensePreview'))
                return;
            for (cached in this.responseCache) {
                console.log('glp fp responseCache', this.responseCache);
                if (cached == license) {
                    this.showPreview(this.responseCache[license]);
                    return;
                }
            }
            $('#license' + num).injectSpinner('license' + num);

            var title = document.getElementById('imagename' + num).value;
            if (!title)
                title = 'File:Sample.jpg';

            var url = mw.util.wikiScript('api')
                 + '?action=parse&text={{' + encodeURIComponent(license) + '}}'
                 + '&title=' + encodeURIComponent(title)
                 + '&prop=text&pst&format=json';

            var req = sajax_init_object();
            req.onreadystatechange = function () {
                if (req.readyState == 4 && req.status == 200) {
                    console.log('glp fp response', req.responseText);
                    wgUploadLicenseObj.processResult(eval('(' + req.responseText + ')'), license);
                }
            };
            req.open('GET', url, true);
            req.send('');

        },

        'processResult': function (result, license) {
            $.removeSpinner('license' + num);
            this.responseCache[license] = result['parse']['text']['*'];
            console.log('glp pr result license', result, license);
            this.showPreview(this.responseCache[license]);
        },

        'showPreview': function (preview) {
            var previewPanel = document.getElementById('mw-license-preview' + num);
            console.log('glp sp', previewPanel, preview, previewPanel.innerHTML == preview);
            if (previewPanel.innerHTML != preview)
                previewPanel.innerHTML = preview;
        }

    };
}

问题在于我的循环

  var limit = this.max < this.fileCount ? this.max : this.fileCount;
    console.log('glp', this.max, this.fileCount);
    for (i = 1; i <= limit; i++) {
    console.log('glp i', i);
    getLicensePreview(i);
    }

没有正确迭代其中的一部分,我已将问题缩小到wpLicense.onchange = licenseSelectorCheck;,它正在重写事件处理程序以仅检查最后一个 num

【问题讨论】:

  • 与问题无关:selector.options[selector.selectedIndex].value;可以简化为selector.value
  • 您将函数分配给window.licenseSelectorCheck 有什么原因吗?每次调用该函数时,您都会重新分配该全局变量。
  • 我仍在阅读并试图理解代码......
  • 这些窗口变量无法工作...您每次都在循环中覆盖它们
  • 大声笑,我什至不确定我是对的。随意发布您实际编码的内容。

标签: javascript jquery loops for-loop mediawiki


【解决方案1】:

感谢 Barmar 的帮助,我能够通过将 wgUploadLicenseObj 变量设置为局部变量而不是全局变量 window.wgUploadLicenseObj 来解决此问题。 我的最终功能是:

wgAjaxLicensePreview=true;
function getLicensePreview(num) {
    window.licenseSelectorCheck = function () {
        var selector = document.getElementById("license" + num);
        var selection = selector.options[selector.selectedIndex].value;
        if (selector.selectedIndex > 0) {
            if (selection == "") {
                // Option disabled, but browser is broken and doesn't respect this
                selector.selectedIndex = 0;
            }
        }
        var wgUploadLicenseObj = {

        'responseCache': {
            '': ''
        },

        'fetchPreview': function (license) {
            if (!mw.config.get('wgAjaxLicensePreview'))
                return;
            for (cached in this.responseCache) {
                if (cached == license) {
                    this.showPreview(this.responseCache[license]);
                    return;
                }
            }
            $('#license' + num).injectSpinner('license' + num);

            var title = document.getElementById('imagename' + num).value;
            if (!title)
                title = 'File:Sample.jpg';

            var url = mw.util.wikiScript('api')
                 + '?action=parse&text={{' + encodeURIComponent(license) + '}}'
                 + '&title=' + encodeURIComponent(title)
                 + '&prop=text&pst&format=json';

            var req = sajax_init_object();
            req.onreadystatechange = function () {
                if (req.readyState == 4 && req.status == 200) {
                    wgUploadLicenseObj.processResult(eval('(' + req.responseText + ')'), license);
                }
            };
            req.open('GET', url, true);
            req.send('');

        },

        'processResult': function (result, license) {
            $.removeSpinner('license' + num);
            this.responseCache[license] = result['parse']['text']['*'];
            this.showPreview(this.responseCache[license]);
        },

        'showPreview': function (preview) {
            var previewPanel = document.getElementById('mw-license-preview' + num);
            if (previewPanel.innerHTML != preview)
                previewPanel.innerHTML = preview;
        }

    };
        // We might show a preview
        wgUploadLicenseObj.fetchPreview(selection);
    };
    var wpLicense = document.getElementById('license' + num);

    if (mw.config.get('wgAjaxLicensePreview') && wpLicense) {
        // License selector check
        wpLicense.onchange = licenseSelectorCheck;

        // License selector table row
        var wpLicenseRow = wpLicense.parentNode.parentNode;
        var wpLicenseTbody = wpLicenseRow.parentNode;

        var row = document.createElement('tr');
        var td = document.createElement('td');
        row.appendChild(td);
        td = document.createElement('td');
        td.id = 'mw-license-preview' + num;
        row.appendChild(td);

        wpLicenseTbody.insertBefore(row, wpLicenseRow.nextSibling);
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多