2013-09-05 86 views
0

我有一個簡單的HTML文件,該文件是這樣的:jQuery Mobile的和動態頁面

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Inpress</title> 

    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 

    <link rel="stylesheet" href="/src/css/themes/inpress.css" /> 
    <link rel="stylesheet" href="/src/css/jquery.mobile.structure-1.3.2.min.css" /> 

    <script src="/src/scripts/jquery-1.10.2.min.js"></script> 
    <script src="/src/scripts/jquery.mobile-1.3.2.min.js"></script> 
    <script src="/src/scripts/inpress/jquery.inpress.js"></script> 

    <style> 
     * { 
      -ms-touch-action: none; 
     } 

     .fullscreen { 
      position: absolute; 
      top: 0; 
      left: 0; 
      right: 0; 
      bottom: 0; 
      overflow: hidden; 
      width: 100%; 
      height: 100%; 
     } 
    </style> 
</head> 
<body> 
</body> 
</html> 

然後我創建動態使用jQuery和JSON的組合的所有頁面。 我的問題是,我可以輕鬆地添加類ui-page-active來顯示頁面,但它不工作,因爲我希望。 在正常版本中,我可以在#home中使用url,它會顯示出來,但是當我刷新頁面時,它總是顯示第一個。

所以我的問題是:

我可以加載的所有項目到頁面之前jQuery Mobile的嘗試做它的魔力?

更新1

好吧,這裏是我用來創建我的網頁的代碼。

function createPages(data) { 
    if (data.configuration.global.target) { 
     showDebug("Creating pages."); 

     $.each(data.pages, function (i, item) { 
      if (item.enabled) { 
       var loadTemplate = (i == 0) ? true : false; 
       createPage(item.template, loadTemplate); 
      } else { 
       showDebug("The page is disabled."); 
      } 
     }); 

     //if (document.location.hash != "") 
     // startPage = document.location.hash; 

     //showDebug(startPage); 

     //$.mobile.changePage(startPage); 
    } else { 
     showDebug("The target file could not be found."); 
    } 
}; 

function createPage(template, loadTemplate) { 
    $.ajax({ 
     url: template, 
     dataType: 'json', 
     async: false, 
     success: function (data) { 
      showDebug("Creating page."); 

      var page = createElement(data); 
      var id = page.attr('id'); 

      $('body').append(page); 
      $('#' + id).trigger('create'); 

      showDebug("Page created: " + id); 
     } 
    }); 
}; 

function createElement(template) { 
    var o; 

    o = $('<' + template.element + '/>'); 

    if (template.id) { 
     o.attr("id", template.id); 
    } 

    if (template.href) { 
     o.attr("href", template.href); 
    }; 

    if (template.src) { 
     o.attr("src", template.src); 
    }; 

    if (template.type) { 
     o.attr("type", template.type); 
    }; 

    if (template.classes) { 
     $.each(template.classes, function (i, item) { 
      o.addClass(item); 
     }); 
    } 

    if (template.data) { 
     $.each(template.data, function (key, value) { 
      $.each(value, function (key, value) { 
       o.attr("data-" + key, value); 
      }); 
     }); 
    } 

    if (template.content) { 
     $.each(template.content, function (i, item) { 
      if (item.element) { 
       o.append(createElement(item)); 
      } else { 
       o.append(item); 
      } 
     }); 
    } 

    return o; 
}; 

,只是讓你得到它的解析JSON的想法:

{ 
    "id":"introPage", 
    "element":"div", 
    "data":[ 
     { 
     "role":"page" 
     } 
    ], 
    "content":[ 
     { 
     "element":"div", 
     "data":[ 
      { 
       "role":"content" 
      } 
     ], 
     "content":[ 
      { 
       "id":"skip-intro", 
       "element":"a", 
       "href":"#homePage", 
       "content":[ 
        { 
        "id":"introMovie", 
        "element":"video", 
        "classes":[ 
         "fullscreen" 
        ], 
        "content":[ 
         { 
          "element":"source", 
          "type":"video/mp4", 
          "src":"/src/assets/test.mp4" 
         }, 
         { 
          "element":"source", 
          "type":"video/webm", 
          "src":"/src/assets/test.webm" 
         }, 
         { 
          "element":"source", 
          "type":"video/ogg", 
          "src":"/src/assets/test.ogv" 
         }, 
         "Your browser does not support the video tag." 
        ] 
        } 
       ] 
      } 
     ] 
     } 
    ] 
} 

我希望幫助你幫助我:)

