codeigniter 清除视图输出
Posted
技术标签:
【中文标题】codeigniter 清除视图输出【英文标题】:codeigniter clear view output 【发布时间】:2012-01-23 14:55:37 【问题描述】:有什么方法可以“清除”当前视图中的内容,而不必使用重定向?
我正在我的网站上实现 ajax,并注意到如果我想返回一个只包含我想要显示的视图的 ajax 请求的响应,我必须使用重定向。否则,如果我只是使用
$this->load->view('blah');
它将保留原始内容(在本例中为表单)并在其上添加视图。我宁愿不使用重定向,因为我想保持 url 相同。有什么方法可以在没有重定向或 javascript 的情况下清除当前视图中的内容?
<script type="text/javascript">
function updateajaxem()
$(document).on("click", "a.ajaxem", function(e)
e.preventDefault();
var action=$(this).attr('href');
//alert(action);
if(action.indexOf('register')>0)
$("div#logininfo").load("http://localhost/testrun/auth/register/").fadeIn();
else if(action.indexOf('password')>0)
$("div#logininfo").load("http://localhost/testrun/auth/forgot_password/").fadeIn();
); //end
</script>
<script type="text/javascript">
updateajaxem();
//$("a.ajaxem").live("click", function(e)
$(document).on("click","input:submit",function(e)
e.preventDefault();
var formaction=$(this).closest('form').attr('action');
var dataString=$(this).closest('form').serialize();
alert(dataString);
//$("div#logininfo").load(formaction,data);
$.ajax(
type: "POST",
url: formaction,
data: dataString,
// dataType: "json",
success: function(data)
alert(data);
$("div#logininfo").html(data);
updateajaxem();
// end of success
);
);
</script>
对于我的 codeigniter,基本上它最终是一个
redirect('whereever'); or $this->load->view("blah");
codeigniter 基本上是标准的 auth tank 代码,只是链接和表单是“ajax-ed”。因此,与 javascript 一起使用的 codeigniter 要么只是加载视图,要么重定向到控制器中加载视图的另一个函数。没什么特别的。只是只有重定向才会显示新添加的视图,而没有重定向的简单加载视图也会显示旧内容。根据 cmets 的建议,执行 ajax 后似乎必须通过 javascript 处理它。
但只有重定向会“清除”当前视图内容并仅显示我想要的内容,通常是更新消息或简单的 html。但是,重定向需要另一个 url 更改。
另外,点击几下后,我的“ajaxem”类事件不再触发?这就是为什么我创建了 updateajaxem() 函数并在每次 ajax 重新加载后调用它,但是,这不起作用。我一直在阅读,代表是否只适用于当前和未来元素?
【问题讨论】:
你能展示你的示例代码吗?您可能认为这无关紧要,但是有很多方法可以 解决这个问题,最好在您的具体示例中向您展示。 看到您的编辑。对不起,我的意思是请显示控制器代码,因为这是处理所有这些业务的地方。你知道$this->input->is_ajax_request()
吗?
是的,但据我所知,这需要重定向才能在不使用 javascript 的情况下删除以前的内容。如果不使用重定向,则回显和仅返回视图都不起作用。
【参考方案1】:
有什么方法可以在不使用重定向或 javascript 的情况下清除当前视图中的内容?
从技术上讲,不可能“清除”已经发送到浏览器的内容。如果在您的示例中甚至已经在浏览器中显示了某些内容,那么从服务器端“清除”浏览器窗口通常为时已晚。
这就是重定向起作用的原因,它会命令浏览器离开页面并获得新的输出。
您可以编码一个命令以从 DOM 中删除片段并替换其他片段,因此使用 AJAX 但那将是 javascript(而不是您要求的)。
只要您没有将输出发送到浏览器,您可以使用output control functions in phpDocs 清除它。就像创建一个输出缓冲区并在将输出发送到浏览器之前对其进行操作
【讨论】:
【参考方案2】:你可以使用 $('body').load('url');使用 jQuery,但这就是我要建议的全部内容。这将执行一个 ajax 请求并用新内容替换您的正文。您还可以使用 ajax 加载器 gif 等实现更强大的解决方案。
【讨论】:
哈哈,杜尔……我不适合速读。我想,因为它被标记为 javascript,所以我没有思考。【参考方案3】:您使用 ajax,在响应中回显您想要粘贴视图的任何内容。在 PHP 中:
if(isset($_GET['ajax']))
$data = "<table>
<tr>
<td>Data To substitute</td>
</tr>
</table>";
在 Js 中:
$.ajax(
url: "test.html",
context: document.body,
success: function(data)
$("#WrapperDivWhereYouWantToAddNewView").html(data);
);
我想,这样就可以了。
【讨论】:
以上是关于codeigniter 清除视图输出的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter 使用 User Agent 类为手机输出不同的视图是否很糟糕
Codeigniter 表单验证 - 成功后如何取消设置表单值?
在 CodeIgniter 3 中重定向后 Flashdata 未清除