Javascript 在 Internet Explorer 上只运行一次,当开发者工具打开时运行正常

标签 javascript internet-explorer

我们在 IE 11 上运行的 javascript 有一个不寻常的问题。我在我们的一台运行 IE8 的服务器上试过,同样的问题出现了。但是,它在 Chrome 和 Mozilla 上运行良好。 这是有问题的代码:

SetGuideFatningCookie(fid); //set a cookie according to user choice

var validFatningCombo = ValidFatningCheck(); //ask server if user choice is valid using XMLHttpRequest GET request
if(validFatningCombo)
    window.location.href = GetGuideTilbehoerURL(); //if valid redirect user to next page
else
    popAutoSizeFancy("#GLfancy"); //if not show a fancybox with error text

用户从 7 个选项中选择一个。然后他们单击一个运行上述代码的按钮。该代码设置一个包含用户选择的 cookie,并询问服务器该选择是否有效。如果有效 - 我们重定向用户,如果无效,我们打开一个包含一些错误文本和两个按钮的花式框 - “再试一次”(关闭框,他们可以再试一次)和“向我们发送消息”(将用户重定向到我们的“问我们一个问题”页面)。

代码在用户第一次进入这个过程时运行良好。 然而,如果他们选择了一个无效的选择,他们会关闭花式框并尝试选择另一个选择并继续 -> 然后花式框总是出现,无论用户选择什么。 如果他们选择了一个有效的选择并继续,将被重定向到下一页,然后返回此页面并选择一个无效的选择并按继续 -> 然后他们可以继续到下一页而不会出现 fancybox。

但是,如果打开IE的开发者工具,代码每次都运行正确。 我发现许多线程描述这是 console.log 的问题。我已经从我们所有的 .js 文件中删除了对 console.log 的所有引用。它可能是我们正在使用的外部库之一,例如 jquery、modernizr、fancybox 和 menucool 的工具提示库。

因此我尝试为 IE 包含一个控制台回退功能,就像这个线程建议的那样: Why does JavaScript only work after opening developer tools in IE once?

我目前正在尝试这个,我已经尝试了我链接到的线程中的所有其他后备控制台替换。

if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };

我试过包括它:

  1. 在我们的 .js 文件中的某处
  2. 加载我们所有的 .js 文件和所有外部库后,head 中的脚本元素
  3. 在加载我们所有的 .js 文件和所有外部库之前在 head 中编写脚本元素
  4. 里面 $(document).ready(function() {}); , 在加载所有其他 js 后在 head 的脚本元素中

到目前为止,我在这 4 个位置尝试过的后备代码都没有解决问题。它在 IE 中的行为始终相同。到目前为止,除了“控制台”之外,我找不到其他解释来解决这个问题,所以如果有人对此有任何见解,我们将不胜感激。

编辑:我将包含更多信息: 打开开发人员工具这一行为消除了不需要的行为。控制台中从未显示任何错误。 我检查了服务器端以查看服务器是否收到来自 ValidFatningCheck() 的调用;事实证明,调用仅在第一次进行(或者如果开发人员工具是打开的 - 每次)这是相当神秘的,因为重定向/花式框行出现在服务器调用之后并且它不会运行失败,即使它运行错误。

function ValidFatningCheck(){
var requestUrl = '/Tools.ashx?command=validscreen';

var req = new XMLHttpRequest();
req.open('GET', requestUrl, false);
req.send(null);

var res = "";
if (req.readyState==4)
    res = req.responseText;

if(res == "true")
    return true;
return false;
}

更新:通过向我的 XMLHttpRequest 添加时间戳来解决问题,建议使用多个回复。我没有意识到 XMLHttpRequest 使用 AJAX,所以我忽略了它作为问题的可能原因。

最佳答案

(我发表了评论,但现在将其作为答案,因为它似乎已经解决了问题)获取请求由 IE 缓存,但是当开发人员控制台打开时,它不会执行此缓存。

三种修复方法:

  1. 在请求中添加时间戳以欺骗浏览器认为它每次都在发出新请求

    var requestUrl = '/Tools.ashx?command=validscreen&time='+new Date().getTime();
    
  2. 将响应头设置为无缓存

  3. 发出 POST 请求,因为这些请求未被缓存 (正如@juanmendes 所指出的,您没有编辑资源并不理想)

关于Javascript 在 Internet Explorer 上只运行一次,当开发者工具打开时运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26526148/

相关文章:

javascript - jQuery UI 关闭动态对话框...或者只是打开的对话框

javascript - IE 与 Firefox/Chrome/Safari 中的表格行高行为

javascript - OOP javascript,从方法中的AJAX 'statement',如何调用该类的另一个方法?

删除 mysql 数据的 Javascript 警报在新选项卡中打开

java - 编写可移植到 Firefox、Chrome 和 IE 上运行的自定义协议(protocol)处理程序

html - 背景图片在 IE 中不显示

css - Internet Explorer 7 & 8 边距显示问题

html - 如何在 IE 中使用 CSS 剪辑路径?

javascript - 如果我没有域,如何将 CORS header 添加到我的 REST API?

javascript - PHP/JS Froala 图片上传无法正常工作