Изменение в пределах цикла - PullRequest
0 голосов
/ 20 июня 2020

Я делаю решение JavaScript, связанное с MediaWiki, но то, для чего оно предназначено, на самом деле не является необходимой информацией, поэтому я оставлю его там. У меня есть следующая функция:

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;
        }

    };
}

Проблема в том, что l oop У меня

  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 .

1 Ответ

0 голосов
/ 20 июня 2020

Благодаря помощи Бармара, я смог решить эту проблему, сделав переменную 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);
    }
}
...