更改页面而不刷新 – Laravel / Ajax
我一直在寻找一段时间没有得到我的问题的答案,但没有任何运气。
我正在尝试以点击链接的方式复制Soundcloud的导航结构,它将重定向页面而不使用Ajax / jQuery刷新,但不会重复内容,如果用户刷新,页面仍然存在看起来正常。
我遇到的问题是,我有一个扩展所有视图的主模板,所以当我打电话来浏览页面时,它会复制div中的页面我也在推动它。 这导致从主模板拉出两个标题/侧边栏等。
我还试图让其工作的另一件事是,如果我从视图中删除主模板,它将不会显示内容 – 但是说它确实如此,它将没有样式所以如果我是直接去那个页面,它会加载没有样式等。
这是正确运行页面的工作jQuery:
JQ
$(".main-nav li a").click(function(e) { e.preventDefault(); var href = $(this).attr("href"); $(".content-container").load(href); });
我希望这是有道理的,如果需要更多信息,我会尽力提供它!
太感谢了!
马特
编辑 –
这仍然是活跃的。 我已经做了一些更多的挖掘,并想到了另一种方式,人们可能会更多的光。 如果我在视图上包装扩展主模板,例如:
if(!$request->ajax()) @extends('master') @endif
那么只有在通过ajax请求页面时才会在该视图上显示主模板,对吧? 我不确定这是否是正确的方法,但值得一试。
像往常一样,非常感谢任何帮助!
尝试使用jQuery插件pjax 。 使用此插件,您可以使用ajax导航创建任何网站。
对于您要实现的目标,您需要的不仅仅是jQuery和Ajax。 您需要一个合适的JavaScript框架和一些模板。
我可以给你一些想法。
假设您的主布局看起来像这样:
My website header @yield('content')
对于每个页面,您必须构建两个视图,一个包含应该放在“内容”部分中的内容,另一个包含扩展主布局的前一个视图,如下所示:
@extends(layouts.master) @section('content') include partial here @endsection
然后在Controller中,当请求来自Ajax时仅返回部分,而在请求正常时发送整页。
Class MyController extends Controller{ public function action1(Request $request){ // code here return ($request->ajax() ? view('partial') : view('fullpage')); } }
假设只有类“.ajax”的链接不应该刷新页面,你可以使用jquery函数“$ .get”来返回新的html。
$("body").on('click','.ajax',function(){ var url = this.href; $.get(url, function(data){ $("#page-main").html(data); //history manipulation here }); return false; });
当然,您需要使用History API来更新url。
希望它有点帮助。
我通过在页面通过ajax加载时不需要显示的部分使用@if(!Request::ajax())
来修复此问题。