精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

創建由jQuery Mobile驅動的移動web應用程序

移動開發
jQuery 驅動著 Internet 上的大量網站,在瀏覽器中提供動態用戶體驗,促使傳統桌面應用程序越來越少。現在,主流移動平臺上的瀏覽器功能都趕上了桌面瀏覽器,因此 jQuery 團隊引入了 jQuery Mobile(或 JQM)。JQM 的使命是向所有主流移動瀏覽器提供一種統一體驗,使整個 Internet 上的內容更加豐富 — 不管使用哪種查看設備。本教程在一個面向銷售驅動導向的自動化應用程序背景下介紹 jQuery Mobile 的基本設計概念。您可以創建一個直觀生動的移動 web 應用程序,與一個 Internet 承載的網站進行交互,存儲和管理銷售機會。

開始之前

為了使本教發揮最大作用,您應該熟悉使用 HTML、JavaScript 和 CSS 構建 web 應用程序。另外,這個移動 web 應用程序附帶的服務器端代碼是用 PHP 和 MySQL 編寫的。熟悉服務器端編程也有助于您跟隨本教程的操作。如果您熟悉其他服務器端平臺,比如 ASP Classic、ASP.Net 或 Java™ Server Pages,那么您可能會發現,服務器端代碼很容易理解。熟悉 jQuery 并不是必須的,當然,熟悉它不會有壞處。事實上,本教程的目標讀者是致力于探索新框架的移動程序員,而不是準備拓展到移動空間的 jQuery 專業人員。學習完本教程后,您將了解如何構建一個基本的 jQuery Mobile 應用程序以及如何在移動瀏覽器和后端服務器之間管理數據。這個應用程序演示如何在銷售相關數據上執行基本記錄操作(比如 insert、update、delete)。當您從多個瀏覽器運行您的移動 web 應用程序時,您將注意到它有多么通用。最后,您可以將您的移動 web 應用程序的快捷鍵安裝在 iPod 和 Android 設備的主屏幕上,從而演示如何部署一個 web 應用程序。

關于本教程

本教程介紹 jQuery Mobile (JQM) 框架,該框架用于編寫針對移動行業的主流瀏覽器的移動 web 應用程序。JQM 用于向一些移動設備(比如 iPhone、iPad、Android、WebOS、BlackBerry Version 6 (Torch, Playbook) 等等)上運行的基于 web 的應用程序提供直觀統一的用戶體驗。本教程首先簡要介紹 JQM 項目,以及 JQM 與 HTML5 的關系及其對后者的依賴。然后,本教程介紹構建一個 JQM 應用程序的眾多方法中的一種,以及 JQM 增強基本 web UI 元素的一些方法。最后,本教程將關注一個簡單的銷售驅動導向自動化的需求。

針對這個問題,本教程制定一個計劃來實現一個針對移動設備用戶的解決方案,無需進行本地移動開發。完成后的應用程序將被演示,這樣當您跟隨本教程逐步構建自己的應用程序時,就知道本教程將把您帶向何處。當您學習使用 JQM 實現這個解決方案時,我們將逐一檢查源文件中的函數。本教程最后將介紹幾個技巧,以幫助您的用戶在他們的移動設備上更輕松地訪問您的應用程序。

先決條件

要跟隨本教程,您需要以下組件:

◆文本編輯器 — 可以使用您喜歡的任何文本編輯器。支持語法高亮功能的編輯器更好用。Notepad++ 是一個很好用的開源編輯器。

◆JQuery Mobile 鏈接 — 實際上您無需下載任何內容。必要的文件通過 jQuery's Content Delivery Network (CDN) 提供。

◆Web 瀏覽器— 這個瀏覽器用于查看 jQuery Mobile 幫助和文檔。

◆WebKit (Safari) 或 Chrome Browser — 這些瀏覽器支持在桌面機上進行 jQuery Mobile 開發。

◆移動設備 — 可以使用 iPod Touch、Android、BlackBerry Torch 或具有類似功能的移動設備。

◆PHP 和 MySQL 托管環境 — 用于應用程序的服務器端。

我在一個 MacBook Pro 上創建本教程的代碼樣例,通過 VMWare Fusion 運行 Windows® 7。我使用 Notepad++ 編輯文件,因為它不僅擁有不錯的語法高亮顯示功能,還有安全的 FTP,可以使與基于服務器的 PHP 文件交互變得非常直觀。您也可以在 vi 中編輯文件,但誰想這樣做呢?為了使用 MySQL 數據庫,我使用我的主機帳戶可用的 phpMyAdmin。為了在一個物理設備上進行測試,我使用一個運行 Android 2.2 的 Nexus One 和一個運行 iOS 4.1 的 iPod Touch。

請參見 參考資料 獲取幫助鏈接;下載 樣例應用程序的源代碼。#p#

jQuery Mobile

我們首先檢查 JQM 以及如何使用它改進移動 web 應用程序開發體驗。盡管 jQuery Core 可以完全安裝使用,但 JQM 仍然處于嬰兒期,在本文撰寫之時還處于 alpha 階段。我們可以看一看 JQM 項目期望實現的目標。

JQM — 最新的 jQuery 家族成員

JQM 的目標是在一個統一的 UI 中交付超級 JavaScript 功能,跨最流行的智能手機和平板電腦設備工作。與 jQuery 一樣,JQM 是一個在 Internet 上直接托管、免費可用的開源代碼基礎。事實上,當 JQM 致力于統一和優化這個代碼基時,jQuery 核心庫受到了極大關注。這種關注充分說明,移動瀏覽器技術在極短的時間內取得了多么大的發展。

與 jQuery 核心庫一樣,您的開發計算機上不需要安裝任何東西;只需將各種 *.js 和 *.css 文件直接包含到您的 web 頁面中即可。這樣,JQM 的功能就好像被放到了您的指尖,供您隨時使用。

