我需要使用 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。
即使我将其注释掉,重新启动 Web 服务器,浏览器也会在其 url 位置字段中自动将http://mysite/shop/1替换为http://mysite/shop/shop 。?!
我必须评论这些说明,重新启动服务器以及避免此 url 替换的任何内容。
到底是怎么回事 ?如何在没有这种讨厌的副作用的情况下获取页面位置 url 并设置我的按钮 href 值?
编辑1:
- 我确实应该使用.attr或.prop而不是不存在的 .setAttr 。
- url 更改仅在 chrome 和 firefox 中显示,而不在 iPad、Android 或 IE9 中显示。运行chrome调试工具,在matches.call( document.documentElement, "[test!='']:sizzle" );指令处好像有jQuery抛出的DOMException . 我不知道这意味着什么以及为什么它会导致使用不同的 url 重新加载页面。
编辑2:
- 我使用 fapws 作为 Web 服务器,使用 mako 作为模板。在我擦除了 mako 生成的缓存 python 文件后,url 更改消失了。?!
- 按照建议,我应该使用.attr和window.location.href。这有效,并且按钮的 href 属性设置为正确的值。
- 尽管它仍然无法正常工作。我现在看到了一种新的意外和不良行为。单击按钮时,位置栏中的 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 中 <a> 标记的默认行为是使用 ajax 加载目标页面,而不是使用正常的完整页面加载。属性 rel="external" 禁用此行为,然后引用的页面正常完全加载。此行为在此处的 jQM 文档中进行了描述。
注意:尽管许多答案具体有助于帮助我解决这个问题,但我检查了 Mad Man Moon 的答案,因为他非常有帮助并且得分较少。如果可以检查多个答案,我会做到的。