【发布时间】:2010-07-19 15:44:40
【问题描述】:
基本上是这样分解的:
- 访问应用程序时会加载主模板页面。
- 链接由 onclick 处理程序处理,该处理程序通过 jQuery ajax 调用重新加载 master 的相关部分,触发其他事件等。
- 初始 onclick 处理程序完成后,它会调用两个或多个 ajax 回调来更新页面的其他部分。
问题:
- 最后的回调读取 CakePHP 的 flash 消息命令 $session->flash(),并在一个简单的 javascript 弹出窗口中显示结果,谁的 div 标签是通过 $('body').prepend() 创建的。弹出窗口关闭后,创建的元素将从 DOM 中删除()。
- 当用户单击一个链接并为下一页运行 Flash 消息回调时,CakePHP 的 Flash 消息数据从未被删除,它会重新显示该消息。当一个人继续点击页面时,这将重复 2-5 次,或者直到过了一小段时间,然后最终从 PHP 会话中删除该消息。
- 直接访问ajax链接时,flash数据显示一次,页面重新加载后删除。
上周这一直让我难以置信。除了回调本身,我已经删除了所有其他不相关的东西,它仍然显示相同的行为。令人沮丧。
代码很简单,看起来像这样:
在 onclick 调用后返回的布局页面。
<?php echo $content_for_layout ?>
<script>
$(window).ready(function() {
page_load_callback();
});
</script>
javascript。
function page_load_callback() {
$.ajaxSetup({
cache: true // We want our client to cache stuff, and override this in PHP.
});
$.ajax({
cache: false, // Force this to not cache via jQuery
beforeSend: function() {
$('body').prepend('<div id="flash_message_popup"></div>');
},
url: flash_message_popup_link, // global variable set in default.ctp
success: function(data) {
$('#flash_message_popup').html(data);
if ($('#flash_message_popup').is(':empty')) {
$('#flash_message_popup').remove();
} else {
create_popup('flash_message_popup');
}
},
error: function(a, b, c) {
$('#flash_message_popup').remove();
}
});
}
function create_popup(tag) {
if (editing_hall == true) {
return false;
}
var selector = '#' + tag;
$(selector).attr('style', 'position: absolute; display: none; top: 5; left: 5; z-index: 100;');
$(selector).slideDown('slow');
}
*.ctp 文件。
<?php if ($message = $session->flash()): ?>
<span id="flash_data">
<div class="flash_message"><?php echo $message; ?></div>
<div class="btn_large bottom_round"><a name="" onclick="$('#flash_message_popup').slideUp('slow', function() { $('#flash_message_popup').remove(); });">close</a></div>
</span>
<?php endif; ?>
控制器方法。
function flash_message_popup() {
$expires = 60*60*24*30*7;
header('Expires: '.gmdate('D, d M Y H:i:s', time()-$expires) . ' JST'); // minus for past
$this->layout = 'ajax';
$this->render('../elements/flash_message_popup');
}
会话被存储在数据库中,直到这个特定的实例才被证明是一个问题。我不确定这是否是浏览器缓存问题(我不应该是?我特别没有通过 PHP 和 jQuery 进行缓存)、古怪的会话问题、时间问题、我的 javascript 中出现的问题,或者什么。我尝试添加一个冗余回调,它使用 $this->Session->delete('Messages.flash'); 删除有问题的会话;也没有运气。
如果有人有任何建议,我很想听听。我没主意了。
编辑:我还检查了 Apache 日志,回调肯定会被 ajax 查询调用,但不会删除会话消息。只有在我手动调用它之后它才会删除。
【问题讨论】:
-
我目前已返回到在返回的 /controller/action 视图中内联打印 Flash 消息。然而,这不是我想做的。我们正在专门设计页面,以便可以缓存 html 本身,并通过 ajax 调用更新页面的相关部分。如果消息发生更改,客户端将不幸地读取先前缓存的页面,这是不可取的。我还在纠结为什么 主页加载后的回调没有 删除会话数据。啊。
-
我使用 jQuery 计时器库减慢了回调速度,这有助于缓解问题,但并不能完全消除它。还在考虑。