javascript - xhr 在 Firefox 上发布数据和页面重定向 : NS_BINDING_ABORTED

标签 javascript firefox xmlhttprequest jspsych

我正在尝试编写托管在 LAMP 服务器上的 jsPsych 实验。一切都运转良好;最后,我尝试通过执行重定向来转到下一个任务。

这是代码:

saveData(save_url, data_dir, file_name, extension, redirect_html, redirectToNextPage);

function saveData(save_url, data_dir, file_name, extension, redirect_html, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', save_url); // 'write_data.php' is the path to the php file used to save the data
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.onreadystatechange = function() {
        if (xhr.readyState === XMLHttpRequest.DONE) {
            if (xhr.status === 200) {
                // Data was saved successfully, now trigger the callback function
                callback(redirect_html);
            } else {
                // Handle any errors that occurred during data saving
                console.error('Error saving data: ' + xhr.status);
            }
        }
    };
    xhr.send(JSON.stringify({file_name: file_name, extension: extension, data_dir: data_dir, data: jsPsych.data.get().csv()}));
}

function redirectToNextPage(redirect_html) {

    if((window.location.href).indexOf('?') != -1) {
        var variables = window.location.href.split('?')[1]; 
        redirect_html += "?" + variables;
    };

    last_trial_data = jsPsych.data.getLastTrialData().trials[0];
    if(last_trial_data["chain"] != "false"){
        window.location = redirect_html;
    };  

}

尽管在调用函数之前等待使用 xhr.readyState === XMLHttpRequest.DONExhr.status === 200 确认数据已发布执行重定向,在 Firefox 上运行实验会引发 NS_BINDING_ABORTED 错误。我知道发生的情况是请求被重定向取消(因为在没有重定向的情况下运行实验可以正常工作并且数据已发送)。

有人知道出了什么问题吗?

最佳答案

我们最终找到了一个似乎可以通过调用 Promise 来工作的解决方案,我将把下面的代码留给后代:

function saveData(save_url, data_dir, file_name, extension) {
    return new Promise((resolve, reject) => {
        var xhr = new XMLHttpRequest();
        xhr.open('POST', save_url);
        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.onreadystatechange = function() {
            if (xhr.readyState === XMLHttpRequest.DONE) {
                if (xhr.status === 200) {
                    resolve();
                } else {
                    reject(new Error('Error saving data: ' + xhr.status));
                }
            }
        };
    xhr.send(JSON.stringify({file_name: file_name, extension: extension, data_dir: data_dir, data: jsPsych.data.get().csv()}));
    });
}

// Usage of async/await for the redirection
async function saveAndRedirect(save_url, data_dir, file_name, extension, redirect_html) {
    try {
        await saveData(save_url, data_dir, file_name, extension);
        redirectToNextPage(redirect_html);
    } catch (error) {
        console.error(error);
    }
}

function redirectToNextPage(redirect_html) {

    if((window.location.href).indexOf('?') != -1) {
        var variables = window.location.href.split('?')[1]; 
        redirect_html += "?" + variables;
    };

    last_trial_data = jsPsych.data.getLastTrialData().trials[0];
    if(last_trial_data["chain"] != "false"){
        window.location = redirect_html;
    };  

}

关于javascript - xhr 在 Firefox 上发布数据和页面重定向 : NS_BINDING_ABORTED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76775226/

相关文章:

javascript - jquery页面加载获取另一个页面内容,鼠标悬停如何加载一次

javascript - 如何通过 DOM 隐藏记录中的 RESET 按钮?

javascript - .css 文件中的图像链接或使用 laravel 中的 .js 文件调用 Controller

javascript - 如何让 ng-class 与 $dirty 在指令中工作?

css - Flexbox 容器中的省略号

php - 对如何在 php 中读取 curl 返回的 xml 对象感到困惑

php - 使用 XmlHttpRequest 检查发布数据的完整性?

css - Internet Explorer 的样式问题 - 最有可能的简单解决方案

javascript - 你如何使 form.submit() 在 firefox 中工作?

javascript - XHR上传以及上传开始的那一刻