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很难看,我向您展示的代码很糟糕
- 你的代码中还有其他问题,我强烈建议你学习学校教给你的东西以外的东西。一个好的起点是
- 我还没有真正测试我发布的内容,我现在就要出门工作了
您需要将调用移动到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();
}