【发布时间】:2013-11-03 00:08:42
【问题描述】:
我想在我的 jQM 应用程序 (1.3.2) 中集成一个可折叠组件,其工作方式如下:
- 它开始折叠。
- 单击时,它开始从服务器获取可折叠的列表项。 折叠屏保持关闭状态,加载图标可能会旋转。
- 加载所有元素并刷新列表视图并准备就绪后,可折叠展开。
- 如果再次点击它,它直接关闭不会延迟,从1开始。
我最初的想法是抓住expand 事件并阻止其传播。加载完成后,我取消注册自定义事件处理程序以将可折叠恢复正常,最后触发 JavaScript 中的展开事件以打开。
问题是这适用于第一轮,但之后折叠式仍然打开。考虑这个例子(也在jsfiddle):
<div data-role="collapsible" id="c">
<h2>Collapse</h2>
<ul data-role="listview" id="lv">
<li>You don't see me!</li>
</ul>
</div>
<a href="#" data-role="button" onClick="$('#c').off('expand', stop)">
Unlock the collapsible
</a>
<a href="#" data-role="button" onClick="$('#c').on('expand', stop)">
Lock the collapsible
</a>
JavaScript:
var stop = function(event) {
alert('Locked!');
event.preventDefault();
}
// executed after the element is created ...
$('#c').on('expand', stop)
在这里,如果您在加载后单击可折叠,它会保持关闭状态(很好)。当您单击解锁时,它会打开并且不显示任何警报(好)。如果您再次锁定它,它会显示警报(好)但仍然会打开(坏)。
谁能告诉我我做错了什么?解锁似乎有我看不到的副作用。这里有几个类似的问题,但大多数人都乐于阻止扩展而不重新打开它。
所以我的问题是:可靠地延迟可折叠扩展的最佳方法是什么?
编辑:我添加了另一个集成列表视图逻辑的示例,也显示了此错误。 jsFiddle is here. 我也搬到了.one() 以使注销更可追溯。
新的 JavaScript:
var stop_n_load = function (event) {
alert('stop opening! (or at least try to ...)');
// try to stop the expanding by stopping the event
event.preventDefault();
// Do some work that takes time and trigger expand afterwards ...
setTimeout(function (e) {
dd = new Date();
$('#lv').empty();
$('#lv').append("<li><a href='#'>Item A ("+dd+")</a></li>");
$('#lv').append("<li><a href='#'>Item B ("+dd+")</a></li>");
$('#lv').listview('refresh');
// when done, start expanding without this handler (was register only once)
$('#c').trigger('expand');
// for the next collapse register stop_n_load again
$('#c').one('collapse', reset);
}, 2000);
};
var reset = function (event) {
$('#c').one('expand', stop_n_load);
};
$('#c').one('expand', stop_n_load);
在第一次扩展时,它按预期工作,首先更新然后打开。在第二次运行时,它无需等待即可打开,稍后您可以看到时间戳更新,因此事件被正确调用。
.preventDefault()好像有问题我不明白...
【问题讨论】:
-
您需要同时使用
return false=preventDefault()和stopPropagation()。检查这个jsfiddle.net/Palestinian/yXa4W -
谢谢@Omar,这看起来很棒!为什么点击事件没有第二次点击时仍设置
.preventDefault()的问题?您能根据您的评论做出回答吗? -
当collapsible展开时,
ui-collapsible-collapsed类被移除,所以第二次点击正常工作。
标签: javascript jquery-mobile jquery jquery-mobile-collapsible