我正在编写一个ubiquity插件,ajax查询的长函数回调阻塞了GUI线程,导致firefox锁定.
显而易见的解决方案似乎是使用某种延迟执行(即我们希望定期将执行此查询功能的执行添加到事件队列的末尾,然后允许执行其他命令.
我能想到这样做的唯一方法是使用settimeout,其超时为零......这是保证可行的,还是有更好的方法.
该HTML5 规范,各国setTimeout可以在不这是应该经过多少毫秒将函数"处理程序"被安排说额外的"超时"的说法来运行.
handle = window . setTimeout( handler [, timeout [, arguments ] ] )
Schedules a timeout to run handler after timeout milliseconds. Any arguments are passed straight through to the handler.
Run Code Online (Sandbox Code Playgroud)
但是,我没有找到解释当没有设置"超时"时间段时会发生什么的任何地方.
一个示例用法是Raphael库中的动画实现.
animationElements[length] && win.setTimeout(animation);
Run Code Online (Sandbox Code Playgroud) $(document).ready (
function ready() {
var tester = $.ajax({
async: false,
url: "test_parse.php"
}).responseText;
document.getElementById('test').innerHTML = tester;
setTimeout(ready(), 3000);
}
);
Run Code Online (Sandbox Code Playgroud)
嘿伙计我想在这个内部调用一个函数但是每次我这样做时我的浏览器只是继续加载并最终Apache关闭(显然不是我预期的结果).认为你们可以帮我找出解决方案吗?谢谢!
我想将一个参数传递给一个名为using的函数setTimeout.我找到了这三个选项:
A = 1;
// Method 1: closure things
setTimeout(function() { whatsA(A); }, 100);
// Method 2: third argument (same result with [A])
setTimeout(whatsA, 100, A);
// Method 3: eval
setTimeout('whatsA(' + A + ')', 100);
A = 2;
function whatsA(X) { console.log(X); }
Run Code Online (Sandbox Code Playgroud)
这在Internet Explorer 9中显示2,undefined和1.
方法1:显然,我不希望在传递之后更改参数(当然在简单整数的情况下).
方法2:如果只有Internet Explorer支持它,这将是完美的.
方法3:这似乎是唯一的选择.但它看起来并不像其他人那么漂亮,传递的东西要被评估而不是功能.
有没有更好的办法?
传递给setInterval函数的回调是否会被触发,即使前一个(由同一个触发setInterval)还没有完成它的工作呢?如果是这样,我该怎么做才能解决这种问题?我应该使用自己的布尔标志(如inProcess)或setTimeout每次调用而不是setInterval?
我在这里阅读了w3schools和其他类似问题的相关页面,但似乎无法理解下面的内容有什么不对:
var myfunc03 = function (i) {
document.getElementById('d01').innerHTML += 100-i+"<br>";
};
var myFunc01 = function() {
i=0;
while (i<100) {
setTimeout(myfunc03(i), 1000)
i++;
}
};
Run Code Online (Sandbox Code Playgroud)
何时myFunc01();运行.
没有任何暂停,i的所有可能值都会立即列出.
这里有逻辑错误吗?
这与以下内容有关:
用于El Capitan的
Safari 9.1 用于Sierra的Safari 10
当浏览器或标签失去焦点(主要是最小化)时,是否有人知道Safari在JavaScript引擎中针对setTimeout()做什么?
我创建了一个简单的JavaScript Web应用程序,该应用程序在Safari中加载,该应用程序调用JavaScript setTimeout(),该方法将在超时值之后传递另一个要执行的函数。该函数将日期/时间打印到控制台,然后以相同的超时值调用setTimeout()。
如果Safari选项卡失去焦点或浏览器最小化,则一段时间后Safari似乎停止执行setTimeout和随后的要调用的函数,直到返回焦点为止,才执行任何函数。就像事件循环停止处理一样。
注意:不会丢失任何函数调用,它们只会暂停,并在浏览器重新获得焦点时重新启动。
我在Firefox,Chrome或IE11中没有注意到这一点。
引起此问题的主要原因是该问题主要是在我维护的Web应用程序中观察到的,该应用程序使用CometD进行与服务器的通信。CometD库使用setTimeout每30秒执行一次向服务器的请求。如果运行该应用程序的浏览器最小化,则CometD似乎停止与服务器通信,直到再次最大化浏览器为止。
所以我正在使用jquery进行自动完成搜索。在执行ajax函数之前,我必须设置一个延迟,因为我不想每次在文本框中键入内容时都要通过调用来锤打服务器。这是我的代码:
function searchVendor() {
setTimeout(searchVendor2, 5000);
}
function searchVendor2() {
var search = $('#inputVendor').val();
$.ajax({
type: 'POST',
url: '/getVendors',
data: {search: search},
dataType: 'json',
success: function(s) {
$('#inputVendor').autocomplete({source: s});
}
});
}
Run Code Online (Sandbox Code Playgroud)
所以函数searchVendor执行了onkeyup
<input type="text" class="form-control input-sm" id="inputVendor" onkeyup="searchVendor()">
Run Code Online (Sandbox Code Playgroud)
如果我键入3个字符(例如sas),则该函数searchVendor2将执行3次。5秒钟的延迟有效,但并没有停止并覆盖之前的延迟setTimeout。
我想发生的是,如果我在文本框中键入一个字符,它将在5秒钟后执行,但是!如果在5秒钟之前输入了新字符,setTimeout则会再次重置为5秒钟。只要用户在文本框中键入内容setTimeout,它就会重置为5秒钟,并且仅在经过5秒钟而无需用户再次键入时才执行。
感谢那些能提供帮助的人!
问题摘要:setTimeout使用React的useEffect挂钩时,无法在移动设备上清除。但是,它们正在桌面上清除。
问题再现:https : //codepen.io/amliving/pen/QzmPYE。
注意:请在移动设备上运行以重现该问题。
我的问题:为什么我的解决方案(如下所述)有效?
详细信息:我正在创建一个自定义钩子以检测空闲状态。叫它useDetectIdle。它会动态地window从一组事件中添加和删除事件侦听器,这些事件侦听器在触发一段时间后会通过调用提供的回调setTimeout。
这是将动态添加到事件,然后从中删除的事件的列表window:
const EVENTS = [
"scroll",
"keydown",
"keypress",
"touchstart",
"touchmove",
"mousedown", /* removing 'mousedown' for mobile devices solves the problem */
];
Run Code Online (Sandbox Code Playgroud)
这是useDetectIdle钩子。此处的重要之处在于,此钩子在其调用组件卸载时应清除所有现有的超时(并删除所有事件侦听器):
const useDetectIdle = (inactivityTimeout, onIdle) => {
const timeoutRef = useRef(null);
const callbackRef = useRef(onIdle);
useEffect(() => {
callbackRef.current = onIdle;
});
const reset = () => {
if (timeoutRef.current) …Run Code Online (Sandbox Code Playgroud) 我按照 W3Schools 的本教程创建了一个图像幻灯片:https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_slideshow_auto
它使用递归函数setTimeout()来自动滑动图像。这对用户的浏览器性能有害吗?或者我可以放心使用它吗?
var slideIndex = 0;
showSlides();
function showSlides() {
var i;
var slides = document.getElementsByClassName("mySlides");
var dots = document.getElementsByClassName("dot");
for (i = 0; i < slides.length; i++) {
slides[i].style.display = "none";
}
slideIndex++;
if (slideIndex > slides.length) {
slideIndex = 1
}
for (i = 0; i < dots.length; i++) {
dots[i].className = dots[i].className.replace(" active", "");
}
slides[slideIndex - 1].style.display = "block";
dots[slideIndex - 1].className += " active";
setTimeout(showSlides, 2000); // Change image every …Run Code Online (Sandbox Code Playgroud) javascript ×10
settimeout ×10
jquery ×2
closures ×1
cometd ×1
loops ×1
mouseevent ×1
react-hooks ×1
reactjs ×1
reactor ×1
recursion ×1
safari ×1
scope ×1
setinterval ×1
ubiquity ×1
while-loop ×1