【发布时间】: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:
- 我确实应该使用 .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 中 标记的默认行为是使用 ajax 加载目标页面,而不是使用正常的完整页面加载。属性 rel="external" 禁用此行为,然后引用的页面正常完全加载。此行为在 jQM 文档here 中进行了描述。
注意:虽然很多答案具体有助于我解决这个问题,但我检查了 Mad Man Moon 的答案,因为他非常有帮助并且得分较少。如果可以检查多个答案,我会做到的。
【问题讨论】:
标签: javascript jquery jquery-mobile