我有一个如下的ajax提交按钮,
echo CHtml::ajaxSubmitButton(
'>', $this->createUrl('/shop/category/nextCategory&id=16&store=true&gift_store='.$_GET['gift_store'].'&startValue='.$start_value.'&endValue='.$endValue), array(
'type'=>'GET',
'update'=>'#test',
'beforeSend' => 'function(){
alert("beforeSend");
}',
'complete' => 'function(){
alert("complete");
}',
)
);
在我在控制器中的动作中,我使用reder partial如下,
$this->renderPartial('view',array('model'=>$this->loadModel()),false,true);
因为我已将processOutput设置为true,所以ajax提交按钮工作正常。但它继续执行(我点击的次数)。我希望它只在单击提交按钮时执行一次。 如果有人能帮我解决这个问题会很棒。我一直在努力解决这个问题。
答案 0 :(得分:4)
好吧,我解决了这个问题。发生的事情是, 根据ID触发ajax请求。每次通过ajax重新加载div时,将加载一个新的委托/事件,指向他前面的那个ID。所以当你真正点击按钮时,两个代表都会完成他们的工作,因为两者都匹配点击的按钮。
这个问题有两个解决方案。一个是每次生成按钮时都有一个唯一的id,如下所示,
array('id' => 'next-category-'.uniqid());
另一种方式,这就是我解决它的方式,
array("id"=>"next-category", "live"=>false);
live:boolean,是否应该使用live / delegate或direct style附加事件处理程序。如果没有设置,将使用liveEvents。将其提交给提交按钮解决了它。
答案 1 :(得分:1)
在jQuery的帮助下,您可以定义以下代码来“完成”功能:
function() {
$('input[type=submit]").attr("disabled", "disabled");
}
因此,如果我理解正确的话,成功完成按钮将被禁用以重新推送。
不要忘记将css选择器输入[type = submit]修改为你的按钮的CSS选择器。
解决方案2 :将您的CHtml :: ajaxButton变为
if (!Yii::app()->request->isAjaxRequest) {
}
然后当您通过ajax加载内容时,您的按钮将不会显示在页面上
答案 2 :(得分:1)
如果为ajax请求创建normalizeUrl,那就更好了。
echo CHtml::ajaxSubmitButton(
'>', CHtml::normalizeUrl(array('/shop/category/nextCategory',array('store'=>1,'gift_store'=>1,'startValue'=>1,'endValue'=>1))), array(
'type'=>'GET',
'update'=>'#test',
'beforeSend' => 'function(){
alert("beforeSend");
}',
'complete' => 'function(){
alert("complete");
}',
)
);
这段代码很完美,我查了一下。似乎他们在你的js代码中某处可能有些错误。