歡呼聲, /r3plica

+0

爲什麼要在JQM增強它們之前注入元素?要創建一個頁面,只需爲活動頁面調用'pagecreate'而不是'create'。對於注入DOM的其他頁面,您不需要進一步增強。 – Omar

+0

不確定你的意思。從文檔的外觀你只需要在頁面上運行插件時調用pagecreate – r3plica

+0

'pagecreate'增強頁面和內部的元素。它通常用於添加或修改頁面的主要部分,即頁眉/頁腳/面板,僅用於活動頁面。演示:面板http://fiddle.jshell.net/Palestinian/kCtnG/網頁http://fiddle.jshell.net/Palestinian/YJuJ5/ – Omar

回答

0

修正這個我自己。 問題在於讓代碼在正確的時間執行。綜觀文檔的最佳時間做,這是http://api.jquerymobile.com/pagebeforechange/

所以我修改了代碼,這是我所:

debug = true; 
initialized = false; 

$(document).bind("pagebeforechange", function (e, data) { 
    if (!initialized) { 
     initialize(); 

     e.preventDefault(); 
    } 
}); 

function initialize() { 
    $.getJSON('/src/assets/json/config.txt', function (data) { 
     initialized = true; 

     createPages(data); 
    }); 
}; 

function createPages(data) { 
    if (data.configuration.global.target) { 
     showDebug("Creating pages."); 

     $.each(data.pages, function (i, item) { 
      if (item.enabled) { 
       var loadTemplate = (i == 0) ? true : false; 
       createPage(item.template, loadTemplate); 
      } else { 
       showDebug("The page is disabled."); 
      } 
     }); 
    } else { 
     showDebug("The target file could not be found."); 
    } 
}; 

function createPage(template, loadTemplate) { 
    $.ajax({ 
     url: template, 
     dataType: 'json', 
     async: false, 
     success: function (data) { 
      showDebug("Creating page."); 

      var page = createElement(data); 
      var pageId = '#' + page.attr('id'); 

      $('body').append(page); 

      if (document.location.hash) { 
       if (document.location.hash == pageId) { 
        $.mobile.changePage(document.location.hash); 
       } 
      } else { 
       if (loadTemplate) { 
        $.mobile.changePage(pageId, { changeHash: false }); 
       } 
      } 

      showDebug("Page created."); 
     } 
    }); 
}; 

function createElement(template) { 
    var o; 

    o = $('<' + template.element + '/>'); 

    if (template.id) { 
     o.attr("id", template.id); 
    } 

    if (template.href) { 
     o.attr("href", template.href); 
    }; 

    if (template.src) { 
     o.attr("src", template.src); 
    }; 

    if (template.type) { 
     o.attr("type", template.type); 
    }; 
    if (template.classes) { 
     $.each(template.classes, function (i, item) { 
      o.addClass(item); 
     }); 
    } 

    if (template.data) { 
     $.each(template.data, function (key, value) { 
      $.each(value, function (key, value) { 
       o.attr("data-" + key, value); 
      }); 
     }); 
    } 

    if (template.content) { 
     $.each(template.content, function (i, item) { 
      if (item.element) { 
       o.append(createElement(item, false)); 
      } else { 
       o.append(item); 
      } 
     }); 
    } 

    return o; 
}; 

function showDebug(message) { 
    if (debug) { 
     console.log(message); 
    } 
}; 

您可以在我運行該位createPage功能看代碼:

if (document.location.hash) { 
    if (document.location.hash == pageId) { 
     $.mobile.changePage(document.location.hash); 
    } 
} else { 
    if (loadTemplate) { 
     $.mobile.changePage(pageId, { changeHash: false }); 
    } 
} 

來處理我的哈希值,如果我們有一組或者,如果我們不這樣做,它會檢查,如果這是一個應該載入的頁面。這將基本上將第一頁設置爲默認頁面(不更改散列),但是如果我們已經在url中指定了散列,那麼它將會轉到那裏。

0

下面的代碼添加到這裏定義爲JSON的動態頁面中。我在這裏留下了一個保留頁面,這不是絕對必要的,但是如果你在模板上加載ajax,看起來會更好,因爲用戶可能會在一段時間內看到空的空間。

這裏第一頁有一個鏈接,您可以點擊加載動態生成的頁面。當然,因爲你有相關的網址,只有相關的網址是正確的,視頻才能正常顯示。我已經改變了視頻的href回到mainPage這裏演示如何動態頁面可以通過錨href改變到另一個頁面。 (它也可能是另一個動態添加頁面的ID)。 如果您想立即加載其中一個動態頁面,請取消註釋下面的$.mobile.changePage('#somePageId');

