【问题标题】:Difference in variable handling between Chrome and FirefoxChrome 和 Firefox 变量处理的区别
【发布时间】:2019-08-27 04:22:36
【问题描述】:

我有一个 Javascript 变量的问题,它只出现在 Firefox 中而不出现在 chrome 中。

<input id="test" type="file"/>
<script>
    var f = document.getElementById('test').files;
    var value = f;
    var i = setInterval(() => {
        f = document.getElementById('test').files;
        if (f == value) {
            console.log(true);
            console.log(f);
            console.log(value);
        } else {
            console.log(false);
            console.log(f);
            console.log(value);
            value = f;
            clearInterval(i);
        }
    }, 1000);
</script>

此代码在控制台日志中保持为真,并且应该跟踪变量更改。 在 chrome 中,如果我选择一个带有文件输入标签的文件。它将跟踪变量“value”和变量“f”之间的变量差异。这将导致它进入 console.log(false) 并终止 setInterval。但是,在使用文件输入选择文件后,在 firefox 中,两个变量都会立即更新,并且 firefox 将无法跟踪任何差异。导致脚本永远不会结束。

这里有一个小提琴:https://jsfiddle.net/y9jh6a1t/

我希望在 Firefox 中复制 chrome 的行为。

【问题讨论】:

  • var f = document.getElementById('test').files;; 在这里取出额外的半成品可能会有所帮助。他们倾向于以不同的方式处理此类有问题的事情。
  • @Jbluehdorn oof 这只是一个错字。但这不是问题的原因。眼尖
  • 嗯,我不确定。尽管我会更改您的代码以使用 onChange 处理程序作为输入,而不是每秒轮询一次。它会更快地响应并减少开销。
  • @Jbluedhorn 是的,我很想更改为 onchange 函数。但是这段代码只是对框架一部分的重新创建,我想为此找到解决方法。

标签: javascript google-chrome variables firefox


【解决方案1】:

我不明白你为什么在结束指令上使用两个分号:

var f = document.getElementById('test').files;;

浏览器(Firefox 和 Chrome)实现了两种不同的解释器,Firefox(SpyderMonkey) 和 Chrome(v8)。然后,可以让规则接受来自 Chrome 的规则,而不接受来自 Firefox 的规则,或者相反。

为防止出现bug,修复线路到达后再回来调试。

注意:我测试了您的 sn-p 并删除了双分号 (;;)。这对我有用。

好代码。

【讨论】:

  • 我已经更新了代码和sn-p,但它仍然无法在Firefox中运行。顺便说一句,这段代码是一个迷你框架的一部分的复制品。半冒号只是我在重构时打错了字。我的坏
【解决方案2】:

不确定它是否会满足您的条件。但不要使用文件,而是使用 files.length。

var f = document.getElementById('test').files.length;
    var value = f;
    var i = setInterval(() => {
        f = document.getElementById('test').files.length;
        if (f == value) {
            console.log(true);
            console.log(f);
            console.log(value);
        } else {
            console.log(false);
            console.log(f);
            console.log(value);
            value = f;
            clearInterval(i);
        }
    }, 1000);

【讨论】:

  • 嗯,我想到了这个。但是如果一个人选择了一个特定的文件怎么办。然后选择另一个文件。计数器将保持在 1 并且不会触发第二次。但我已经找到了解决方法。谢谢回复伙伴!
猜你喜欢
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2011-07-19
相关资源
最近更新 更多