【问题标题】:$(document).ready function won't fire up$(document).ready 函数不会启动
【发布时间】:2013-04-06 12:05:12
【问题描述】:

我正在构建一个由几个 jquery 移动页面组成的项目,每个页面都有一个导航栏。

当我查看每个页面时,$(document).ready 函数会很好地启动,但是当我通过导航栏转到该页面时它不会启动.. 同样在 chrome 调试器中,我只看到一个 html 页面(我当前正在查看的那个)在源文件夹中。

当我刷新页面时,功能正常

尝试将“$(document).ready(function () {”替换为:

"$("div[data-role*='page']").live('pageshow', function(event, ui) {" 有人建议

但这也不好用。

这是我加载的第一个页面:

<!DOCTYPE html> 
<html> 
<head> 
    <title>My Page</title>

    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link href="css/jquery.mobile-1.2.0.min.css" rel="stylesheet" type="text/css" /> 
    <script src="js/jquery-1.8.2.min.js" type="text/javascript"></script>
    <script src="js/jquery.mobile-1.2.0.min.js" type="text/javascript"></script>
    <link href="css/TableCSSCode.css" rel="stylesheet" type="text/css" />

    <script>

        $(document).ready(function () {



            $.ajax({
                type: "POST",
                url: "getdata.aspx/return_member_list",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",

                success: function (res) {

                    var parsedData = JSON.parse(res.d);
                    var tableStr = "<table class='CSSTableGenerator'>";

                    $.each(parsedData, function () {
                        tableStr += "<tr><td>" + this.fName + "</td><td>" + this.lName + "</td></tr>";
                    });
                    tableStr += "</table>";
                    $('#tableDiv').html(tableStr);


                },
                error: function (res, msg, code) {
                    // log the error to the console
                    alert("The following error occured: " + msg + " " + code);
                } //error

            });

        });


    </script>


</head> 
<body>
       <div id="page1" data-role="page" data-theme="a">

            <div data-role="header" data-theme="a">
                <h1>חברי העמותה</h1>
            </div> 

            <div data-role="navbar">
                <ul>
                    <li><a href="index.htm">חברי העמותה</a></li>
                    <li><a href="build.htm">בניית צוות</a></li>
                    <li><a href="test.htm"> בדיקה</a></li>
                </ul>
            </div>

            <div data-role="content">
                <div id="tableDiv"></div>
            </div>

            <div data-role="footer">
                <h1>footer area</h1>
            </div>
    </div>


</body>
</html>

下面是第二页和第三页的标题: build.htm:

<head> 
    <title>My Page</title>

    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link href="css/jquery.mobile-1.2.0.min.css" rel="stylesheet" type="text/css" /> 
    <script src="js/jquery-1.8.2.min.js" type="text/javascript"></script>
    <script src="js/jquery.mobile-1.2.0.min.js" type="text/javascript"></script>
    <link href="css/TableCSSCode.css" rel="stylesheet" type="text/css" />

    <script type="text/javascript">

        function save_crew()
        {

            p_num = new Object();
            p_num.p1 = p1.value;
            p_num.p2 = p2.value;
            p_num.p3 = p3.value;
            p_num.p4 = p4.value;

            l_num = new Object();
            l_num.l1 = l1.value;
            l_num.l2 = l2.value;
            l_num.l3 = l3.value;


            s_num = new Object();
            s_num.s1 = s1.value;
            s_num.s2 = s2.value;
            s_num.s3 = s3.value;



            var photo = { 'p1': p_num.p1, 'p2': p_num.p2, 'p3': p_num.p3, 'p4': p_num.p4 };
            var light = { 'l1': l_num.l1, 'l2': l_num.l2, 'l3': l_num.l3, 'l4': l_num.l4 };
            var sound = { 's1': s_num.s1, 's2': s_num.s2, 's3': s_num.s3, 's4': s_num.s4 };

            // Put the object into storage
            localStorage.setItem('photo', JSON.stringify(photo));
            localStorage.setItem('light', JSON.stringify(light));
            localStorage.setItem('sound', JSON.stringify(sound));

            // Retrieve the object from storage
            var retrievedObject = localStorage.getItem('sound');

            var ro = JSON.parse(retrievedObject);

            alert(ro.s2);

            window.location.href="test.htm";

        }



    </script>


</head> 

test.htm:

<head> 
    <title>My Page</title>

    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link href="css/jquery.mobile-1.2.0.min.css" rel="stylesheet" type="text/css" /> 
    <script src="js/jquery-1.8.2.min.js" type="text/javascript"></script>
    <script src="js/jquery.mobile-1.2.0.min.js" type="text/javascript"></script>
    <link href="css/TableCSSCode.css" rel="stylesheet" type="text/css" />

    <script type="text/javascript">

        $(document).ready(function () {

            var sound_RO = localStorage.getItem('sound');
            var photo_RO = localStorage.getItem('photo');
            var light_RO = localStorage.getItem('light');

            sound_RO = JSON.parse(sound_RO);
            photo_RO = JSON.parse(photo_RO);
            light_RO = JSON.parse(light_RO);

            $.each(sound_RO, function (index, value) {
                alert(value);
            });

            $.ajax({
                type: "POST",
                url: "getdata.aspx/return_prof",
                data: "{prof:'צלם'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",

                success: function (res) {

                    var parsedData = JSON.parse(res.d);





                    $('[data-role="content"]').append('<div id="collapsible-set" data-role="collapsible-set"></div>');
                    $("#collapsible-set").append('<div id="collapsible" data-role="collapsible"></div>');
                    $("#collapsible").append('<h3>צלמים </h3>');

                    for (i = 0; parsedData[i] != null; i++) {

                        $("#collapsible").append('<p>' + parsedData[i].fName + ' ' + parsedData[i].lName + '</p>');

                    }

                    $('[data-role="content"]').trigger('create');







                },
                error: function (res, msg, code) {
                    // log the error to the console
                    alert("The following error occured: " + msg + " " + code);
                } //error

            });

        });




    </script>


</head> 

【问题讨论】:

  • 重要的是要意识到document.ready 已经出现在主页面中,因此来自 ajax 的代码将立即触发。它不会等待它后面的任何 html 加载
  • 您是否尝试过使用$.mobile.changePage() 在页面之间导航?

标签: javascript html jquery-mobile jquery


【解决方案1】:

原因

当 jQuery Mobile 在第一个页面(使用 ajax)之后加载页面时,它只会加载其 BODY 内容,这意味着在 HEAD 中初始化的任何 js 或 css 文件(如果在第一次加载的 HTML 中未初始化)将被忽略.所以你所有的自定义js代码永远不会被执行。

解决方案

将所有 js 代码移动到第一个 HTML 文件中

你应该创建一个新的 js 文件,随便命名。将所有 js 代码(来自每一页)放入其中。然后在要加载的第一个 HTML 文件中对其进行初始化。

将你的 js 代码移动到页面 BODY

只需打开每个页面并将其 javascript 代码从 HEAD 移动到 BODY。因此,javascript 代码将被加载到 DOM 中并在页面显示时执行。

最后的想法

所有这些都在我的其他答案/文章中进行了更详细的描述+示例:Why I have to put all the script to index.html in jquery mobile

您还应该考虑切换到 jQuery Mobile 页面事件而不是文档就绪。文档就绪通常可以正常工作,但有时它会在页面加载到 DOM 之前触发。这就是为什么必须使用 jQM 页面事件。他们将确保仅在页面安全加载到 DOM 后触发页面内容。要了解更多信息,请查看此答案/文章:jQuery Mobile: document ready vs page events

【讨论】:

  • 感谢您的回答。我将每个页面的脚本移动到 body 标记内(在所有元素之前)。第一页工作正常,但在 build.htm 页面中它无法识别我的 build_crew() 函数..并且第三页代码不会执行。通过第二种方式,您的意思是我应该在外部 js 文件中构建函数,将文件包含到我的 index.htm 头中。但是如果我希望它们在每个页面加载时加载,我应该从哪里调用它们?
  • 首先告诉我如何在 build.html 中初始化 build_crew() 函数?如果将它们移动到单个 index.js 文件中,则需要使用 jQM 页面事件进行初始化。这里我给你举个例子,看看:jsfiddle.net/Gajotres/8hKe2
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 2014-04-20
  • 2012-02-17
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多