N.B.請記住,如果您通過ajax調用頁面,因爲這是異步的,您將需要在ajax調用的成功函數內進行changePage調用。

至於在完整頁面刷新後直接打開一個動態頁面,這將永遠不會工作,因爲當您直接引用錨定參考並且因此它不存在時動態頁面尚未添加在DOM中嘗試直接訪問它。

<!DOCTYPE html> 
<html> 

    <head> 
     <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
     <title>- jsFiddle demo by robschmuecker</title> 
     <script type='text/javascript' src='//code.jquery.com/jquery-1.9.1.js'></script> 
     <script type="text/javascript" src="http://code.jquery.com/mobile/1.3.0-beta.1/jquery.mobile-1.3.0-beta.1.js"></script> 
     <link rel="stylesheet" type="text/css" href="http://code.jquery.com/mobile/1.3.0-beta.1/jquery.mobile-1.3.0-beta.1.css"> 
     <link rel="stylesheet" type="text/css" href="/css/result-light.css"> 
     <script type='text/javascript'> 
      //<![CDATA[ 
      $(window).load(function() { 
       jsonData = { 
        "id": "introPage", 
         "element": "div", 
         "data": [{ 
         "role": "page" 
        }], 
         "content": [{ 
         "element": "div", 
          "data": [{ 
          "role": "content" 
         }], 
          "content": [{ 
          "id": "skip-intro", 
           "element": "a", 
           "href": "#mainPage", 
           "content": [{ 
           "id": "introMovie", 
            "element": "video", 
            "classes": [ 
            "fullscreen"], 
            "content": [{ 
            "element": "source", 
             "type": "video/mp4", 
             "src": "/src/assets/test.mp4" 
           }, { 
            "element": "source", 
             "type": "video/webm", 
             "src": "/src/assets/test.webm" 
           }, { 
            "element": "source", 
             "type": "video/ogg", 
             "src": "/src/assets/test.ogv" 
           }, 
            "Your browser does not support the video tag."] 
          }] 
         }] 
        }] 
       }; 

       function createPage(data) { 
        var page = createElement(data); 
        var id = page.attr('id'); 

        $('body').append(page); 
        $('#' + id).trigger('create'); 
       }; 

       function createElement(template) { 
        var o; 

        o = $('<' + template.element + '/>'); 

        if (template.id) { 
         o.attr("id", template.id); 
        } 

        if (template.href) { 
         o.attr("href", template.href); 
        }; 

        if (template.src) { 
         o.attr("src", template.src); 
        }; 

        if (template.type) { 
         o.attr("type", template.type); 
        }; 

        if (template.classes) { 
         $.each(template.classes, function(i, item) { 
          o.addClass(item); 
         }); 
        } 

        if (template.data) { 
         $.each(template.data, function(key, value) { 
          $.each(value, function(key, value) { 
           o.attr("data-" + key, value); 
          }); 
         }); 
        } 

        if (template.content) { 
         $.each(template.content, function(i, item) { 
          if (item.element) { 
           o.append(createElement(item)); 
          } else { 
           o.append(item); 
          } 
         }); 
        } 

        return o; 
       }; 
       createPage(jsonData); 
       // Example of how to change page programatically. 
       //$.mobile.changePage('#introPage'); 
      }); //]]> 
     </script> 
    </head> 

    <body> 
     <div id="mainPage" data-role="page"> 
      <div data-role="header"> 
        <h1>Page Title</h1> 

      </div> 
      <!-- /header --> 
      <div data-role="content"> 
       <p>Page content goes here. <a href="#introPage">Click to load new page.</a> 

       </p> 
      </div> 
      <!-- /content --> 
      <div data-role="footer"> 
        <h4>Page Footer</h4> 

      </div> 
      <!-- /footer --> 
     </div> 
     <!-- /page --> 
    </body> 

</html> 

Working Fiddle Here

+0

這是不正確的,也許你不明白。在你的例子中你已經有了一個默認頁面。從那裏你點擊了動態加載新頁面。我說的是沒有頁面,我的腳本在創建完成後立即創建它們,我需要它加載第一頁或散列 – r3plica

+0

請顯示如何動態創建它們?您可能需要調用頁面上的$('#someNewPageId')。trigger('create');'方法然後根據上述方法加載/更改爲第一個方法 –

+0

好的,我編輯了我的問題以包含我的一些代碼 – r3plica