Javascript仅在Internet Explorer上运行一次,在开发人员工具打开时正常运行

时间:2014-10-23 10:28:57

标签: 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 - “再试一次”(关闭框,他们可以再试一次)和“向我们发送消息”(将用户重定向到我们的“问我们一个问题“页面”。

代码在用户第一次进入此过程时运行正常。 但是,如果他们选择了无效选项,他们会关闭fancybox并尝试选择其他选项并继续 - >无论用户选择什么,总是会出现花式框。 如果他们选择了有效选项并继续,请重定向到下一页,然后返回此页面并选择无效选项并按继续 - >然后他们可以继续到下一页,而不会出现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文件和所有外部库后,
  3. 脚本元素
  4. 加载所有.js文件和所有外部库之前的head元素
  5. 内部$(文件).ready(function(){}); ,在加载所有其他js之后的head中的脚本元素
  6. 到目前为止,我在这4个位置中的任何一个尝试过的后备代码都没有解决问题。它在IE中的行为总是一样的。到目前为止,我找不到另一个解决方案而不是“控制台”解决这个问题,所以如果有人对它有任何见解,我将不胜感激。

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

    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,所以我忽略了它作为问题的可能原因。

1 个答案:

答案 0 :(得分:6)

(我发表了评论,但现在会解决这个问题,因为它似乎已经解决了问题)获取请求被IE缓存但是当开发者控制台打开时它不会执行此缓存。

三种修复方法:

  1. 为请求添加时间戳,以诱使浏览器认为每次都在发出新请求

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

  3. 发出POST请求,因为这些请求未被缓存 (正如@juanmendes所指出的那样,你不是在编辑资源)