0

这似乎是一个奇怪的问题。也许这也是错误的方法。但我必须这样做:

  • 页面上有几个菜单项
  • 每个页面的内容都存储在一些.phtml文件中
  • 当页面加载时显示默认内容(使用require
  • 所有其他内容也应加载并应存储在 JavaScript 数组中
  • 当用户点击链接时,内容被交换

问题是:

  • 不应该使用 AJAX
  • 所有内容都不能在开头附加,对于旧的 SEO

所有部分都很简单,除了:如何将内容放入 JavaScript 数组。类似的东西content.push('<?php print require 'page.phtml'; ?>');当然行不通,因为它会返回一个多行字符串,这不适用于 JavaScript。欢迎所有想法。也许我忽略了一些非常简单的事情。

4

3 回答 3

4
<script>
<?php

ob_start();
require 'page.phtml';
$contents = ob_get_clean();

echo "var content = ".json_encode($contents);
?>
</script>

如果你的文件中没有 php 代码,page.phtml你可以让它变得更容易

<script>
<?php
echo "var content = ".json_encode(file_get_contents('page.phtml'));
?>
</script>

显然你也可以这样使用它:

echo "content.push(".json_encode($contents).");";

为什么不发挥作用

<?php
function json_require($filepath) {
  ob_start();
  require($filepath);
  return json_encode(ob_get_clean());
}
?>
...
content.push(<?=json_require('page_1.phtml');?>);
content.push(<?=json_require('page_2.phtml');?>);
content.push(<?=json_require('page_3.phtml');?>);
content.push(<?=json_require('page_4.phtml');?>);
于 2012-08-25T09:28:49.510 回答
0

您可以使用隐藏的 div 而不是使用 js 数组,在页面的末尾,这样它们就不会影响 seo。然后使用这些 div id 交换您的内容。

我希望您使用 jQuery,如果不是,即使使用简单的 js 也可以做到这一点。

让我详细说明

<script>
function shouldBeCalledAtSomeEvent(page_id)
{
   var html = $('#'+page_id+').html();
   $('#idOfYourTargetElem').html(html)
}
</script>

<!-- end of your main file -->
<div style="display:none" id="page_1">
include('page_1.phtml');
</div>

<div style="display:none" id="page_2">
include('page_2.phtml');
</div>

<div style="display:none" id="page_3">
include('page_3.phtml');
</div>
于 2012-08-25T09:29:09.853 回答
-1

如果您不能使用 ajax 并且您担心 seo,我建议您使用修改版的@rupesh 答案:将 html 存储在脚本标签中,以便它们可以被 js 访问而不会被爬虫读取:

<script type="text/hidden-menu" class="hidden_menu" >
    include('page_1.phtml');
</script>
<script type="text/hidden-menu" class="hidden_menu" >
    include('page_2.phtml');
</script>
<script type="text/hidden-menu" class="hidden_menu" >
    include('page_3.phtml');
</script>

然后您可以轻松地在 js 中构建您的数组:

var content = [],
    contentNodes = document.getElementsByClassName('hidden_menu'),
    i=0;
for(;i<contentNodes.length;i++)
   content.push(contentNodes[i].innerHTML);    

瞧:你的内容数组保存了从 php 发送的 html,而不使用 ajax 并且不影响 seo。

于 2012-08-25T09:41:33.153 回答