Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript history.js和头重定向_Javascript_Php_Redirect_History.js - Fatal编程技术网

Javascript history.js和头重定向

Javascript history.js和头重定向,javascript,php,redirect,history.js,Javascript,Php,Redirect,History.js,我在history.js上遇到了问题,我不知道如何解决 在我正在开发的网站上,我们使用history.js在页面之间移动-如果单击任何链接,history.js将通过AJAX加载URL,更新URL并为内容创建转换效果。然而,我们还有一个包含项目的索引页面;如果单击某个项目,则不会使用history.js——内容通过ajax加载并显示在弹出窗口中。还有一种情况是,用户可以打开项目的URL(例如在new tab中,或从search中),在这种情况下,用户应该被重定向到带有项目URL哈希的索引页面,这

我在history.js上遇到了问题,我不知道如何解决

在我正在开发的网站上,我们使用history.js在页面之间移动-如果单击任何链接,history.js将通过AJAX加载URL,更新URL并为内容创建转换效果。然而,我们还有一个包含项目的索引页面;如果单击某个项目,则不会使用history.js——内容通过ajax加载并显示在弹出窗口中。还有一种情况是,用户可以打开项目的URL(例如在new tab中,或从search中),在这种情况下,用户应该被重定向到带有项目URL哈希的索引页面,这将告诉JS运行单击具有哈希URL的链接的事件。但是,history.js会启动并重定向到项目URL

重申:

  • 用户来到/items/URL
  • 左键单击项(/item-[id]/URL),将在弹出窗口中打开内容(AJAX请求)
  • 右键单击项目并在“新建”选项卡中打开链接
  • 降落在/item-[id]/(不是AJAX请求),并通过头重定向重定向到/items/#/item-[id]/
  • history.js在加载后立即生效,并将用户重定向到/item-[id]/
我正在使用HTML5版本的history.js(我认为不应该这样做,dunno),它在加载history.js后立即重定向(页面上没有其他脚本)。除了将重定向更改为/items/?/item-[id]/(我认为)应该解决此问题之外,还有其他方法解决此问题吗


为了说明这一问题:

a、 html

<html>
<body>
<script type='text/javascript' src="native.history.js"></script>
<a href="b.html#/b/">b</a>
</body>
</html>
<a href="b.html" class="hashlink">B</a>

b、 html

<html>
<body>
<script type='text/javascript' src="native.history.js"></script>
<a href="a.html#/a/">a</a>
</body>
</html>
<a href="a.html" class="hashlink">A</a>

使用
native.history.js
,这是history.js的纯HTML5版本,没有在此处找到任何框架绑定:

它说明了这一点,没有任何重定向。只要你点击任何链接,你就会被history.js重定向到散列后的URL。

被删除——因为你不能按你想要的方式使用history.js,因为你将更改系统中的核心函数,这将导致无法描述的问题

您最好使用jQuery创建自己的,因为它非常简单

a、 html

<html>
<body>
<script type='text/javascript' src="native.history.js"></script>
<a href="b.html#/b/">b</a>
</body>
</html>
<a href="b.html" class="hashlink">B</a>
这显示了如何使用onhashchange,以及如何使用class
hashlink
设置任何
标记来更改哈希,而不是重定向浏览器

// handle using hash changes
(function($, w, l, d, u){
    'use strict';

    w.onhashchange = function(new, old){
        // this should handle loading your content via ajax
        // on $.ajax().success should handle reading the file into the
        // content area of your sight
        alert("hash has said you want to load '"+new+"'");
    }

    $(d).ready(function(){
        $('a.hashlink').on('click', function(e){
            l.hash = $(this).attr('href');
            e.preventDefualt(); // jQuery stop the a link default behavioured of redirecting
            //return false; // legacy jQuery support if you need it for the above
        });
    });
})(jQuery, window, document.location, document);

请注意,在javascript中,closer函数中有一个u,但是我没有向该变量的函数中输入参数。如果您的一些代码有
var undefined='something it not'

,我决定直接修改history.js并添加一个选项
preventHashRedirect

-
#1820 // if (currentState ) {

+
#1820 // if (!History.options.preventHashRedirect && currentState ) {
这就解决了问题。(基本上,散列更改不会被视为popstates,也不会触发状态更改)

可能会更改
isTraditionalAnchor
函数(该函数确定什么是锚点,什么是#之后的URL),以处理所有以
开头的哈希将是一个更好的主意

-
#1052 // var isTraditional = !(/[\/\?\.]/.test(url_or_hash));

+
#1052 // var isTraditional = /^!/.test(url_or_hash) ? true : !/[\/\?\.]/.test(url_or_hash);
通过这种方式,您实际上可以防止history.js影响以
开头的任何重定向。(例如,如果您实际上有一个名为
my.puppy
的锚点,那么执行
不会导致通过history.js重定向


下面关于@Martin Barker的想法仍然有效,尽管添加额外的重定向让我觉得有点……粗糙。

你有jsBin或fiddle的例子吗?你是如何处理/item-[id]/?你只是添加了一个标签,还添加了一个javascript触发器吗?你是在使用某种客户端路由库还是只是自定义ajax/路由?@Stevo Perisic-在处理重定向时,我不知道我是否能够提供一个提琴。我会尝试通过iframes制作一些东西。@HarryH-我想我的描述很清楚,bu让我们再试一次。用户点击的
/item-[id]/
,通过标题重定向被重定向到
/items/#/item-[id]/
(这是我重定向到的URL,我将其重定向到
/items/#/item-[id]/
,我可以很容易地更改重定向的位置),没有JS触发器。我使用的是香草PHP和jquery。用你可以使用的代码示例更新问题。有点混合来回应评论和回答。我使用了history.JS相当多-我很惊讶history.JS会自动完成OP中提到的事情。正如我在OP中所写的那样-我想要的是不同于chang的东西正在取消重定向(从
/items/#/item-[id]/
/items/?/item-[id]/
)实际上,我使用散列后的部分来搜索页面中要单击并触发JS事件的元素。我已经在使用推送状态。推送状态与OP没有任何关系。同样-为什么不建议使用散列重定向到url。我只想在客户端使用散列,并且出于我所有的预期目的就服务器而言,g
/items/#/item-[id]/
应该与点击
/items/
相同(如果我将其更改为
/items/?/item-[id]/
,则这是两个不同的URL)。不幸的是,您的解决方案没有解决这个问题。我以为您是从它开始的,但您是否尝试过使用php来响应javascript重定向,以便完全由浏览器处理。请注意,您不应该在发出ajax请求的页面中再次显示html标记,如果您用内容过度迁移整个dom,您将导致javascript错误,因为一旦js加载到浏览器中,它就不会通过从dom中删除而卸载。因此,这将导致脚本错误并停止该脚本的其余部分。请忘记PHP重定向和AJAX请求-关注示例
a.html
例如,只要你点击链接,你就会转到
a.html#/a/
;一旦页面加载了history.js,就会将你重定向到
/a/
。我不想要这个