清單 1 展示了將 jQuery Mobile 文件添加到應用程序是多么簡單!

清單 1. 將 jQuery Mobile 添加到應用程序

  1. <head>  
  2. <title>IBM JQuery Tutorial</title>  
  3. <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a1  
  4. /jquery.mobile-1.0a1.min.css"   />  
  5. <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>     
  6. <script src="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.js">  
  7. </script>  
  8. <script src="http://jquery.ibm.navitend.com/utils.js"></script>  
  9. </head>  

清單 1 中的代碼實際上是本教程的樣例代碼中的一個潛在高峰(sneak peak),本教程稍后還將討論它。注意,現在一個樣式表已經直接從 jQuery 的 Content Delivery Network (CDN) 下載下來。CDN 用于分發跨 Internet 分發經常使用的文件,使得下載速度盡可能快。CDN 通常部署在一些大型基礎架構上,通過在 Internet 上的一些戰略位置放置文件,將這些文件需要傳輸的路徑減小到最小距離。jQuery CDN 和其他類似 CDN 通常托管在一些世界級大型基礎架構上,比如 amazon.com 和其他 Internet 巨頭提供的基礎架構。

除 CSS 文件外,這個頭部還包含三個 JavaScript 文件。第一個 JavaScript 文件對縮減 形式的 jQuery 核心庫的引用,然后是 JQM 庫的縮減形式,最后是一個特定于應用程序的 JavaScript 文件 utils.js??s減 意味著代碼針對快速下載和解析進行過優化。記住,每個應用程序頁面都需要下載這些文件,因此,應使它們的大小絕對最小(并依賴緩存!)來大幅提高應用程序性能。

清單 1 中的版本實際上是 jQuery Mobile alpha 發布 1。alpha 發布 2 已經可用,但由于存在一些 bug 行為,本教程依賴該代碼的第一個 alpha 發布。您閱讀本教程之時,這些 JQM 文件的一個更新版本可能已經可以下載。參見 參考資料 中 jQuery 的 CDN 鏈接,獲取這些庫文件的最新版本。JQM 受到 MIT 和 GPL 許可的雙重許可;基本上,這意味著如果您保持這個 jQuery 屬性,就能在您的應用程序中使用這些文件。

注意,也可以下載這些 jQuery 文件的一個副本并直接從您自己的 web 服務器托管它們。這種方法不是個壞主意,特別是當您正在發布一個依賴這個框架的商業應用程序時。這些框架可能會而且的確會發生更改,有時會損害依賴特定行為的應用程序。商業企業通常對可預測的行為更感興趣,因為這種行為更容易支持;而不是總是追趕時髦。

面向觸摸

JQM 是一個經過觸摸優化的框架,用于為基于瀏覽器的移動 web 應用程序構建統一和理想的用戶體驗。您所知道的關于編寫 web 應用程序的大部分知識仍然適用;但是,使應用程序看起來更統一這個目標是 JQM 方法的真正關鍵部分。JQM 采用一種特殊方式樣式化標準表單元素,使其在視覺上更美觀并更容易操作。請您仔細查看 圖 1 中的圖像,它們展示了 JQM 樣式化表單元素的一個子集。

標準 JQM 表單元素(單選按鈕、復選框、滑塊和其他選擇選項)的屏幕截圖

圖 1. JQM 表單元素

除便于觸摸和樣式化 UI 元素外,JQM 的真正魔力在于它管理屏幕過渡的方式。我們來看一看。#p#

應用程序架構

本節探索本教程的樣例應用程序的架構,逐步演示構建過程的每個主要步驟。您可以逐步跟隨本教程的操作,自己重建應用程序;或者,您也可以從 參考資料 下載完整的項目。

應用程序架構

這個應用程序 — 簡單地命名為 jQuery tutorial — 跨兩個主要平臺實現:

◆移動代碼,利用 JQM

◆服務器端代碼,在一個 MySQL 數據庫中提供數據持久性

所有服務器端交互通過一些 PHP 文件完成,數據在一個 MySQL 數據庫中的一個名為 opportunities 的表中進行管理。

數據庫結構非常簡單,只有 4 個字段(參見 表 2)。

列名 注釋
opp_id 一個條目的數值標識符,這個標識符通過數據庫自動遞增。
opp_person 潛在客戶的姓名或名稱。
opp_contact 潛在客戶的聯系信息。
opp_description 簡短的商機說明。

圖 5 展示了 phpMyAdmin 中的文件的結構。列標題包括 Field、Type、Collation、Attributes、Null、Default、Extra、Action。

數據庫表結構的屏幕截圖

圖 5. 數據庫表結構

您可以看到簡單的結構和數據庫類型。大部分條目是默認值。在一個生產應用程序中,您可能需要仔細考慮您的數據詞典。

要啟動應用程序,我使用 phpMyAdmin 的插入特性向數據庫插入一些數據。圖 6 顯示了與本教程中顯示的設備屏幕圖像相關的數據的屏幕快照。列標題包括 opp_id、opp_person、opp_contact、opp_description。(查看圖 6 的 大圖。)

一些初始數據記錄的屏幕截圖

圖 6. 一些初始數據記錄

測試應用程序時,跳轉到直接瀏覽下表是一個有用的健康檢查。表 3 顯示了應用程序使用的源文件清單。

表 3. 必要的應用程序源文件

文件 注釋
header.php 包括 HTML 文檔的頭部分,包含必要的腳本標記來包含 JQM 文件。這個文件的內容在前面的 清單 1中已顯示。
footer.php 包括任何 HTML 頁腳信息。對于許多應用程序而言,這個信息包含 Google Analytics JavaScript glue 以幫助收集關于應用程序的統計數據。
index.php 應用程序用戶界面的主頁,充當部件控制器、來自一個類 MVC 范式的部件視圖、或一個松散配置的 MVC 設計中的控制器的部件。
utils.php 這個文件用于放置所有數據訪問例程。
db.php 這個文件用于存儲數據庫憑證。
utils.js 這個文件用于存儲幾個表單級驗證腳本。
了解這些文件如何協同工作的最好方法是逐步檢查每個文件,這是我們下面將介紹的內容。

