2013-04-10 64 views
3

进出口运行到哪里,我有当用户从一个简单的下拉选择的东西,绘制一个Ajax驱动的页面有问题加载页面时如何运行一个onchange功能:如果已经选择该选择框

<select id = "selectdepartment"> 
    <option id = "default">Select an option...</option> 
    .... 
</select> 

$('#selectdepartment').change(function(){ 

}); 

然后运行一些AJAX到PHP脚本:

和页面的其余部分使用jQuery .change()绘制。一切都很好,问题是当我提交一个使用ajax绘制的表单时(使用$_SERVER['PHP_SELF'];),数据被取消,页面重新加载,页面被清除,但选择框仍然保留在原来的位置。用户必须移动到不同的选项,然后返回到最初选择的选项来重新启动.change()。这很糟糕。

我可以通过在我的所有表单中传递一个php变量来解决此问题,然后检查每个页面加载时是否设置了变量,如果它是绘制页面部件,那么这会导致相当凌乱的代码,它是不太理想。

必须有一种方法来做到这一点与jQuery库,虽然我一般的JavaScript语言的知识不是我希望它是。如果任何人有任何有用的提示,请分享一下,不要为我做的,虽然,我不会学习这种方式:)

编辑:

$('#selectdepartment').change(function(){ 
var department = $('#selectdepartment').val(); 
var day = $('#data').data('day'); 
var month = $('#data').data('month'); 
var year = $('#data').data('year'); 
//alert (department); 

if(department === "Select an option..."){ 
    $('.hiddenuntildepartmentisselected').css({"display":"none"}); 
} 
else{ 
$('.hiddenuntildepartmentisselected').css({"display":"block"}); 
} 

showpoints(department); 
drawpointstable(department, day, month, year); 
displaytheuseresforselecteddepartment(department, ''); 

$('#sendthedepartment').val(''+department+''); 
$('#hiddendepartmentidforaddinganewpoint').val(''+department+''); 

}).trigger('change');//end run functions 

回答

6

可以使用.trigger()功能立即触发代码.trigger change事件处理程序,在页面加载:

$('#selectdepartment').change(function() { 
    // code here 
}).trigger('change'); 

或者,如果你需要通过JavaScript/jQuery的其他地方调用它:

$('#selectdepartment').trigger('change'); // or just .change() as a shorthand 
+0

我试过第一个解决方案(发布代码),它没有工作。 – Nick 2013-04-10 15:50:05

+0

您是否在变更函数中放置了console.log,以查看触发器是否被调用? – EmmyS 2013-04-10 15:51:27

+0

林肯定,这工作,但现在由于某种原因,它没有保持在选定的地方。哦,好吧,开始扔php的时候了。谢谢! – Nick 2013-04-10 16:11:33

2

更新

您的形式可以利用onClick属性,它会调用解析表单字段,并通过.ajax()发布数据到PHP脚本的方法的按钮。

success事件方法中,您可以根据需要检查所需的任何标志并根据需要修改元素。

基本例如:

.ajax()

内幕:

... 

url: 'xxx.xxx.xxx', 
async: true, 
type: 'POST', 
dataType: 'html', 
data: JSON.stringify(form_fields), 
beforeSend: function() 
{ 
    // Pre send stuff, like starting a loading gif 
}, 
success: function(data, textStatus, xhr) 
{ 
    // Be sure you load the page with the content first 
    $('#containing-div').html(data); 

    // Do your check here, and modify your element if needed here 
    if(flagtocheck === 'xxx') 
    { 
     // Modify the element in question... 
    } 

    // I call a custom method termed `.ctrls()` here that makes any 
    // adjustments to the DOM once its loaded/updated. 
}, 
error: function(xhr, textStatus, errorThrown) 
{ 
} 

当然,你要在你的情况适当设置flagtocheck

希望有帮助!关于编辑

注意 这个职位是编辑成多一点的描述,更容易理解。由于询问问题的人已经在使用.ajax()方法,因此事件方法是提出问题请求的人的理想场所。直接修改元素的方法调用比调用.trigger().change()少1个方法调用,然后直接修改该元素。

+0

如果他们使用AJAX提交表单,那么无论如何都不需要触发'change'事件,因为由它绘制的所有页面部分仍然存在。这并不是一个坏建议,但对他们来说可能是一项不重要的工作。 – 2013-04-10 15:56:20

+0

@ anthony-grist我从来没有建议在使用'AJAX'提交表单时触发'CHANGE'事件。我建议使用'AJAX'方法的'ONSUCCESS'事件直接设置元素,就好像.change()被调用一样。我的答案唯一的区别是我没有为他们提供另一种选择,或给他们一个深入的解释。我不同意在不需要时使用额外事件,因为这是另一种方法调用,效率较低且不易阅读。 – Rik 2014-08-25 16:11:50

相关问题