【问题标题】:WebSharper JQuery Mobile Page HiddenWebSharper JQuery 移动页面隐藏
【发布时间】:2014-09-30 19:59:46
【问题描述】:

我正在尝试使用 F# WebSharper 框架构建一个 JQuery Mobile 站点。在 WebSharper 用语中,我使用由 Sitelet 提供服务的 JQueryMObile 控件创建了一个 Pagelet。一切都编译并运行,问题出在生成的 html 中。

我声明的页面 (simplePage) 明显存在于标记中,并使用 JQueryMobile css 类 ui-active 进行标记以使其可见。但是,它被一个 div 包围,该 div 也是一个页面,但没有用活动的 css 类标记,使其不可见。因此我在这个 div 中的页面是隐藏的。 我没有创建这个包含页面的 div。这似乎是在 html 头中加载 JQueryMobile 脚本的副作用。我怎样才能摆脱它?

我以http://websharper.com/samples/JQueryMobile 为例。我正在使用 WebSharper 版本 2.5.125.62 和 WebSharper.JQueryMobile 版本 2.5.4.198。我有一个如下所示的相关代码文件,后跟生成的 html。

主要:

open IntelliFactory.Html
open IntelliFactory.WebSharper
open IntelliFactory.WebSharper.Html
open IntelliFactory.WebSharper.JQuery
open IntelliFactory.WebSharper.Sitelets

type Action = | Home

[<JavaScript>]
module MyJQueryContent =

    let Main() =
        JQuery.Mobile.Mobile.Use()
        let page = Div [
                        Id "simplePage"
                        HTML5.Attr.Data "role" "page"
                        HTML5.Attr.Data "url" "#simplePage"
                        ] -< [
                        Div[Text "content"]
                    ]
        Div [page]
        |>! OnAfterRender (fun _ -> JQuery.Of(page.Body)
                                    |> JQuery.Mobile.JQuery.Page
                                    |> ignore

                                    JQuery.Mobile.Mobile.Instance.ChangePage(JQuery.Of(page.Body)))

[<Sealed>]
type MyJQueryMobileEntryPoint() =
    inherit Web.Control()

    [<JavaScript>]
    override this.Body = MyJQueryContent.Main() :> _

module Pages =

    let HomePage =
        PageContent <| fun context ->
            { Page.Default with
                Title = Some "Index"
                Body = [IntelliFactory.Html.Tags.Div[new MyJQueryMobileEntryPoint()]] }

[<Sealed>]
type Website() =
    interface IWebsite<Action> with
        member this.Sitelet = Sitelet.Content "/" Home Pages.HomePage
        member this.Actions = [Home]

type Global() =
    inherit System.Web.HttpApplication()

    member g.Application_Start(sender: obj, args: System.EventArgs) =
        ()

[<assembly: Website(typeof<Website>)>]
do ()

输出:

【问题讨论】:

    标签: jquery-mobile f# websharper


    【解决方案1】:

    附带说明一下,当您在添加 OnAfterRender 之前编写 Div [page] 而不是 page 时,您正在创建包含 DIVs 之一,但实际上这不是您的问题。

    正如 Omar 所描述的,使用 jQuery Mobile,您需要仔细控制页面结构初始化的时间和方式,尤其是在处理动态页面时。我记得以前看到过你的确切问题,但我在我的邮箱中找不到那个对话,但是,这里有一篇较早的文章,其中有一些有用的信息可用于利用 JQM 页面初始化:

    http://fpish.net/blog/JankoA/id/3362/201367-jquery-mobile-page-reuse-with-websharper

    【讨论】:

    • 好提示。 pagebeforechange 在显示“主页”之前触发。但是,它会触发两次,第一次返回string (URL),第二次返回object。在文章中它监听第一个事件| :? string as pageUrl -&gt;
    • 感谢您搜索电子邮件。我已经看到了您提供的链接,但对于我想要完成的事情来说,它已经太冒险了。我希望看到一个使用 WebSharper 构建的 JQM 站点的综合示例,其中包括表单提交和服务器端数据检索。到目前为止,我在 WS 方面遇到了很多困难——我没有那种成功的感觉......
    【解决方案2】:

    当 jQuery Mobile 框架被加载时,它会检查 DOM 中是否存在 page div。如果没有,它会将正文的内容包装在 page div 中。要控制这种行为,您需要阻止 jQM 的 autoInitializePage 以便在您需要时手动初始化 $.mobile.initializePage()

    您需要监听mobileinit 事件来覆盖autoInitializePage。在head 中,代码应放在jQuery(核心)之后和jQuery Mobile 库之前。

    /* jQuery.js */
    $(document).on("mobileinit", function () {
      $.mobile.autoInitializePage = false;
    });
    /* jQuery-Mobile.js */
    

    现在您可以随时通过调用$.mobile.initializePage()初始化 jQuery Mobile。

    【讨论】:

    • 感谢 Omar,这非常有用,我可以破解一个虚假的页面 div 来防止 JQM 包装我的内容。不过,在我接受答案之前,我希望得到 WebSharper 人员的注意。
    • @Nick 我误解了你的评论,我的错 :) 看起来有比我更好的答案。
    【解决方案3】:

    我是 WebSharper 的开发人员。 Omar 是对的,这是 JQM 的事情,另一种解决方法是在 sitelet 中有一个虚拟页面节点。像这样:

    module Pages =
        open IntelliFactory.Html
    
        let HomePage =
            PageContent <| fun context ->
                { Page.Default with
                    Title = Some "Index"
                    Body = 
                        [
                            Div [HTML5.Data "role" "page"; Id "dummy"]
                            Div [new MyJQueryMobileEntryPoint()]
                        ] }
    

    【讨论】:

    • 没有 dummy page div 是否可行?只需手动初始化 jQM?
    • 这正是我所追求的,更好地协调 JQM 事件。 hack 有效,但它只是一个 hack。
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2022-08-16
    • 1970-01-01
    相关资源
    最近更新 更多