Javascript JQuery即使在文档准备就绪后也未选择元素

Javascript JQuery即使在文档准备就绪后也未选择元素,javascript,jquery,knockout.js,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[na

我有这样的代码

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();
})

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

Knockout.js会干扰这些事情吗?我的表单如下所示:

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

更新


有关代码,请参阅。有问题的那一行是第154行。(除非我更改它。如果是这样,您可能可以搜索
$(“#frmRegister”)。查找(“input[name=name]”
$(“#frmRegister

”)而不是像这样编写表单

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

    if (user.name != "") {
        $("#frmRegister input").val(user.[$(this).prop('name')]).end()
    }
  • 停止超级链接,当你这样做的时候,你会制造你自己的问题
  • jQuery很难看,我向您展示的代码很糟糕
  • 你的代码中还有其他问题,我强烈建议你学习学校教给你的东西以外的东西。一个好的起点是
  • 我还没有真正测试我发布的内容,我现在就要出门工作了
当我加载eg并在您指定的位置设置断点时,表单尚未添加到DOM中;LoadComcoming(来自同一就绪处理程序内部)发出了AJAX请求,它将在表单返回时创建表单,但其响应回调尚未运行


您需要将调用移动到LoadCumming的响应回调中或之后运行的某个对象。

首先,我将首先修复javascript错误。您可以从存储中获得
用户

var user = $.storage.get("particulars");
但从本质上讲,该值未设置,仅在
submitRegistration
函数运行时设置

第152行内容如下:

if (user.name != "") {
但初始用户的错误未定义。因此,添加一个附加检查:

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

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

您正在动态更改DOM的内容,因此如果需要jquery处理动态创建的元素,则需要使用jquery。问题不是jquery查找表单。问题是用户为空。将第150行更改为

if (user == null) {

如果您使用的是knockoutjs,那么为什么不将表单元素绑定到视图模型,让knockoutjs完成其余的工作呢

如果由于某种原因不可能,您必须等待DOM,如@jimrandomh states,下面是一个示例:

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

因此,在chrome浏览器中,它会返回表单,而在其他浏览器中则不会。停止链接——这只是Hipster编写代码的方式,可能是问题的原因。另外,发布相关的html,我只能猜测没有它的问题出在哪里。你是动态添加表单还是已经在html文件中了?在这里似乎工作正常:@JiewMeng T问题似乎是applyBindings更改了DOM。在applyBindings之前设置一个断点,在它之后设置一个断点,在applyBindings运行之前转到控制台并键入$(“#frmRegister”)。您将获得您的元素。现在,再次按play并点击下一个断点。您将看到现在返回的是[]事实上,此时表单已从DOM中删除。他是对的:您需要将
放在文档中,然后才能引用它。用户询问jQuery不选择属性的原因;虽然我喜欢代码清理,但这并不能回答他/她的问题。另外,我个人认为jQuery很简洁。加上c您发布的ode无法按预期工作,因为
与上下文无关-应该对那里的
每个
都有一个调用。无论哪种方式,它都不能解决问题。请参阅@jimrandomh
if (user == null) {
// wait for the DOM to be loaded
$(document).ready(function(){
    eventsViewModel.populateRegistrationForm(); 
}