如何在页面加载时在 ajax 调用中绑定事件处理程序后触发事件
How do I trigger events after event handlers are bound in ajax calls when the page loads?
问题:
我有 2 个下拉列表,既由数据库中的信息填充,又依赖于一些初始信息(用 php 创建的 json 数组(。第二个下拉列表还取决于在第一个下拉列表中选择的内容。选择第二个下拉列表后,用户选择将保存在另一个数据库表中。如果用户离开然后回来,我希望能够将下拉列表重置为他们之前选择的内容(但仍允许他们更改其选择(。
上下文:
我有一些代码如下所示:
function eventHandler2(event) {
$.ajax({
url: "someotherurl.php",
data: event.data["context"],
success: function(data) {
// Do some stuff
}
});
}
function eventHandler1(event) {
event.data["context"][$(event.target).id()] = $(event.target).val();
$.ajax({
url: "someurl.php",
data: event.data["context"],
success: function(data) {
$("#element").append(build_input("input2", data));
$("#element input2").change({"context": event.data["context"]}, eventHandler2);
}
});
}
$(document).ready(function() {
var context = // php generated json array.
$("#element").append(build_input("input1", context));
$("#element input1").change({"context": context}, eventHandler1);
});
context
包括一些必须在事件处理程序外部初始化并添加到 URRING 事件中的数据,build_input
只返回一个表单输入元素的 html 字符串,该元素使用 data
或 someData
确定的选项构建。有时,包含 eventHandler1(和 eventHandler2(的整个 html 元素将被删除并重新初始化。
我的问题是我想使用从数据库中提取的一些默认值初始化两个表单输入(使用 build_input 构建(,但是一旦设置了这些值,我不希望任何重新初始化或事件处理使用这些初始值(这使得将它们添加到上下文对象变得困难,因为在绑定事件处理程序时将使用该对象(。
我想设置输入的值,然后调用更改事件来模拟用户选择这些值,但由于输入元素是使用 ajax 数据构建的,因此在 ajax 请求返回并构建输入元素之前会调用这些更改事件。
我可以通过超时来解决这个问题,但是由于 javascript 在不同的机器上可能运行得更慢,并且 ajax 调用可能需要比正常时间更长的时间,所以我不打算这样做。不过,理想情况下,我想要这样的东西:
$("#element .input1 option[value='" + initial_value + "']").attr('selected', true);
$("#element .input1").change();
在页面加载时调用,但仅在生成和绑定元素后调用。
问题:
有没有办法仅在首次加载页面时触发更改事件(模拟用户选择选项(,并且仅在 ajax 请求构建 html 输入元素返回后触发?
有没有办法仅在以下情况下触发更改事件(模拟用户选择选项(
页面首次加载
并且只有
在 Ajax 请求之后
要构建的 HTML 输入元素是否返回?
这是两个独立的事件。如果需要确保两个事件都已发生,请使用<body onload="loadedBody=true">
并利用 success
$.ajax
函数,如下所示: function eventHandler1(event) {
event.data["context"][$(event.target).id()] = $(event.target).val();
$.ajax({
url: "someurl.php",
data: event.data["context"],
success: function(data) {
$("#element").append(build_input("input2", data));
$("#element input2").change({"context": event.data["context"]}, eventHandler2);
ajaxComplete();
}
});
}
var ajaxCompleted;
function ajaxComplete() {
if((loadedBody == true) && (ajaxCompleted == false)) {
$("#element .input1 option[value='" + initial_value + "']").attr('selected', true);
$("#element .input1").change();
} else {
setTimeout('ajaxComplete()', 100);
}
}
不要担心设置超时。它很少被使用,因为页面很可能在 AJAX 结果到达之前加载。
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default