HTML5,Codeigniter和历史记录重写/刷新

时间:2012-03-24 11:45:36

标签: jquery html5 codeigniter history

我正在使用带有codeigniter后端的HTML5样板。我实际上是codeigniter的新手。 我创建了一个名为home.php的控制器,它定义了索引中的html5视图,并有一些其他的方法/操作,称为页面和目录。

编辑更新了问题,因为它不太清楚 / EDIT

我可以从codeigniter加载我的数据。我有一个从控制器调用这些数据的URL:/index.php/home/page/xxx(其中xxx是我每页的内容)。在我的/index.php/home/index控制器中是我加载的主要(也是唯一的)模板视图。当用户点击菜单(这是唯一的静态块)时,我会做以下事情:

  1. 数据操作,数据控制器,data-pageid变量构建一个URL。
  2. 使用jquery
  3. 中的div.load()加载网址
  4. url实际上是为我提供数据的codeigniter控制器
  5. 屏幕的“旁边”区域现在加载了来自控制器的数据并进行渲染(我对全屏和宽度/高度检查进行了一些数学运算)
  6. 我创建了一个html5历史记录条目,以“欺骗”它已加载不同页面的浏览器(并将其用于谷歌分析)。
  7. 现在问题是当我从/index.php/home/index

    执行此操作时

    如果我是从页面网址(例如:/index.php/home/page/100)执行此操作,则正确仅呈现内容(因为这是控制器所做的) 。我想做什么 是当用户点击该网址时(例如他从谷歌发现它),过程将是:

    1. 渲染主模板页面
    2. 使用相同的jquery加载过程将数据提取到图形的旁边区域
    3. 执行上述步骤。
    4. 所以我的问题是从另一个可以用来获取数据的url触发渲染和加载。我试图这样做是因为我不想在页面上重新加载,如果是这种情况,那么我会为我所拥有的每种页面类型制作一个静态的视图。

      下面提到的一种方法是使用SESSION来检查视图是否已加载,以便我重新加载它。是否有更多的codeigniter-y方式来做到这一点?

3 个答案:

答案 0 :(得分:0)

这是加载视图部分的一个小例子。

首先创建你的主页并加载它,你似乎已经拍了下来。

在主视图中,在jQuery中使用如下内容:

$("#eleID").load(
    '<?= site_url('yourController/yourLoadFunc'); ?>', // url to your load function in controller
    function(responseText, textStatus, XMLHttpReques) { // function to execute when load is complete
        // responseText is your view, OR json data if not a view recieved
        // however, for loading a view partial, you don't need the json data here
        // as you know, you can insert data in a view via the CI load view call
        // so simply make an html page of what you want your sub-view to be
        // complete with vars for data, and when your controller for this jQuery call
        // returns the view, insert the data as normal makeing
        // $this->load->view('yourSubView', $dataArray);
        // the last line of the function this load call refers too
    }
);

如果其中任何一个没有意义让我知道,我将尝试帮助纠正它直到它

答案 1 :(得分:0)

为了提供您要求的方法,我仍然会使用会话方法。如果未设置会话属性,请在内容块的任一侧加载外部视图元素:

//main controller index method
public function index($var1)
{
    //do the stuff you need to prepare your page

    //load session library if not autoloaded
    $this->load->library('session');
    //get the current session value
    $isLoaded = $this->session->userdata('is_loaded');
    //set a new session value
    $this->session->userdata('is_loaded','some_value');

    //display header for new users only
    if($isLoaded === false) $this->load->view('above_content_view');
    $this->load->view('requested_content_view');
    //display footer for new users only
    if(isLoaded === false) $this->load->view('below_content_view');

}

仅当会话变量为false时才会传递整个页面,如果未设置该值,则会返回CI。我认为这比仅从SEO角度提供HTML框架更可取。

答案 2 :(得分:0)

我认为最好的方法是在浏览器中使用hashchange事件。 您必须将您的网址设为

/index.php/home/#!page-100

#!用于google ajax抓取工具将其视为不同的网页。 并且您需要在页面加载时触发hashchange事件。

这样当任何人从任何地方点击你的URL时,将执行来自家庭控制器的索引方法。 在页面加载时,您使用JS检查是否有任何哈希更改。并且您对主控制器的页面方法发出AJAX请求以获取指定散列的内容。

你可以在这里找到这个插件 http://benalman.com/projects/jquery-hashchange-plugin/

插件本身会进入浏览器历史记录。