相关疑难解决方法(0)

为什么setTimeout(fn,0)有时会有用?

我最近遇到了一个相当讨厌的错误,其中代码是<select>通过JavaScript动态加载的.这种动态加载<select>具有预先选择的值.在IE6中,我们已经有了修复所选内容的代码<option>,因为有时它<select>selectedIndex值与所选<option>index属性不同步,如下所示:

field.selectedIndex = element.index;
Run Code Online (Sandbox Code Playgroud)

但是,此代码无效.即使selectedIndex正确设置了字段,最终也会选择错误的索引.但是,如果我alert()在正确的时间插入声明,则会选择正确的选项.考虑到这可能是某种时间问题,我尝试了一些随机的东西,我之前在代码中看到过:

var wrapFn = (function() {
    var myField = field;
    var myElement = element;

    return function() {
        myField.selectedIndex = myElement.index;
    }
})();
setTimeout(wrapFn, 0);
Run Code Online (Sandbox Code Playgroud)

这有效!

我已经找到了解决问题的方法,但是我很不安,因为我不知道为什么这会解决我的问题.有人有官方解释吗?使用"稍后"调用我的功能可以避免哪些浏览器问题setTimeout()

javascript dom event-loop

833
推荐指数
11
解决办法
23万
查看次数

document.getElementById(id).focus()不适用于firefox或chrome

当我做onchange事件时,它进入该函数的验证,但焦点不是我正在使用 document.getElementById('controlid').focus();

我使用的是Mozilla Firefox和谷歌浏览器,两者都无效.我不想要任何IE浏览器.任何人都可以告诉我我的原因是什么.

提前致谢

这是代码:

var mnumber = document.getElementById('mobileno').value; 
if(mnumber.length >=10) {
    alert("Mobile Number Should be in 10 digits only"); 
    document.getElementById('mobileno').value = ""; 
    document.getElementById('mobileno').focus(); 
    return false; 
}
Run Code Online (Sandbox Code Playgroud)

javascript

54
推荐指数
6
解决办法
14万
查看次数

向DOM添加内容时,我需要等待多长时间(setTimeout)才能影响类更改?

这是场景...我向DOM添加了一个元素,该元素的初始类具有0的不透明度,然后添加了一个类以触发不透明度过渡到1-一个很好的简单淡入。代码如下所示:

.test {
  opacity: 0;
  transition: opacity .5s;
}

.test.show {
  opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)
const el = document.createElement('div')
el.textContent = 'Hello world!'
el.className = 'test' // <div class="test">Hello world!</div>
document.body.appendChild(el)
Run Code Online (Sandbox Code Playgroud)

现在要触发淡入,我只需将show类添加到元素中:

setTimeout(() => {
  el.classList.add('show')
}, 10)
Run Code Online (Sandbox Code Playgroud)

我使用的是setTimeout,因为如果不这样做,则将立即添加该类,并且不会发生淡入。它将最初在屏幕上可见,没有过渡。因此,我一直以来将10ms用于setTimeout,并且一直有效……直到现在。我遇到了需要将其设置为20ms的情况。有点脏 有人知道是否有安全的时间使用吗?我是否缺少有关DOM在这里的工作方式的信息?我知道我需要给浏览器一些时间来确定布局和绘画(因此setTimeout),但是要花多少时间呢?我感谢任何见识!

html javascript css

4
推荐指数
1
解决办法
66
查看次数

在 vuejs 中使用 vue $nextTick 和 setTimeout 0 有什么区别

Vue.js 文档中,$nextTick 被解释为:

推迟在下一个 DOM 更新周期后执行的回调。在您更改一些数据以等待 DOM 更新后立即使用它。

伟大的!所以第二个语句说在一些数据改变后立即使用它,我知道 setTimeout with 0 也被立即调用。我创建了这个小沙箱来理解这两种方法,但我似乎还是没有弄明白这两种方法之间的区别?

任何关于它们差异的解释将不胜感激。

settimeout vue.js vuejs2

3
推荐指数
1
解决办法
1417
查看次数

SAPUI5中如何将属性值传递给init方法?

假设我有一堂课

sap.ui.core.Control.extend("sap.my.MyButton", {
    metadata: {
        properties: {                
            "isButtonWithMenu": {
                type: "boolean",
                defaultValue: true
            }
        }
    }
},

init: function () {
    if (this.getIsButtonWithMenu()) {
         this.myButton = this._createMenuButton();
    } else {
         this.myButton = this._createNormalButton();
    }
    var baseBox = new sap.m.FlexBox();
    baseBox.addItem(this.myButton);
    this.setLayout(baseBox);
}
Run Code Online (Sandbox Code Playgroud)

现在我想将 的值传递isButtonWithMenu到我的init方法中,并执行以下操作:

var myButton = new sap.my.MyButton({isButtonWithMenu: false});
Run Code Online (Sandbox Code Playgroud)

但这不起作用,这意味着我没有在类中获得传递的值。但是,当我更改它时defaultValue,它确实有效,那么,这里出了什么问题以及我如何实现我的目标?

javascript sapui5

2
推荐指数
1
解决办法
1509
查看次数

竞争条件:在加载React之前尝试播放视频

我正在使用ReactJS中的视频播放器.基本上,我已经设置了一个基于cookie的介绍视频,它是可以跳过的.当它被跳过时,我希望我的主视频自动开始播放.我这样做的方式看起来像这样(问题在于setTimeout()部分,我知道这没有意义)

  skipIntro() {
    if (this.state.index === 0) {
        this.handleVisit(MAX_COOKIES_INTRO);
        this.setState({
            index: ++this.state.index,
        });
        this.videoRef.updatePlaybackTime(0);
        setTimeout(() => {
                            this.videoRef.play();
                          }, 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我不使用setTimeout,this.videoRef.play();则不执行.起初我以为是因为它是在主视频有时间加载之前被异步调用的.因为我等了0ms,我很困惑.为什么这样做?如果没有setTimeout调用,我真的更喜欢这样做.

javascript video reactjs

1
推荐指数
1
解决办法
53
查看次数

标签 统计

javascript ×5

css ×1

dom ×1

event-loop ×1

html ×1

reactjs ×1

sapui5 ×1

settimeout ×1

video ×1

vue.js ×1

vuejs2 ×1