1

我是 Mac 上的初级程序员(所以我没有 ie)并构建了一个相对简单的 ajax jquery 应用程序,其中基于$msg存储在数据库中的内容,它显示表单元素(可以是按钮、选择/下拉菜单,或者只是文本和链接),在被点击后,返回数据库并更改$msg.

我的代码在 Chrome 和 Firefox 中运行良好,但是当我在所有版本的 IE 中测试时,表单元素(延迟 5 秒)恢复到加载页面时的位置。在感到沮丧之后,我查找了 SO 答案并阅读了有关文档类型有时会出现问题的信息,因此我将文档类型更改为 html5 文档类型,但没有任何改变。

这是我的代码:

$(document).ready(function() {  



$('.checkIn').click(function() {
    var $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of button  (1 for the first button)
    // You can map this to the corresponding button in database...
    $.ajax({
        type: "POST",
        url: "checkin.php",
        // Data used to set the values in Database
        data: { "checkIn" : $(this).val(), "buttonId" : data},
        success: function() {
            // Hide the current Button clicked
            $e.hide();
            var $container = $e.closest("div.jcontainer");
            // Get the immediate form for the button
            // find the select inside it and show...

            $container.find('.locationSelect').fadeIn();
        }
    });
});
$('.reset').click(function() {
    var $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of button  (1 for the first button)
    // You can map this to the corresponding button in database...
    $.ajax({
        type: "POST",
        url: "reset.php",
        // Data used to set the values in Database
        data: { "reset" : $(this).val(), "buttonId" : data},
        success: function() {
            // Hide the current Button clicked
            $e.fadeOut();

            var $container = $e.closest("div.jcontainer");
            // Get the immediate form for the button
            // find the select inside it and show...
            $container.find('.finished').fadeOut();
            $container.find('.checkIn').fadeIn();
        }
    });
});
$('.locationSelect').change(function(e) {
  if($(this).children(":selected").val() === "CheckOut") {
    $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    $.ajax({
        type: "POST",
        url: "checkout.php",
        // Data used to set the values in Database
        data: { "checkOut" : $(this).val(), "buttonId" : data},
        success: function() {
            // Hide the current Button clicked
            $e.fadeOut();
            var $container = $e.closest("div.jcontainer");
            // Get the immediate form for the button
            // find the select inside it and show...
            $container.find('reset').fadeIn();
            $container.find('.finished').fadeIn();

        }
    });
  }
  else{
    $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of select (1 for the first select)
    // You can map this to the corresponding select in database...
    $.ajax({
        type: "POST",
        url: "changeloc.php",
        data: { "locationSelect" : $(this).val(), "selectid" : data},
        success: function() {
            // Do something here
        }
    });
  }
});
setInterval(function(){

    $('.jcontainer').each(function() {
        var $e = $(this);
        var dataid = $e.data("param").split('_')[1] ;
        $.ajax({
            url: 'heartbeat.php',
            method: 'POST',
            contentType: "application/json",
            cache: true,
            data: { "dataid": dataid },
            success: function(data){


                var msg = $.parseJSON(data);

                if (msg == ""){ //after reset or after new patient that is untouched is added, show checkin
                    $e.find('.checkIn').show();
                    $e.find('.locationSelect').hide();
                    $e.find('.finished').hide();
                    $e.find('.reset').hide();
                }
                if ((msg < 999) && (msg > 0)){ // after hitting "Check In", Checkin button is hidden, and locationSelect is shown
                    $e.find('.checkIn').hide();
                    $e.find('.locationSelect').show();
                    $e.find('.finished').hide();
                    $e.find('.reset').hide();
                    $e.find('.locationSelect').val(msg);
                }
                if (msg == 1000){ //after hitting "Checkout", Option to reset is shown and "Finished!"
                    $e.find('.checkIn').hide();
                    $e.find('.locationSelect').hide();
                    $e.find('.finished').show();
                    $e.find('.reset').show();
                }


            }
       });


    });
  },5000);
});

我试图尽可能多地评论我的代码,但基本上第一部分所做的只是将$msg每种类型的表单元素交互上传到我的 php 页面(单击按钮,单击选择选项,单击链接) . 然后第二部分是每 5 秒刷新一次,以确保当前在计算机 1 上显示的表单元素在计算机 2 上显示(延迟 5 秒)。

感谢您的所有帮助,如果您需要更多详细信息/信息,请询问!谢谢!

4

1 回答 1

2

我不是 100% 确定你遇到了什么问题,所以如果这太离谱了,我很抱歉,但可能是 IE 正在缓存你的 Ajax 请求。您可以尝试在函数之前插入它:

$.ajaxSetup({
  cache: false
});

注意:如果可行,请不要留下这样的最终代码。禁用所有浏览器的 Ajax 缓存不是一个好主意,但有时需要对旧版本的 IE 执行此操作。我建议在您的 HTML 中使用 IE 条件注释,如下所示:

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie10 lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="no-js lt-ie10 lt-ie9 lt-ie8 ie7"> <![endif]-->
<!--[if IE 8]>    <html class="no-js lt-ie10 lt-ie9 ie8"> <![endif]-->
<!--[if IE 9]>    <html class="no-js lt-ie10 ie9"> <![endif]-->
<!--[if gt IE 9]><!-->
<html class='no-js'>
  <!--<![endif]-->

然后你可以检测到 IE,它$.ajaxSetup可能看起来像这样:

$.ajaxSetup({
  cache: !$('html').hasClass('lt-ie9'); //false if lower than IE9
});
于 2012-12-21T14:29:19.390 回答