構建應用程序

大多數應用程序的關鍵是創建正確的數據模型。如上節所述,這個應用程序的數據模型非常直觀。在代碼詳解中,可以從 清單 5 中的數據庫定義開始。

清單 5. opportunities SQL 腳本

  1.  CREATE TABLE IF NOT EXISTS `opportunities` (  
  2.   `opp_id` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `opp_person` varchar(100) NOT NULL,  
  4.   `opp_contact` varchar(50) NOT NULL,  
  5.   `opp_description` varchar(500) NOT NULL,  
  6.   UNIQUE KEY `opp_id` (`opp_id`)  
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ;  

如果您想通過包含額外的字段來修改應用程序,可以通過兩種方法將它們添加到數據庫:一是通過 phpMyAdmin 這樣的工具手動添加,如前面的 圖 5 所示;二是通過擴展 SQL 腳本。數據庫表就緒后,下一步是連接到數據庫??梢酝ㄟ^一些 mysql 函數連接到數據庫,如 清單 6 中的 db.php 所示。

清單 6. db.php

  1. <?  
  2. $mysql_db = "databasename";  
  3. $mysql_user = "username";  
  4. $mysql_pass = "password";  
  5. $mysql_link = mysql_connect("localhost"$mysql_user$mysql_pass);  
  6. mysql_select_db($mysql_db$mysql_link);  
  7. ?>  

顯然,您需要使用您自己的環境的數據庫名、用戶名和密碼。如果您不能訪問支持 MySQL 和 PHP 的主機帳戶但想跟隨本教程操作,則現在是配置您的環境的好時機。參見 參考資料 了解一些可用選項。

數據庫就緒后,下一步是切換到一個自上而下的方法,這需要查看這個應用程序的主源文件 index.php,如 清單 7 所示。

清單 7. 主 UI 源文件

  1. <?  
  2. require('db.php');  
  3. require('utils.php');  
  4. require('header.php');  
  5. ?>  
  6.     <div  data-role="page">  
  7.     <div data-role="header">  
  8.     <h1>JQuery Tutorial</h1>  
  9.     </div>  
  10.     <div data-role="content">  
  11.   
  12. <?   
  13. $action = $_REQUEST['action'];  
  14. if ($action == 'addnew') {  
  15.    showOneOpp(-1);  
  16. } else if ($action == 'upsert') {  
  17.     if ($_REQUEST['id'] == '-1') {  
  18.         addOpp($_REQUEST['person'],$_REQUEST['contact'],$_REQUEST['description']);  
  19.     } else {  
  20.         updateOpp($_REQUEST['id'],$_REQUEST['person'],$_REQUEST['contact'],  
  21. $_REQUEST['description']);  
  22.     }  
  23.    showOpps();  
  24. } else if ($action == 'delete') {  
  25.     killOpp($_REQUEST['id']);  
  26.     showOpps();  
  27. } else if ($action == 'details') {  
  28.     showOneOpp($_REQUEST['id']);  
  29. } else {  
  30.     showOpps();  
  31. }  
  32. ?>  
  33.     </div>  
  34.     <div data-role="footer">  
  35.     Sample code for IBM developerWorks  
  36.     </div>  
  37.     </div>  
  38. <? require('footer.php'); ?>  
  39. </body>  
  40. </html>  

這個 PHP 文件是服務器上的所有交互的入口點。根據一個名為 action 的參數的存在性和值,腳本執行不同的功能。在深入具體操作之前,請注意這個文檔中的 jQuery Mobile 結構,該結構包含多個 div 元素,每個元素都帶有相應 data-role,用于頁面、頁眉、內容和頁腳。

這個應用程序架構相當簡單 — 頁面每次加載時,其內容都將被 content div 中新生成的內容替代。在某種程度上,這可能帶有欺騙性并返回一些舊的 web 應用程序習慣。也許是這樣,但本教程的目標是在一個有用的真實世界場景中演示 JQM 的一些基本功能,因此,保持這個簡單結構有助于實現所有目標。

要理解發生了什么事,我們從上到下仔細查看一下 index.php。

◆db.php 文件被包含進來 — 這個文件向您提供數據庫訪問權。

◆utils.php 文件被包含進來 — 這個文件提供所有特定于這個應用程序的數據管理功能。

◆header.php 文件被包含進來 — 這個文件包含 jQuery Core 和 jQuery Mobile JavaScript 文件、jQuery Mobile CSS 文件以及一個特定于應用程序的 JavaScript 文件:utils.js。

◆JQM div 元素被定義,頁眉包含一個 h1 標記和一個伴隨標題文本。

◆通過從 $_REQUEST 內置數組提取建立 $action 變量。$_REQUEST 變量 coalesces $_GET 和 $_POST 數據,簡化發送到這個頁面的各種請求的處理過程。

◆使用以下選項評估 $action 變量,每個選項都調用 utils.php 中的一個或多個函數:

◆addnew — 顯示一個空表單以添加一個新條目。當您正在參加商貿展或會見一位新的潛在客戶時,這個特性可能正是您需要的。

◆upsert — 如果記錄是新的,您可能想將它插入表中。如果記錄已經存在,您需要更新它的列。如果 id 字段的值等于-1,說明您有一條全新的記錄,必須執行插入操作。其他值代表一條有效記錄、商機或標識符。

◆delete — 用戶已請求刪除這條記錄。

◆details — 用戶已經選擇一個條目,想查看這個商機的細節。

◆如果 $action 變量為空,則表示只顯示一列商機。這是頁面首次加載時的默認行為。

◆頁面最后包含 footer.php。在這個應用程序中,頁腳包含一些 Google 分析代碼,以便跟蹤應用程序的使用情況。

理解這個頁面后,下一步是檢查 utils.php 中包含的功能。特別是,您需要查看 showOpps 函數,該函數為用戶界面生成一個商機列表,并引入一個新的 JQM 功能:listview,如 清單 8 所示。

清單 8. listviewshowOpps 生成一個 listview

  1. function showOpps()  
  2. {  
  3. global $mysql_link;  
  4.   
  5. $COL_OPPID0;  
  6. $COL_PERSON1;  
  7. $COL_CONTACT2;  
  8. $COL_DESCRIPTION3;  
  9. $sql ="select * from opportunities order by opp_id desc";  
  10. $result = mysql_query($sql,$mysql_link);  
  11.   
  12.   if(mysql_num_rows($result))  
  13.   {  
  14.     print("<a data-rel=\"dialog\" data-transition=\"pop\"   
  15. href=\"index.php?action=addnew\">Add New Opportunity</a>  
  16. <br  /><br  />");  
  17.     print("<ul data-role=\"listview\" data-filter=\"true\">");   
  18.     while($row = mysql_fetch_row($result)) {  
  19.         print("<li data-ibm-jquery-contact=\"".$row[$COL_CONTACT]."\">");  
  20.         print("<a data-rel=\"dialog\" data-transition=\"pop\"  
  21.  href=\"index.php?action=details&id=".$row[$COL_OPPID]."\">");  
  22.         print("Person:&nbsp;".$row[$COL_PERSON]."<br  />");  
  23.         print("Contact:&nbsp;".$row[$COL_CONTACT]."<br  />");  
  24.         print("Description:&nbsp;".$row[$COL_DESCRIPTION]);  
  25.         print("</a>");  
  26.   
  27.         print("</li>\n");  
  28.     }  
  29.     print("</ul>");  
  30.    }  
  31. }  

showOpps 函數跳到數據庫,取出所有行,首先顯示最新記錄,然后將數據組織到一個 listview 中。注意這個代碼清單中的 JQM 特性。

◆在獲取行之前,將為 Add New Opportunity 生成一個定位標記。這里包含了兩個特定于 JQM 的特性:

◆data-rel="dialog" 告知 JQM 新窗口出現時應該如何顯示。它獲取一個對話框的顏色方案。

◆data-transition="pop" 告知 JQM 對話框以彈出方式顯示。當對話框被清除時,它執行一個反向過渡,這時,對話框逐漸縮小直到消失。當您試驗這個應用程序時,嘗試將這個值更改為翻頁、淡出或其他可用過渡。

圖 7 顯示了添加新條目的對話框屏幕。這次,它在一個 iPod 上處于縱向顯示模式(portrait mode)。

Adding a new opportunity 對話框的屏幕截圖,其中包含 Person 字段、活動 Next 按鈕和 qwerty 鍵盤

圖 7. 添加一個新商機

◆當列表被創建時,它被創建為一個無序列表(或 ul 元素)。 這個元素的 data-role 是一個 listview。這是 JQM 的一個重要屬性,因為列表管理是一個重要主題。另外,要注意 data-filter="true" 屬性。這個簡單屬性提供整個應用程序中最有價值的功能(盡管有爭議) — 主屏幕上的先行(look-ahead)搜索,如 圖 8 所示。

過濾后的結果的屏幕截圖

圖 8. 過濾后的結果

當用戶輸入一個詞組時,將檢查列表中的每個條目,查看是否存在該詞組;如果不存在,將從列表中刪除該條目,只留下匹配的條目。在 圖 8 中,單詞 “Lego” 只存在于一個條目中。 一個有趣的邊注:圖 8 中的圖像來自我的 MacBook 上運行的 WebKit (Safari)。Safari 和 Chrome 都是測試以移動為目標的 web 應用程序的桌面瀏覽器的不錯選擇。

◆當用戶選擇鏈接中的一個條目時,他們實際上是使用一個 data-rel 值 dialog 和一個 data-transition 值 pop 激活一個定位。結果是 圖 9(同樣來自桌面機)中的一個對話框視圖中的一個特定條目的關聯細節。這個條目顯示 Person、Contact info 和 Comments 字段以及 Save Opportunity 按鈕。

一條商機記錄的細節的屏幕截圖

圖 9. 一條商機記錄的細節

注意,不管這個屏幕圖像來自那個設備,它都有相似的觀感。這個教程在 Android 設備、iPod 和 Safari(WebKit nightly build)上都能很好地運行。可以看出,jQuery Mobile 的一些設計目標取得了成果。

◆這個代碼清單中最后需要注意的項目是使用列表項列示的屬性。在本例中,每個列表項都包含一個名為 data-ibm-jquery-contact 的自定義屬性,該屬性的值來自數據庫中的 opp_contact 字段。這個項目存在的目的為了將來實現以下功能:添加當用戶在列表中的一個條目上執行 “敲擊并保持(taphold)” 操作時致電或發送電子郵件的能力。

當一條現有商機記錄在對話框中顯示(如 圖 9 所示)之后,用戶可以選擇幾個選項。這個頁面的代碼在 utils.php 中的 showOneOpp 函數中提供,如 清單 9 所示:

清單 9. showOneOpp

  1. function showOneOpp($id)  
  2. {  
  3. global $mysql_link;  
  4.   
  5.   
  6. $COL_OPPID0;  
  7. $COL_PERSON1;  
  8. $COL_CONTACT2;  
  9. $COL_DESCRIPTION3;  
  10.   
  11. $person = "";  
  12. $contact = "";  
  13. $description = "";  
  14.   
  15.     if ($id != -1) {  
  16.         $sql ="select * from opportunities where opp_id = " . $id;  
  17.         $result = mysql_query($sql,$mysql_link);  
  18.   
  19.         if(mysql_num_rows($result)) {  
  20.             $row = mysql_fetch_row($result);  
  21.             $person = $row[$COL_PERSON];  
  22.             $contact = $row[$COL_CONTACT];  
  23.             $description = $row[$COL_DESCRIPTION];  
  24.         }  
  25.         print("<a rel=\"external\" href=\"javascript:deleteEntry($id)  
  26. \">Delete this entry</a>");  
  27.     }  
  28.   
  29.     print("<form method=\"post\" rel=\"external\" action=\"index.php\"   
  30. onsubmit=\"return checkForm();\">");  
  31.     print("<input type=\"hidden\" name=\"action\" value=\"upsert\"  />");  
  32.     print("<input type=\"hidden\" name=\"id\" value=\"$id\"  />");  
  33.     print("<fieldset>");  
  34.   
  35.     print("<div data-role=\"fieldcontain\">");  
  36.     print("<label for=\"person\">Person</label>");  
  37.     print("<input type=\"text\" name=\"person\" maxlength=\"100\"   
  38. id=\"person\" value=\"$person\"   />");  
  39.     print("</div>");  
  40.   
  41.     print("<div data-role=\"fieldcontain\">");  
  42.     print("<label for=\"contact\">Contact info</label>");  
  43.     print("<input type=\"text\" name=\"contact\" maxlength=\"100\"   
  44. id=\"contact\" value=\"$contact\"   />");  
  45.     print("</div>");  
  46.   
  47.     print("<div data-role=\"fieldcontain\">");  
  48.     print("<label for=\"description\">Comments</label>");  
  49.     print("<input type=\"text\" name=\"description\" maxlength=\"100\"   
  50. id=\"description\" value=\"$description\"   />");  
  51.     print("</div>");  
  52.   
  53.     print("<fieldset>");  
  54.     print("<button type=\"submit\" value=\"Save\">Save Opportunity  
  55. </button>");  
  56.   
  57.     print("</form>\n");  
  58.   
  59. }  

這個 showOneOpp 代碼是填充您在其中編寫所有表單元素的屏幕的一種強力方法。這個屏幕上的一些需要注意的項目包括:

◆如果 $id 等于 -1,那么您將準備這個屏幕以添加一條新的商機記錄;否則,您將載入現有商機記錄并初始化一些頁級變量:$person、$contact 和 $description。

◆如果您擁有一條現有記錄,那么您將顯示一個鏈接,允許用于刪除該商機。

◆每個字段周圍的 data-role="fieldcontain" 幫助 JQM 顯示這些字段:將標簽和相關輸入 HTML 元素組合在一起,通過細線分隔。

◆當用戶填充這些字段并選擇 Save Opportunity 按鈕時,那些字段將受到檢查,以確保所有字段都已填充,如果已填充,則保存字段。圖 10 顯示了警告用戶填充所有字段的警報。

表單級驗證的屏幕截圖

圖 10. 表單級驗證

◆屏幕上的另一個選項是刪除一個現有條目。如果選擇該選項,另一個 JavaScript 函數將提示用戶確認是否的確要移除選中的商機記錄,如 圖 11 所示。

確認刪除一條商機記錄的屏幕截圖

圖 11. 確認刪除一條商機記錄

選擇刪除提示處的 OK 將使用一個動作 delete 將應用程序發送回 index.php。

這些表單級驗證的 JavaScript 例程包含在 utils.js 文件中,該文件由 header.php 包含文件加載。清單 10 顯示了 utils.js。

清單 10. Utils.js — 表單級驗證

  1. function checkForm() {  
  2.     try {  
  3.         if ($.trim($('#person').val()) == "" ||  
  4.             $.trim($('#contact').val()) == "" ||  
  5.             $.trim($('#description').val()) == "") {  
  6.                 alert("Please enter all fields");  
  7.                 return false;  
  8.             }  
  9.     } catch (e) {  
  10.         alert(e);  
  11.         return false;  
  12.     }  
  13.     return true;  
  14. }  
  15.   
  16. function deleteEntry(id) {  
  17.     try {  
  18.         var confirmString = "Delete this entry.  Are you sure?\n" + $.trim($('#person')  
  19. .val()) + "\n" + $.trim($('#contact').val()) + "\n" + $.trim($('#description').val());  
  20.         if (window.confirm(confirmString)) {  
  21.             window.location="index.php?action=delete&id=" + id;  
  22.         }  
  23.     } catch (e) {  
  24.         alert(e);  
  25.         return false;  
  26.     }  
  27.     return true;  
  28.   
  29. }  

這些函數是非常直觀的 JavaScript,通過一些 jQuery 選擇器輔助。

您已經看到了這個應用程序的大部分功能?,F在看看 utils.php 中實現的另外幾個函數,如 清單 11 所示。

清單 11. 更多數據管理例程

  1. function addOpp($person,$contact,$description)  
  2. {  
  3.     global $mysql_link;  
  4.   
  5.     $sql = "insert opportunities(opp_id,opp_person,opp_contact,opp_description) values   
  6. (NULL,'$person','$contact','$description')";  
  7.     $result = mysql_query($sql,$mysql_link);  
  8.     if ($result == 1) {  
  9.         return "SUCCESS";  
  10.     } else {  
  11.         return "FAILED";  
  12.     }  
  13.   
  14. }  
  15.   
  16. function updateOpp($id,$person,$contact,$description)  
  17. {  
  18. global $mysql_link;  
  19.   
  20. $sql = "update opportunities set opp_person='".$person."',opp_contact=   
  21. '".$contact."',opp_description='".$description."' where opp_id= ".$id;  
  22. $result = mysql_query($sql,$mysql_link);  
  23. if ($result == 1) {  
  24.     return "SUCCESS";       
  25. else {  
  26.     return "FAILED";  
  27. }  
  28.   
  29. }  
  30.   
  31.   
  32. function killOpp($id)  
  33. {  
  34. global $mysql_link;  
  35.   
  36. $sql = "delete from opportunities where opp_id =$id";  
  37.   
  38. $result = mysql_query($sql,$mysql_link);  
  39.   
  40. }  

可以看到,這些例程實現一些直觀的 PHP/MySQL 數據訪問功能:插入、更新和刪除商機記錄。

盡管使用 jQuery Mobile 構建的本教程樣例應用程序的代碼到此結束,但這應該被視為一個起點,而不是一個終點,因為還有更多 jQuery Mobile 知識等待您去探索。JQM 項目計劃在 2011 年初推出其 1.0 發布。隨著時間推移,希望它能集成到 PhoneGap 這樣的框架中,甚至可能集成到 Appcelerator 的 Titanium 這樣的替代開發環境中。

最后,本教程檢查這個新創建的、由 JQM 驅動的 web 應用程序的安裝快捷鍵。

安裝應用程序

這個應用程序不是原生應用程序,因此不能從傳統 App Store 下載,但是,您可以在您的設備的主屏幕上為它創建一個快捷鍵。圖 12展示如何在一個 iPod 設備上創建一個快捷鍵。

選擇您的屏幕底部的 + 號之后出現的菜單的屏幕截圖

圖 12. 選擇您的屏幕底部的加號(+)

iPod 平臺允許添加新書簽、向主屏幕添加鏈接、或將鏈接電郵給朋友。選擇 Add to Home Screen 選項。然后,命名鏈接,如 圖 13所示。

Add to Home Screen 選項的屏幕截圖

圖 13. 選擇 Add to Home Screen

您提供快捷鍵名稱后,快捷鍵將出現在您的主屏幕中,正好在您的 “最喜愛的游戲” 旁邊,如 圖 14 所示。

iPod 平臺的主屏幕上的快捷鍵的屏幕截圖

圖 14. iPod 平臺的主屏幕上的快捷鍵

在 Android 平臺上添加快捷鍵需要更多步驟,首先需要創建一個新書簽,如 圖 15 所示。

在 Android 平臺上創建一個新書簽的屏幕截圖

圖 15. 在 Android 平臺上創建一個新書簽

選中書簽,給它提供一個名稱,如 圖 16 所示。

可用書簽的屏幕截圖

圖 16. 可用書簽

現在您的書簽擁有了一個名稱,可供后續使用。

下一步是轉到主屏幕,按住屏幕上的一個空白區域。這時會出現一個選項,允許向主屏幕添加項目。選擇 Shortcuts 選項,如 圖 17所示。

添加一個快捷鍵的屏幕截圖

圖 17. 添加一個快捷鍵

然后,選擇 Bookmark 以查看現有書簽,如 圖 18 所示。

選擇查看現有書簽的屏幕截圖

圖 18. 選擇查看現有書簽

然后,您將看到一些可用書簽。選擇您新創建的 jQuery Mobile 應用程序對應的適當條目,如 圖 19 所示。

選擇您的 web 應用程序的屏幕截圖

圖 19. 選擇您的 web 應用程序

最后,您的快捷鍵現在應該出現在桌面上,如 圖 20 所示。

Android 主屏幕上的 jQuery Mobile 應用程序快捷鍵的屏幕截圖

圖 20. Android 主屏幕上的快捷鍵#p#

結束語

本教程到此結束。如果您跟隨本教程的操作,您應該已經了解 jQuery Mobile 的基本結構及其與 jQuery Core 項目的關系。您創建了一個銷售商機跟蹤應用程序,該程序擁有跨平臺兼容性,能在多種設備上運行。而且,您能將該應用程序安裝到您最喜歡的智能手機的主屏幕上。

責任編輯:佚名 來源: developerworks
相關推薦

2011-07-21 15:37:40

jQuery MobiJQMJSON

2011-01-28 09:12:53

jQuery Mobi

2012-05-14 17:35:28

移動Web

2010-06-13 09:22:37

jQuery

2011-06-30 09:46:59

jQuery MobiRails

2009-01-19 11:07:42

C#Web.NET

2010-07-22 08:54:14

jQuery

2012-06-15 11:32:19

ibmdw

2012-03-21 09:36:33

ibmdw

2011-09-05 13:45:25

jQuery MobiSencha Touc移動Web UI框架

2011-05-06 15:31:28

moblweb開發DSL

2009-09-03 17:36:13

C#創建Web應用程序

2015-03-20 10:31:10

移動Web

2010-07-28 19:24:10

2011-05-11 10:12:05

Mobl

2012-10-09 09:28:48

jQuery Mobi餐廳訂餐應用

2011-11-29 16:07:36

移動Web開發框架移動開發

2009-04-01 14:33:33

2009-07-09 16:47:26

Servlet的Web

2013-06-24 10:21:47

面向對象Web應用JavaScript
點贊
收藏

51CTO技術棧公眾號

久久久蜜桃精品| 久久久久美女| 在线国产亚洲欧美| 日韩影视精品| 国产丝袜在线视频| 黄色av成人| 亚洲一级黄色av| 999久久久精品视频| av人人综合网| 久久五月婷婷丁香社区| 国产日韩在线视频| 国产在线观看成人| 第一会所亚洲原创| 欧美刺激午夜性久久久久久久| 黄色国产一级视频| 8888四色奇米在线观看| 99久久精品免费| 国产日韩欧美自拍| 亚洲成熟少妇视频在线观看| 亚洲天天影视网| 亚洲精品中文字幕女同| 麻豆网站免费观看| 成人黄色视屏网站| 五月激情丁香一区二区三区| 激情五月五月婷婷| 国产私拍精品| 91蜜桃免费观看视频| 91香蕉电影院| 亚洲视频在线观看免费视频| 99精品热视频只有精品10| 久久色精品视频| 一级性生活大片| 动漫3d精品一区二区三区乱码| 欧美三级资源在线| 黑森林福利视频导航| 成年网站在线视频网站| 亚洲男人都懂的| 在线精品亚洲一区二区| 第三区美女视频在线| 99精品热视频| 国内视频一区| 人妻偷人精品一区二区三区| 国产在线精品免费av| 国产精品小说在线| 成人黄色激情视频| 国产一区二区高清| 55夜色66夜色国产精品视频| 国产在线观看99| 在线不卡视频| 国内精品小视频| 久久久久久久国产视频| 综合亚洲视频| 蜜臀久久99精品久久久无需会员| 顶级黑人搡bbw搡bbbb搡| 精品美女久久久| 国产一区二区美女视频| 国产成人无码精品久久二区三| 欧美大片网址| 日韩av最新在线观看| 亚洲精品乱码久久久久久不卡| jizz国产精品| 亚洲国产精品网站| 中文字幕乱码在线| 蜜桃精品噜噜噜成人av| 亚洲男人的天堂在线| 三上悠亚影音先锋| 欧美理论视频| 日韩中文字幕免费看| 一区二区三区四区五区| 欧美日本三区| 韩国三级电影久久久久久| 中文字幕在线字幕中文| 蜜桃久久av| 国产精品旅馆在线| 国产乱人乱偷精品视频| 国产丶欧美丶日本不卡视频| 国产精品我不卡| 青青色在线视频| 日本一区二区成人| 日本一道在线观看| 白浆视频在线观看| 在线观看国产一区二区| 岛国毛片在线播放| 一区三区自拍| 亚洲精品在线视频| 免费高清在线观看电视| 国产主播一区| 国产99久久精品一区二区永久免费 | 成人做爰视频www| 欧美一区二区三区性视频| 少妇极品熟妇人妻无码| 亚洲人和日本人hd| 久久久国产精品免费| 日韩 欧美 亚洲| 日韩国产欧美在线播放| 97免费高清电视剧观看| 天堂a中文在线| 综合久久久久综合| 国产午夜伦鲁鲁| www一区二区三区| 亚洲精品xxxx| 国产精品国产三级国产传播| 99综合精品| 91精品视频免费看| 三级理论午夜在线观看| 亚洲男女一区二区三区| 丝袜老师办公室里做好紧好爽| 最新亚洲国产| 亚洲欧美制服中文字幕| 麻豆视频在线观看| 男男成人高潮片免费网站| 国产日韩在线一区二区三区| 欧美极品另类| 色婷婷综合久久久久中文 | 视频免费一区二区| 蜜桃视频www网站在线观看| 国产精品麻豆久久久| www.好吊操| 四虎国产精品免费久久5151| 日韩精品在线私人| 黄色一级视频免费| 麻豆传媒一区二区三区| 蜜桃欧美视频| 成人影院在线播放| 9191国产精品| 日本精品久久久久中文| 99精品国产福利在线观看免费| 91欧美精品成人综合在线观看| 欧美黄色小说| 亚洲午夜免费电影| 亚洲综合20p| 国产精品x453.com| 国产精品国模在线| 免费在线毛片| 天天色综合成人网| 老熟女高潮一区二区三区| 婷婷丁香综合| 成人黄色免费在线观看| www亚洲人| 欧美综合久久久| 亚洲最大成人网站| 亚洲精品123区| 国产欧美一区二区三区不卡高清| 激情成人四房播| 在线电影一区二区三区| 青娱乐国产视频| 男女视频在线观看| 亚洲午夜在线| 99国精产品一二二线| 国产欧美久久久久久久久| 欧美日韩午夜影院| 在线观看免费黄色网址| 免费高清在线一区| 天堂社区 天堂综合网 天堂资源最新版 | 99r精品视频| 极品美女扒开粉嫩小泬| 好吊妞国产欧美日韩免费观看网站| 欧美成人免费观看| www.天天干.com| 一区二区国产盗摄色噜噜| 91丨porny丨九色| 国产在线日韩| 国内一区在线| 涩涩视频在线| 伊人亚洲福利一区二区三区| 伊人久久亚洲综合| 综合亚洲深深色噜噜狠狠网站| 玖玖爱视频在线| 亚洲精品97| 国产激情美女久久久久久吹潮| 国产丝袜在线播放| 日韩精品高清视频| 精品久久久久久久久久久久久久久久久久| 久久久精品国产免费观看同学| www.xxx亚洲| 国产精品成人a在线观看| 99中文视频在线| 一根才成人网| 自拍偷拍亚洲区| 精品人妻av一区二区三区| 亚洲高清在线精品| 国产精品扒开腿做爽爽| 久久超碰97中文字幕| 欧美日韩激情四射| 亚洲人成网www| 国产日韩精品在线观看| 9lporm自拍视频区在线| 亚洲情综合五月天| 国产欧美第一页| 狠狠综合久久av一区二区小说 | 国产精品嫩草影院8vv8| 国产综合精品| 色综合电影网| 北条麻妃在线一区二区免费播放 | 色噜噜久久综合伊人一本| h片在线免费看| 欧美午夜视频一区二区| 特一级黄色录像| 91片在线免费观看| 福利视频999| 免费视频久久| 污污污污污污www网站免费| 美腿丝袜亚洲图片| 成人亲热视频网站| 厕沟全景美女厕沟精品| 欧美久久精品午夜青青大伊人 | 99久久精品国产一区二区三区| 男人添女人下面免费视频| 在线观看日韩av电影| 亚洲春色综合另类校园电影| 日韩成人av在线资源| 91亚洲人电影| 成人国产一区| 青青a在线精品免费观看| 日韩精品亚洲人成在线观看| 国产一区二区三区欧美| 日韩在线观看视频网站| 欧美疯狂做受xxxx富婆| 精人妻无码一区二区三区| 亚洲国产精品久久人人爱蜜臀 | 国产视频精品久久| 日韩的一区二区| 亚洲av无码乱码国产麻豆| 欧美日韩一区二区三区四区| 亚洲天堂视频网站| 亚洲动漫第一页| 欧美成人精品欧美一级| 中文在线资源观看网站视频免费不卡 | 亚洲欧美资源在线| 人妻一区二区三区免费| 日韩一级片网站| 国产精品久久久久久免费免熟 | 欧美人与拘性视交免费看| www久久99| 日本一区二区三区电影免费观看| 国产精品香蕉国产| 成人看片网站| 国产福利视频一区二区| 一区二区电影免费观看| 51精品国产黑色丝袜高跟鞋 | 精品国产乱码久久久久久天美| 亚洲人与黑人屁股眼交| 国产精品欧美精品| 欧洲av一区二区三区| 久久久久久久国产精品影院| 艳妇乳肉豪妇荡乳xxx| 成人激情综合网站| 国产原创剧情av| www.亚洲免费av| 少妇精品一区二区| 99久久国产综合色|国产精品| 免费黄色三级网站| 亚洲免费成人av在线| 日本久久电影网| 久久夜靖品2区| 好吊成人免视频| 欧美一区二区三区四| 粉嫩av一区二区三区免费野| 国产无套在线观看| 五月婷婷激情综合| 粉嫩aⅴ一区二区三区| 欧美性感美女h网站在线观看免费| 亚洲视频免费播放| 欧美小视频在线观看| 日本熟妇一区二区三区| 欧美日韩国产美女| 国产精品探花视频| 欧美成人国产一区二区| 黄色一级大片在线免费看国产| 亚洲国产成人久久| 四虎精品在永久在线观看| 亚洲精品视频网上网址在线观看 | 91亚洲永久精品| b站大片免费直播| 国产精品久久久久桃色tv| 波多野结衣家庭教师| 亚洲一区二区欧美激情| 五月婷婷亚洲综合| 欧美日本免费一区二区三区| av网站免费大全| 亚洲精品久久久久国产| 超碰国产在线| 欧美激情高清视频| 欧美香蕉视频| 亚洲自拍偷拍在线| 亚洲裸色大胆大尺寸艺术写真| 亚洲一区二区不卡视频| 国产精品v日韩精品v欧美精品网站| 日韩国产中文字幕| 在线观看国产精品视频| 日韩精品一区二区三区中文不卡| 天堂在线视频网站| 上原亚衣av一区二区三区| 国产精品探花在线| 国产第一区电影| 国产成人一二片| 一区二区视频国产| 亚洲欧美激情诱惑| 日本一二三区在线| 久久久精品tv| 国产精品变态另类虐交| 欧美在线免费视屏| 天天色综合久久| 久久精品国产综合| 春暖花开亚洲一区二区三区| 99国产在线| 久久中文字幕av| 男人操女人免费软件| 国产剧情一区二区| 精品熟妇无码av免费久久| 亚洲国产va精品久久久不卡综合| 怡红院男人的天堂| 亚洲精品国产精品国自产在线| 黄色av网站在线播放| 青青草原一区二区| 成人另类视频| 自拍偷拍视频在线| 日本一不卡视频| 一区二区三区少妇| 亚洲一二三级电影| 国产手机av在线| 日韩在线视频免费观看高清中文| 多野结衣av一区| 91视频婷婷| 一区二区在线| 九一精品久久久| 欧美激情一区二区三区| 国产黄色片免费看| 欧美xxxxx牲另类人与| 日韩美女网站| 国产精品精品久久久| 校花撩起jk露出白色内裤国产精品| 青青草影院在线观看| 日韩精品电影在线| 男人天堂av电影| 粉嫩老牛aⅴ一区二区三区| 色wwwwww| 97涩涩爰在线观看亚洲| 中文字幕久久精品一区二区| 久久久久久久久久久久久国产| 理论电影国产精品| 快灬快灬一下爽蜜桃在线观看| 日韩欧美亚洲综合| 午夜影院在线视频| 2019中文字幕全在线观看| jizz性欧美2| 秋霞无码一区二区| 99久久国产综合精品色伊| 亚洲日本韩国在线| 日韩精品视频在线播放| 国产夫妻在线| 精品无码久久久久国产| 亚洲精品美女| 国产麻豆天美果冻无码视频| 欧美日韩国产页| 九色国产在线观看| 国产精品av在线| 清纯唯美日韩| 99精品视频国产| 亚洲自拍偷拍欧美| 神宫寺奈绪一区二区三区| 91成人福利在线| 精品产国自在拍| 在线观看免费av网址| 亚洲欧洲精品成人久久奇米网 | 欧美tk—视频vk| 麻豆mv在线看| 欧美日韩综合另类| 秋霞电影一区二区| 成年人午夜剧场| 亚洲成人中文字幕| 原纱央莉成人av片| 一本一道久久a久久综合精品| 国产精品一区2区| 天天综合网入口| 在线视频日本亚洲性| 精品中文在线| 91视频最新入口| 一区在线中文字幕| 国产黄a三级三级三级| 欧美亚洲另类激情另类| 日韩理论电影| 性猛交╳xxx乱大交| 色婷婷综合中文久久一本| 麻豆tv在线| 久久久综合亚洲91久久98| 男女男精品视频网| 一区二区三区视频免费看| 亚洲性无码av在线| ccyy激情综合| 亚洲视频第二页| 天天综合天天做天天综合| 亚洲s色大片| 精品福利影视| 麻豆精品一区二区av白丝在线| 九九九国产视频| 中文字幕在线亚洲| 妖精一区二区三区精品视频 | 免费观看亚洲天堂| 黑鬼大战白妞高潮喷白浆|