如何在完成 AJAX 过程之前防止所有链接重定向

How to prevent all links from redirecting before completing an AJAX process

我有一个使用 tinyMCE 的应用程序。在此页面中,用户将撰写一条消息,然后在另一个页面上预览它(不使用 tinyMCE 的预览)。我目前有一个 AJAX 功能,可以在用户点击远离 tinyMCE UI 时保存内容。问题是,我在同一个页面上有不同种类的 link,有时当用户点击 link 时,AJAX 函数无法在重定向前保存内容,从而导致到空白预览或未保存的消息。

<div>
<textarea id='msg'></textarea>
<a id='preview'>Preview</a>
<a id='other_page'>Other Page</a>
<a id='another_page'>Another Page</a>
</div>

这是 JavaScript 处理程序和函数。

    <script>
    // INITIALIZE TINYMCE
    tinyMCE.init({
    // SAVE CONTENT ON BLUR
            editor.on('blur', function() { save_message(this); });
    })

    function save_message(){
        var msg= tinyMCE.get('msg ').getContent();
         $.ajax({
                    statusCode : { 404: function(){alert('Not Found');} },
                    type       : 'post',
                    data       : {msg:msg},
                    url        : '<script_that_handles_save>',
                    success    : function(res){ // DO SOMETHING } 
            }); 
    }

// WHEN PREVIEW IS CLICKED
$('a.preview).click(function(){
          save_message();
});

$('a.other_page).click(function(){
          save_message();
});

$('a.another_page).click(function(){
          save_message();
});
</script>

您可以创建某种标志变量,它会告诉您是否应该阻止链接重定向。在发送 AJAX 请求保存消息之前,将此变量设置为 true,请求成功后将其设置回 false。同时在所有链接上设置一个事件侦听器,它将检查这个标志变量,如果它等于 true,则阻止重定向。

示例代码:

var linksDisabled = false;

function save_message() {
  linksDisabled = true;
  $.ajax({
    success: function() {
      linksDisabled = false;
    }
    // some other options
  })
}

$("a").click(function(event) {
  if (linksDisabled) {
    event.preventDefault();
  }
});

有几点,您的 save_message() 函数是一个 AJAX 调用,需要完成并发回响应才能正常工作。当您单击锚标记时,将调用该函数(根据上面的代码),但页面会在函数 returns 响应之前重定向。 此外,您似乎正在为每个锚标记冗余地调用该函数,为什么不为所有锚标记调用一次,就像这样 a.click(function(){ // your function here });

你的代码逻辑很好,你只需要重新构造和简化它,就像这样:

tinyMCE.init({
// SAVE CONTENT ON BLUR
        editor.on('blur', function() { save_message(this); });
})
$('a').click(function(e){
        // prevent the redirect
        e.preventDefault();
       var msg= tinyMCE.get('msg ').getContent();
       var location = $(this).attr('href');  
      // execute ajax
     $.ajax({
                statusCode : { 404: function(){alert('Not Found');} },
                type       : 'post',
                data       : {msg:msg},
                url        : '<script_that_handles_save>',
                success    : function(res){
                               // redirect on success
                              window.location.href = location
                         }
        });
});