在jQuery模块中事件默认不触发
问题描述:
我正在尝试编写一个jQuery脚本来存储来自REST API服务的身份验证令牌。我有一个工作代码块,但决定进行模块化,使应用程序更具可扩展性。现在,看起来preventDefault部分不再有效。在jQuery模块中事件默认不触发
<form action="/" id="authorize">
<label for="username">Username:</label><br />
<input type="text" id="username" required /><br />
<label for="password">Password:</label><br />
<input type="password" id="password" required /><br />
<input type="submit" value="Authorize" /><span id="isValid" class="checkContainer"> </span>
</form><hr />
<label for="serviceType" class="fieldDisabled">Method: </label>
<select id="serviceType" disabled>
<option></option>
<option value="option1">Option 1</option>
<option value="option2">Option 2</option>
</select>
脚本作为authorize.js单独保存,并在模块中调用如下:
<script src="js/authorize.js"></script>
<script>
$(document).ready(function() {
Authorize.init();
});
</script>
这里的模块本身:我一直在辛苦劳作了这个
var s;
var Authorize = {
token: null,
settings: {
username: $("#username"),
password: $("#password"),
form: $("#authorize"),
validationIcon: $("#isValid"),
selector: $("#serviceType"),
selectorLabel: $("label[for='serviceType']"),
serviceSelector: $(".methodFieldDisabled"),
url: "redacted"
},
init: function() {
s = Authorize.settings;
this.bindUIActions();
},
bindUIActions: function() {
s.form.submit(function(event) {
event.preventDefault();
data = Authorize.buildJSON(s.username.val(), s.password.val());
Authorize.getToken(json);
});
},
buildJSON: function(username, password) {
var data = {};
data['grant_type'] = password;
data['username'] = username;
data['password'] = password;
return data;
},
getToken: function(data) {
$.ajax({
type: "POST",
url: s.url,
data: data,
success: function(json) {
Authorize.success(json);
},
error: function(json) {
Authorize.error(json);
}
});
},
success: function(json) {
Authorize.token = json.accessToken;
Authorize.revealServiceSelector();
},
error: function(json) {
Authorize.hideServiceSelector();
},
revealServiceSelector: function() {
s.serviceSelector.hide();
if(s.validationIcon.hasClass("invalid")) {
s.validationIcon.removeClass("invalid");
}
selectorLabel.removeClass("fieldDisabled");
selector.prop("disabled", false);
s.validationIcon.addClass("valid");
},
hideServiceSelector: function() {
s.serviceSelector.hide();
if(s.validationIcon.hasClass("valid")) {
s.validationIcon.removeClass("valid");
}
selectorLabel.addClass("fieldDisabled");
selector.prop("disabled", "disabled");
s.validationIcon.addClass("invalid");
}
};
大概一天,似乎无法找到失败点。提交表单时,它将重定向到服务器的根目录,而不是按预期执行脚本。
答
您从操作中指向“\”,它是您的目录的根目录。而应将其指向包含要启动的代码的文件。
答
只是一些停止代码的错别字。提交是您的代码未能完成的默认行为。
使用调试器,看看在运行时错误(了解和爱你的F12调试工具在Chrome等!):
1)你必须在下面的横线错误的变量(JSON而不是数据)所以你得到一个错误:
bindUIActions: function() {
s.form.submit(function (event) {
event.preventDefault();
data = Authorize.buildJSON(s.username.val(), s.password.val());
Authorize.getToken(data); // <<<<<<<<<<<<<<<<<<<<<<<
});
2)你还没有把你的范围(S)的一对夫妇的变量:
revealServiceSelector: function() {
s.serviceSelector.hide();
if (s.validationIcon.hasClass("invalid")) {
s.validationIcon.removeClass("invalid");
}
s.selectorLabel.removeClass("fieldDisabled");
s.selector.prop("disabled", false);
s.validationIcon.addClass("valid");
},
hideServiceSelector: function() {
s.serviceSelector.hide();
if (s.validationIcon.hasClass("valid")) {
s.validationIcon.removeClass("valid");
}
s.selectorLabel.addClass("fieldDisabled");
s.selector.prop("disabled", "disabled");
s.validationIcon.addClass("invalid");
}
如果检查代码,你会看到,它应该劫持'提交'发泄。这个“\”不应该被使用(它会直接指向“反应”):) – 2014-09-19 13:46:59
而实际的问题是代码有运行时错误,并且实际上并没有进入'evt.preventDefault()',因此表单仍然提交:) – 2014-09-19 13:58:22