我最近遇到了一个相当讨厌的错误,其中代码是<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()?
当我做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) 这是场景...我向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),但是要花多少时间呢?我感谢任何见识!
从Vue.js 文档中,$nextTick 被解释为:
推迟在下一个 DOM 更新周期后执行的回调。在您更改一些数据以等待 DOM 更新后立即使用它。
伟大的!所以第二个语句说在一些数据改变后立即使用它,我知道 setTimeout with 0 也被立即调用。我创建了这个小沙箱来理解这两种方法,但我似乎还是没有弄明白这两种方法之间的区别?
任何关于它们差异的解释将不胜感激。
假设我有一堂课
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,它确实有效,那么,这里出了什么问题以及我如何实现我的目标?
我正在使用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 ×5
css ×1
dom ×1
event-loop ×1
html ×1
reactjs ×1
sapui5 ×1
settimeout ×1
video ×1
vue.js ×1
vuejs2 ×1