2

在我的 html 页面中有以下标记,以根据是否单击搜索图标来切换搜索栏:

<a id="searchIcon" href="/"></a> 

<div id="searchWrapOuter" style="display:none;">
    <div id="searchWrapInner">
        <div id="formContainer">
            <form id="searchForm" action="#">
                <div>
                    <input type="search" name="search-mini" id="search-mini" value="" data-mini="true" />
                </div>
            </form>
        </div>
    </div>
</div>

宽度以下 javascipt/jquery:

 $(function() {
        $(document).on("click", "#searchIcon", function () {
            var searchWrapper = $("#searchWrapOuter");
            $(searchWrapper).slideToggle();
            return false;
        });
});

此代码在直接从 Url 加载的页面上按预期工作。当从一个加载了 Ajax 的链接进入页面时,将页面的内容加载到 DOM 中,并且 DOM 就绪处理程序仅针对第一页执行。

我已阅读有关使用

$(document).on('pageinit'),而不是 $(document).ready()/$(function()

但是,当从 ajax 链接进入时,我仍然无法让它工作。实现这些事件以使来自 Ajax 链接的代码正常工作的正确方法是什么?

谢谢,

4

3 回答 3

3

很可能是因为您使用的是 ID 而不是类。jQuery Mobile 不能很好地处理 ID,因为它会将页面缓存到 DOM 中,因此如果您打开一个页面,关闭它,然后返回该页面,您的页面可能会在 DOM 中出现两次(一个可见,一个隐藏/缓存)。因此,当您这样做时,$("#searchWrapOuter")您不知道实际处理的是哪个元素(在您的情况下,可能是隐藏的元素)。

解决方案是将您的 ID 更改为类。这不是很直观,但我发现这是使用 jQuery Mobile 的最佳方式。

另请注意文档中可能与您相关的此评论:

所有元素的 id 属性不仅在给定页面上必须是唯一的,而且在站点中的各个页面上也必须是唯一的。这是因为 jQuery Mobile 的单页导航模型允许许多不同的“页面”同时出现在 DOM 中。这在使用多页模板时也适用,因为模板上的所有“页面”都是一次加载的。

http://jquerymobile.com/demos/1.2.0/docs/pages/page-anatomy.html

于 2013-01-14T09:53:05.803 回答
0

您可以手动将延迟时间调整为 500ms 和 1s。

$(searchWrapper).delay(1000).slideToggle(); 
于 2013-01-14T09:58:03.730 回答
0

我的问题是页面 ID 在页面标签下方。因此,一旦我将页面 div 移到它上面,javascript 就会包含在 ajax 页面加载中。在此之前

于 2019-11-26T21:53:36.087 回答