jQuery - 在load()之后向元素添加功能

时间:2011-03-10 16:25:32

标签: javascript jquery function append load

我有一些代码从另一个文件加载一些html,它可以正常工作。但我正在努力从这个新加载的数据中访问元素。

我有这段代码:

var widgetSettings = $("<div>").addClass("widgetsettings").load('dashboard/chart-settings-form.php #editChartForm');
widgetSettings.appendTo(widget.element);
//so far so good...
widget.element.find('.date').each(function(i){
  $(this).datetimepicker(); //this doesn't work
  console.log('testing... '+$(this).attr('id')); //this doesn't even work...
});

我希望它能够从上面的url中加载'#editChartForm'表单中的这些文本框(它们在一个表中):

<input type="text" name="datefrom" id="datefrom" class="date" /> To: <input type="text" name="dateto" id="dateto" class="date" />

html肯定正在加载。真的很困惑为什么我无法访问load()事件中的任何元素。

我还想将点击功能应用到同一表单上的取消按钮,我发现使其工作的唯一方法是在加载之前将其置于“实时”功能中:

$('.cancel').live('click', function() {
  //actions here...
});

任何想法发生了什么?

2 个答案:

答案 0 :(得分:6)

简单!因为load()方法是异步的,并且你的行widget.element.find('.date')正在触发之前,实际上DOM中的任何元素都匹配它!只需在load()中使用回调,如下所示:

$("<div>").addClass("widgetsettings").load('dashboard/chart-settings-form.php #editChartForm', function() {
  $('div.widgetsettings').find('.date').each(function(i){
    $(this).datetimepicker();
    console.log('testing... '+$(this).attr('id'));
  });
});

答案 1 :(得分:2)

$("div").load("url here",function(){
    callbacks();
});

function callbacks(){

//put everything that you want to run after the load in here.
//also if the click function is in here it wont need the .live call

}

编辑:使用最新版本的jQuery,您现在可以使用.on而不是.live(效率更高),即。

$(".widgetsettings").on("click",".cancel",function(){
    //actions here
});

希望这有助于:)