【问题标题】:How not to change the web page URL?如何不更改网页 URL?
【发布时间】:2012-06-10 11:17:51
【问题描述】:

我需要使用 jQuery mobile 设置相对于当前页面 url 的按钮的 href 值。

于是我天真地写了如下代码:

var path = window.location;
path = path.replace( "shop","edit" );
$("#btnEdit").setAttr( "href", path );

页面的url是http://mysite/shop/1,按钮的href应该设置为http://mysite/edit/1.

当此代码插入到我的“pageinit”处理程序的顶部时,我看到浏览器(firefox 和 chrome)位置栏中的 url 更改为 http://mysite/shop/shop 并且页面显然已重新加载,所以我收到 404 错误,因为它必须在 /shop/ 之后有一个数字,并且它的值应该是 1。

即使我把它注释掉,重启网络服务器,浏览器会自动将 http://mysite/shop/1 替换为 http://mysite/shop/shop 在其 url 位置字段中。 ?!

我必须评论这些说明,重新启动服务器以及避免此 url 替换的任何事情。

发生了什么事? 如何在没有这种讨厌的副作用的情况下获取页面位置 url 并设置我的按钮 href 值?


编辑 1:

  1. 我确实应该使用 .attr.prop 而不是不存在的 .setAttr。
  2. url 更改仅在 chrome 和 firefox 中显示,在 iPad、Android 或 IE9 中不显示。运行 chrome 调试工具,在指令 matches.call( document.documentElement, "[test!='']:sizzle" ); 处似乎出现了 jQuery 抛出的 DOMException。我不知道这意味着什么以及为什么它会导致使用不同的 url 重新加载页面。

编辑 2:

  1. 我使用 fapws 作为 Web 服务器,使用 mako 作为模板。在我擦除了 mako 生成的缓存 python 文件后,url 更改消失了。 ?!
  2. 建议我应该使用 .attrwindow.location.href。这有效,并且按钮的 href 属性设置为正确的值。
  3. 虽然它仍然不能正常工作。我现在看到了一种新的意外和不良行为。点击按钮时,地址栏的url变成http://mysite/edit/1,执行商店页面的pageinit(?!),然后加载编辑页面不执行其 pageinit 事件。

解决方案:

在 html 文件中,我用默认的 href 值定义了这个按钮,没有什么特别的:

<a href="#" data-role="button" data-icon="pencil" id="btnEdit"> Edit </a>

在脚本文件中,更准确地说是在 $(document).on('pageinit',...) 的处理程序中,我现在有了这段代码,它设置了 href 值,但也添加了 rel="external" 属性到按钮。

var path = window.location.href;
path = path.replace( "shop","edit" );
$("#btnEdit").attr( "href", path ).attr( "rel", "external" );

页面不再自动重新加载,加载的奇怪行为已被删除。这是因为 jQuery Mobile 中 标记的默认行为是使用 ajax 加载目标页面,而不是使用正常的完整页面加载。属性 rel="external" 禁用此行为,然后引用的页面正常完全加载。此行为在 jQM 文档here 中进行了描述。

注意:虽然很多答案具体有助于我解决这个问题,但我检查了 Mad Man Moon 的答案,因为他非常有帮助并且得分较少。如果可以检查多个答案,我会做到的。

【问题讨论】:

    标签: javascript jquery jquery-mobile


    【解决方案1】:

    即使我把 it 注释掉,重启网络服务器、浏览器 自动将 ~/shop/1 替换为 ~/shop/shop 在其 url 位置字段中。 ?!

    我必须评论这些说明,重新启动服务器等等 避免这种 url 替换。

    1. 我有点困惑。您要评论的“它”是什么?
    2. 即使对 window.location 的变量引用执行替换,它也应该将“shop”替换为“edit”,因此重定向应该是“mysite/edit/1”(除非 js 正则表达式引擎是否将 1 视为捕获索引?)
    3. 根据您的 RESTful 样式 URL,我怀疑您正在使用某种服务器端 MVC 框架。如果是这样,重定向很可能是服务器端问题,与替换无关。
    4. 最后,不要设置 path = window.location,而是将其设置为 window.location.href。 window.location 是 object,其中包含 URI 属性(href、search、hash 等)。 window.location.href 是完整 URL 的字符串属性。

    编辑:我决定自己做一个小测试,并确认问题在于您正在设置 path = window.location。设置 path = window.location.href 你的代码就可以工作了。

    【讨论】:

    • 非常感谢您的建议。 1) 'it' 是上面显示的三行代码。 2) 是的。这令人困惑。另一个令人困惑的事情是,在我的 iPad 和 android 手机上,url 没有被修改,我可以看到页面。 3)我使用 fapws python wsgi。我不确定它是否在服务器端。 iPad、Android 的浏览器和 Internet Explorer 不会出现此问题。 4) 一旦 url 路径更改得到纠正,我将很高兴尝试此操作。
    • 问题来自服务器。 fapws 生成一些缓存的 python 文件。我删除了它们,url 重写问题就消失了。我没有查看文件。您编辑部分中的建议也有效。我现在得到正确的网址。但是当我点击它时,似乎没有触发pageinit事件。
    • 上面添加click事件处理程序的代码是在DOM加载后添加的吗?无论是在正文标签的末尾还是在 $(document).ready() 内?
    • 上面的代码在商店页面的pageinit事件处理程序中。即使我将商店页面(html)中按钮的href设置为编辑页面url,当我点击按钮时,商店页面的pageinit处理程序被调用,当编辑页面加载时,它的initpage处理程序是未调用。
    • 一个更奇怪的行为是,如果我重新加载页面编辑页面,它的 pageinit 事件被调用并且内容被初始化并显示。如果我然后单击浏览器的后退按钮,它应该会显示商店橱窗。但是我看到的是调用的是编辑页面的pageinit,然后显示店铺页面,并没有产生它的pageinit事件。
    【解决方案2】:

    使用attr 而不是setAttr (除非您没有使用自定义函数或某些框架/库)

    $("#btnEdit").attr( "href", path );
    

    至于 URL 自动更改,请查看您是否在 .htaccess 文件中进行了 URL 重写,或者是否有代码正在更改其他文件中的 URL。

    【讨论】:

    • 没错。但我仍然看到 url 发生变化。即使在注释掉代码后我也无法删除它。我使用了带有编辑的 url,它没有显示这种行为。所以其他地方可能存在错误。
    【解决方案3】:

    试试这个

    var path = window.location;
    path = path.replace( "shop","edit" );
    $("#btnEdit").prop( "href", path );
    

    【讨论】:

    • 你是对的,我上面的代码是假的。我应该使用 .attr 或 .prop。我现在专注于我的 url 更改和重新加载问题。
    【解决方案4】:

    您的问题是pathwindow.location 的别名,所以path.replace()window.location.replace(),这会触发重定向。

    解决方法:在window.location后面加上.toString(),获取字符串值而不是对象。 var path = window.location.toString()

    【讨论】:

    • 我怀疑这一点。但显然我应该使用 windows.location.href。这可以在不生成重定向的情况下工作。
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多