【问题标题】:smart alternative to setTimeoutsetTimeout 的智能替代方案
【发布时间】:2013-11-27 00:43:23
【问题描述】:

我正在使用一些可以添加一些自定义脚本的软件。经过反复试验,我发现这个脚本只有在我这样写的情况下才能工作:

setTimeout(function(){
//code
}, 900);

但我觉得这有点难看,我觉得应该可以做得更聪明。我也不知道在其他计算机上我是否可能需要更长的时间。也许对于其他人,我需要将其设置为 5000,而对于其他人,将其设置为 300 是可以的。

是否可以在加载完所有内容后触发该功能? 这种方法,我试过了,但没有奏效: $(document).ready(function(){ .. }); document.addEventListener('DOMContentLoaded', function() {...}, false);

这是我的完整代码:

setTimeout(function(){
function correct(searchString, replaceString) {
    $("textarea").bind("keyup", function () {
        var $input = $(this),text = $input.val();
        var pos = $(this).prop("selectionStart");
        if (new RegExp(searchString).test(text.substring(pos-searchString.length,pos)) == true) {
            var newText = text.substring(0,pos-searchString.length) + replaceString + text.substring(pos);
            $input.val(newText);
            var newpos = pos - searchString.length + replaceString.length;
            this.setSelectionRange(newpos,newpos);
        }
    });
}
correct("RR", "ℝ");
correct(">=","≥");
}, 900);

我已将其设置为话语论坛 (discourse.org) 中的自定义标题

【问题讨论】:

  • 你试过把它放在一个“准备好的”处理程序中吗? $(function() { /* your code here */ });
  • @NiettheDarkAbsol 是的,不起作用。
  • 你试过把它放在你的 jQuery 包含脚本之后吗?
  • @NiettheDarkAbsol 是的

标签: javascript function settimeout


【解决方案1】:

您最好的选择是参与window.onload 事件:

// cross-browser event listener
function addEvent(evnt, elem, func) {
   if (elem.addEventListener)  // W3C DOM
      elem.addEventListener(evnt,func,false);
   else if (elem.attachEvent) { // IE DOM
      elem.attachEvent("on"+evnt, func);
   }
   else { // No much to do
      elem[evnt] = func;
   }
}
// add the actual event
addEvent('load', window, function(){
    // execute your code here
})

【讨论】:

  • 我在该页面上没有看到任何要绑定的文本区域,请尝试将您对 correct 的调用替换为:console.log("Loaded");
  • 现在您添加了alert,这似乎对我有用。也许绑定没有按预期工作
  • 哈哈,真奇怪,你上过我的网站。您会看到有时 addevent 先加载,有时 settimeout 先加载。有时 addevent 有效,有时并不奇怪。
  • addEvent 将在整个页面加载后被调用,setTimeout 无论如何都会被调用。当您的 setTimeout 执行时,DOM 是否准备好供您定位和操作完全取决于服务器渲染 DOM 所需的时间; addEvent 将总是工作,但它会根据服务器响应时间而花费不同的时间
  • 我的意思是,警报发生了。所以 addEvent 确实有效。但有时似乎为时过早。因为有时键绑定有效,有时则无效。至少在 chrome 中,它是 50-50。在 Firefox 中它一直有效。而在 IE 中它永远不会起作用。
【解决方案2】:

在文档准备好时执行。

function correct(searchString, replaceString) {
    $("textarea").bind("keyup", function () {
        var $input = $(this),text = $input.val();
        var pos = $(this).prop("selectionStart");
        if (new RegExp(searchString).test(text.substring(pos-searchString.length,pos)) == true) {
            var newText = text.substring(0,pos-searchString.length) + replaceString + text.substring(pos);
            $input.val(newText);
            var newpos = pos - searchString.length + replaceString.length;
            this.setSelectionRange(newpos,newpos);
        }
    });
}

$(document).ready(function() {
  correct("RR", "ℝ");
  correct(">=","≥");
});

【讨论】:

  • 这还没有被标记为 jquery,不确定提问者是否可以访问它,因为他们在他们无法控制的网站上发帖
  • document.ready 应该在页面的所有资源完成加载并被解析后触发。那么,您还有其他可以运行的 JavaScript 吗?
  • 加载您正在等待的脚本的顺序是什么?我的意思是,您始终可以使用 window.onload 事件处理程序。顺便说一句,您是按需加载特定脚本还是有脚本标签?
  • @Ryan 这是网站:mathematics.discoursehosting.net 但我还没有自己制作软件。
  • 好的,从控制台我看到你有 jQuery 2.0.3,你用的是什么浏览器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多