即使文档准备就绪,JQuery也不会选择元素

时间:2012-03-24 15:22:37

标签: javascript jquery knockout.js

我有像

这样的代码
function populate...() {
    var user = $.storage.get("particulars");

    if (user) {
        console.log($("#frmRegister")); // returns [] why? 
        $("#frmRegister").find("input[name=name]").val(user.name).end()
        .find("input[name=email]").val(user.email).end()
        .find("input[name=contact]").val(user.contact).end()
        .find("input[name=faculty]").val(user.faculty).end()
        .find("input[name=course]").val(user.course).end()
        .find("input[name=year]").val(user.year).end();
    }
    console.log("out")
}

$(function() {
    eventsViewModel.populateRegistrationForm();
})

Full code

我想知道为什么$("#frmRegister")在日志中返回null,而在chrome中我使用控制台执行$("#frmRegister")我得到了表单

Knockout.js是否会干扰这些事情?我的表格如下:

<form action="" 
  method="POST"
  data-bind="submit: $root.submitRegistration, visible: !registered()"
  id="frmRegister"
>

更新

有关代码,请参阅http://octopus.phpfogapp.com/。有问题的行是第154行。(除非我更改它。如果是这样,你可能会搜索$("#frmRegister").find("input[name=name]")$("#frmRegister

6 个答案:

答案 0 :(得分:9)

而不是像这样写你的表格......

 <form action="" method="POST" data-bind="submit: $root.submitRegistration, visible: !registered()" id="frmRegister">
...

像这样写:

 <form action="/give/a/url.here" method="POST" id="frmRegister">

jQuery有很多问题,比如使用存储和数据绑定作为超级全局,但你的具体问题是:

    if (user.name != "") {
        $("#frmRegister").find("input[name=name]").val(user.name).end()
        .find("input[name=email]").val(user.email).end()
        .find("input[name=contact]").val(user.contact).end()
        .find("input[name=faculty]").val(user.faculty).end()
        .find("input[name=course]").val(user.course).end()
        .find("input[name=year]").val(user.year).end();
    }

可以写成:

    if (user.name != "") {
        $("#frmRegister input").val(user.[$(this).prop('name')]).end()
    }
  • 停止超级链接,当你这样做时就会产生自己的问题。
  • jQuery很难看,我给你看的代码很糟糕
  • 您的代码还存在其他问题,我强烈建议您除了学校教授的内容外,还要学习。一个好的起点是JavaScript tag wiki on our site
  • 我实际上没有测试过我发布的内容,我现在正在大门上班。

答案 1 :(得分:3)

当我加载例如http://octopus.phpfogapp.com/#15并在您指定的位置设置断点时,表单尚未添加到DOM中;一个AJAX请求来自loadUpcoming(来自同一个就绪处理程序),它会在返回时创建表单,但它的响应回调还没有运行。

您需要将调用移动到loadUpcoming的响应回调中或之后运行的内容。

答案 2 :(得分:3)

首先,我首先修复javascript错误。您从存储中获得user

var user = $.storage.get("particulars");

但最初没有设置此值,仅在submitRegistration函数运行时设置。

第152行读取:

if (user.name != "") {

但最初用户的错误未定义。因此,请添加一个额外的检查:

if (user && user.name != "") {

修复此问题,然后查看这是否有助于解决其他问题。

答案 3 :(得分:1)

您正在动态更改DOM的内容,因此,如果您需要jquery来处理动态创建的元素,则需要使用livequery

答案 4 :(得分:1)

问题不是jquery找到你的表格。问题是用户为空。将第150行更改为

if (user == null) {

那应该解决它

答案 5 :(得分:0)

如果您正在使用knockoutjs,为什么不将表单元素数据绑定到视图模型,让knockoutjs像其应该那样完成其余的工作?

如果由于某种原因不可能,你必须等待@jimrandomh状态的DOM,这是一个例子:

// wait for the DOM to be loaded
$(document).ready(function(){
    eventsViewModel.populateRegistrationForm(); 
}