Javascript .val()会失败,除非它在setTimeout中-为什么?

Javascript .val()会失败,除非它在setTimeout中-为什么?,javascript,jquery,local-storage,Javascript,Jquery,Local Storage,我正在为我编写的一个简单JS todo应用程序试验不同的存储机制。这次我使用的是本地存储。我的主app.js文件是从我的local-storage.js文件中提取一些数据。这就是问题所在,我可以很好地将返回的数据console.log,但是我不能使用.val()或.html()将值添加到dom中,除非它包装在setTimeout()中?为什么?如果console.log的数据可用,那么肯定是.val()的数据 代码如下: local-storage.js this.findById = func

我正在为我编写的一个简单JS todo应用程序试验不同的存储机制。这次我使用的是本地存储。我的主app.js文件是从我的local-storage.js文件中提取一些数据。这就是问题所在,我可以很好地将返回的数据console.log,但是我不能使用.val()或.html()将值添加到dom中,除非它包装在setTimeout()中?为什么?如果console.log的数据可用,那么肯定是.val()的数据

代码如下:

local-storage.js

this.findById = function(id, callback) {
    var todos = JSON.parse(window.localStorage.getItem("todos")),
        todo = null,
        len = todos.length,
        i = 0;

    for (; i < len; i++) {

        if (todos[i].id === id) {
            todo = todos[i];
            break;
        }
    }

    callDelay(callback, todo);
}
根据请求,callDelay功能:

var callDelay = function(callback, data) {
    if (callback) {
        setTimeout(function() {
            callback(data);
        });
    }
}

我将等待加载dom,并将其包装到jquery快捷方式$(fn):


你是用IE做这个的吗?IE有一个怪癖,你必须让浏览器在确认对状态的某些修改之前完成绘制。你的工作代码不需要附加。断开的代码是更有趣的部分。@Mgetz不,只是chrome。没有超时的代码:
$(“#title”)。长度
?在元素加载到页面之前调用此代码吗?我同意这是我喜欢的方式,但是OP提到他们在
之前加载脚本,所以这不应该是问题所在…这对我不起作用。我不想真的这样做,因为当我使用websql返回比localstorage更高的数据速率时,它工作得很好。我正试图保持我的应用程序不变,无论存储方式如何。有没有办法进一步延迟从local storage.js传递的数据?关键不是结果变量,它可能已经准备好了,而是jquery选择没有成功。例如,如果在没有超时的情况下执行console.log($(“#title”).length)会怎么样?@matteofigus我得到0,那么DOM显然还没有准备好。我将尝试将local-storage.js中的回调延迟一点。
var callDelay = function(callback, data) {
    if (callback) {
        setTimeout(function() {
            callback(data);
        });
    }
}
$(function(){
  $('#title').val(result.title);
  $('#title').attr('data-id', id);
  $('#description').val(result.description);
  $('#id').val(id);
});