相关疑难解决方法(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万
查看次数

ng-repeat完成后调用函数

我想要实现的基本上是"on ng repeat finished rendering"处理程序.我能够检测到它何时完成,但我无法弄清楚如何从中触发一个功能.

检查小提琴:http://jsfiddle.net/paulocoelho/BsMqq/3/

JS

var module = angular.module('testApp', [])
    .directive('onFinishRender', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            if (scope.$last === true) {
                element.ready(function () {
                    console.log("calling:"+attr.onFinishRender);
                    // CALL TEST HERE!
                });
            }
        }
    }
});

function myC($scope) {
    $scope.ta = [1, 2, 3, 4, 5, 6];
    function test() {
        console.log("test executed");
    }
}
Run Code Online (Sandbox Code Playgroud)

HTML

<div ng-app="testApp" ng-controller="myC">
    <p ng-repeat="t in ta" on-finish-render="test()">{{t}}</p>
</div>
Run Code Online (Sandbox Code Playgroud)

答案:来自finishmove的工作小提琴:http …

events directive handler ready angularjs

250
推荐指数
5
解决办法
14万
查看次数

为什么这个基于setTimeout的代码在Firefox中没有超时(在Internet Explorer/Chrome中有效)?

我有以下代码,它演示了直接从事件触发器调用长时间运行的函数与使用的区别setTimeout().

预期行为:

  • 当按下第一个按钮时,它会显示为按下,计算运行几秒钟,然后当计算完成时,按钮再次按下,第二列从"尚未计算"变为"计算完成".(我不会详细说明为什么会发生这种情况; 它在相关答案中进行了解释.)

  • 按下第二个按钮时,按钮立即按下; 第二列立即更改为"正在计算..."文本.当计算在几秒钟后完成时,第二列从"计算..."变为"完成计算".

实际发生了什么:

  • 这在Chrome中完美运行(两个按钮都按预期运行)

  • 这在Internet Explorer 8中完美运行

  • 这在Firefox(第25版)中不起作用.具体来说,第二个按钮作为第一个按钮表现为100%.

    • 在更改超时setTimeout()01无影响

    • 在更改超时setTimeout()0500 作品

这让我有一个很大的难题.

根据为什么setTimeout()有效的原因,而缺少一个没有的原因,延迟对事物的运作方式应该没有影响,因为这里setTimeout()的主要目的是改变排队顺序,而不是拖延事情.

那么,为什么它不能在Firefox上使用延迟0或1,但按预期工作延迟500(并且适用于Internet Explorer 8/Chrome上的任何延迟)?

更新:除了下面的源代码,我还做了一个JSFiddle.但由于某些原因,JSFiddle甚至拒绝加载我的Internet Explorer 8,因此对于该测试,需要以下代码.

更新2:有人提出了dom.min_timeout_valueFirefox中配置设置问题的可能性.我已将其编辑为4到0,重新启动浏览器,并且没有修复任何内容.它仍然失败,超时为0或1,成功为500.


这是我的源代码 - 我只是将其保存到C:驱动器上的HTML文件中,并在所有三个浏览器中打开:

<html><body>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>

<table border=1>
    <tr><td><button id='do'>Do long calc - bad status!</button></td>
        <td><div id='status'>Not Calculating yet.</div></td></tr>
    <tr><td><button id='do_ok'>Do long calc - good status!</button></td>
        <td><div id='status_ok'>Not Calculating yet.</div></td></tr> …
Run Code Online (Sandbox Code Playgroud)

html javascript firefox cross-browser settimeout

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

如何在AngularJS应用程序中执行计算密集型任务?

我正在使用JavaScript,HTML5和AngularJS编写应用程序.它只需要在最近的浏览器上工作(例如,IE10但不是IE9).

在应用程序的几个地方,将会有计算密集型任务,例如XML解析,base64解码; 这些可能涉及相当大的数据(几MB肯定是可能的).

如果我只是打电话之类的东西atob()或者DOMParser.parseFromString(),我会得到秒钟甚至几分钟无响应的浏览器.这显然是用户不能接受的.

我使用Angular的Q服务来实现异步访问外部Web服务,从而避免在等待响应时挂起浏览器.但是这样的操作已经有了异步API.

那些没有自己的异步API的计算关注任务怎么样?

我可以将这些任务中的一些分开,链接承诺.这有帮助吗?浏览器消息队列在每个任务结束时是否会自动旋转?

我看到"Web Workers"的存在,似乎提供了适当的多线程.但是它们似乎具有相当差的能力来向/从工作线程传输对象.当然,像我这样的人来自C#.Net似乎也是这样!例如,我想将Angular服务(内置和我自己的)注入到线程上的任务中.而且我也不想在线程之间复制大量数据.

其他人是否实现了包含严重计算的响应式客户端Web应用程序?如果是这样,他们用什么来实现这一目标?

javascript html5 angularjs

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