精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

神马久久精品综合| 国产一区二区在线观看免费视频| 天堂资源中文在线| 日韩黄色片在线观看| 91免费国产精品| 99久久夜色精品国产亚洲| 合欧美一区二区三区| 日韩成人中文电影| 校园春色 亚洲色图| 污污在线观看| 欧美国产在线观看| 国产欧美一区二区在线播放| 中文字幕一区二区人妻视频| 亚洲精品网址| 亚洲日韩欧美视频一区| 欧美xxxx黑人| www.26天天久久天堂| 亚洲午夜视频在线| 亚洲欧洲一二三| 天堂av中文字幕| 精品一区二区三区的国产在线播放| 国内精品久久久久伊人av| 日本免费网站视频| 在线观看欧美理论a影院| 91麻豆精品国产| 一区二区三区免费播放| gogo久久| 一区二区三区成人| 一区二区三区的久久的视频| 视频三区在线观看| 国产91精品精华液一区二区三区 | 国产jjizz一区二区三区视频| 欧美a级大片在线| 欧美日韩久久久一区| 91av资源网| 丁香花电影在线观看完整版| 中文字幕字幕中文在线中不卡视频| 美乳视频一区二区| 日本精品999| 丰满亚洲少妇av| 999视频在线观看| 中文天堂在线播放| 丝袜诱惑制服诱惑色一区在线观看 | 91av手机在线| 精品九九在线| 国产亚洲视频中文字幕视频| 日韩中文字幕电影| 日韩高清影视在线观看| 精品久久久久久综合日本欧美| www.五月天色| 国产精品毛片aⅴ一区二区三区| 欧美网站一区二区| 久久精品免费网站| 国产v综合v| 在线免费观看一区| 日本熟妇人妻中出| 成人不卡视频| 欧美日韩在线一区二区| 久久人人爽av| 国产精品免费精品自在线观看| 欧美美女直播网站| 一区二区久久精品| 欧美影院精品| 亚洲爱爱爱爱爱| 亚洲调教欧美在线| 亚洲黄页网站| 正在播放欧美一区| 国产日产精品一区二区三区的介绍| 成人羞羞网站入口免费| 日韩在线观看免费网站| 久草福利资源在线| 午夜天堂精品久久久久| 久久久免费精品视频| 精品国产乱码一区二区| 久久一区亚洲| 国产又爽又黄的激情精品视频 | 中文字幕日韩一区二区三区不卡| 日本在线看片免费人成视1000| 亚洲欧洲一区二区在线播放| 日本xxxxx18| 高清毛片在线观看| 色婷婷久久久亚洲一区二区三区| 天天干天天操天天做| 视频二区欧美毛片免费观看| 亚洲精品一区二区在线观看| 亚洲a v网站| 国产精品黑丝在线播放 | 中文日产幕无线码一区二区| 欧美熟乱第一页| 中文字幕一二三区| 亚洲免费福利一区| www.精品av.com| 欧美三日本三级少妇99| 免费在线观看日韩欧美| 成人在线观看网址| 国产精品免费播放| 亚洲黄色免费电影| 久久久久久久片| 日韩中文字幕| 一本色道久久综合狠狠躁篇怎么玩| 美女视频久久久| 亚洲作爱视频| 亚洲精品日韩av| 九色在线观看视频| 樱花草国产18久久久久| av丝袜天堂网| 老牛精品亚洲成av人片| 久久精品美女视频网站| 综合激情网五月| 国产福利91精品一区二区三区| 久久亚洲高清| 日本性爱视频在线观看| 欧洲一区在线观看| 性欧美丰满熟妇xxxx性久久久| 日韩精品久久久久久久电影99爱| 97婷婷涩涩精品一区| 国产女人18毛片水真多| 国产午夜精品一区二区三区视频| 福利在线一区二区| 91成人精品观看| 国产一区二区三区视频| 日韩少妇裸体做爰视频| 国产精品综合视频| 亚洲成人蜜桃| 三上悠亚激情av一区二区三区| 精品国产伦一区二区三区观看方式| 一二三四在线观看视频| 久久三级视频| 久久精品综合一区| 国产后进白嫩翘臀在线观看视频| 欧美一区二区视频在线观看2020 | 无码人妻丰满熟妇区毛片蜜桃精品| 国产一区二区三区电影在线观看| 国模视频一区二区三区| 国产jzjzjz丝袜老师水多| 日本一区二区免费在线| 欧美 日韩精品| 西野翔中文久久精品字幕| 久久99精品久久久久久青青91| 国产精品毛片一区视频播| 欧美激情综合五月色丁香| 国产成人精品无码播放| 亚洲素人在线| 日本精品视频在线播放| 色av男人的天堂免费在线| 欧美日韩精品在线视频| 国产真实乱人偷精品| 亚洲狼人精品一区二区三区| 国产不卡一区二区在线观看| 毛片在线导航| 精品成人佐山爱一区二区| 国产精品18p| av男人天堂一区| 欧美 丝袜 自拍 制服 另类| 欧美激情久久久久久久久久久| 久久人人爽人人爽人人片av高清| 成人午夜精品福利免费| 午夜av一区二区| v8888av| 日韩vs国产vs欧美| 色吧亚洲视频| 不卡的国产精品| 欧美成人精品一区二区| 亚洲精品久久久蜜桃动漫| 亚洲观看高清完整版在线观看| 无码国产69精品久久久久网站| 99国产精品视频免费观看一公开| 精品一区二区日本| 欧美日韩五码| 久久精品国产一区| 黄色三级网站在线观看| 一本一道波多野结衣一区二区| 久久久久久成人网| 国产传媒一区在线| 欧美 日韩 国产在线观看| 欧美日韩有码| 亚洲综合中文字幕在线观看| 第四色日韩影片| 国产视频精品在线| 在线播放成人av| 一个色综合网站| 亚洲第一香蕉网| 久久99精品国产麻豆婷婷洗澡| 黄色成人在线免费观看| 国产精品一线天粉嫩av| 成人网址在线观看| 蜜桃视频m3u8在线观看| 伊人亚洲福利一区二区三区| 国产三级在线观看视频| 欧美日韩国产丝袜另类| 国产真人真事毛片视频| 高清在线观看日韩| 日本中文字幕高清| 国产精品地址| 视频一区视频二区视频三区高| 久久av网站| 国产精品99久久久久久久久久久久| 成人短视频在线观看| 亚洲人成网站色ww在线| av一级黄色片| 日本丶国产丶欧美色综合| 五月婷婷一区二区| 国产色婷婷亚洲99精品小说| 女同性αv亚洲女同志| 久久一区中文字幕| 国产二区视频在线| 国产韩日影视精品| 欧美裸体网站| 99精品国产一区二区三区2021| 国产精品免费一区豆花| 岛国毛片av在线| 久久久999国产| 国产视频精选在线| 亚洲国产成人久久| 99久久精品免费看国产交换| 一本一本久久a久久精品综合麻豆| 欧美日韩精品在线观看视频 | 天天干中文字幕| 国产欧美一区二区精品久导航| 亚洲精品久久一区二区三区777 | 9色在线观看| 日韩精品免费在线视频| 性做久久久久久久| 69堂成人精品免费视频| www.久久网| 一本到三区不卡视频| 日韩黄色三级视频| 一区二区免费视频| 欧美日韩人妻精品一区二区三区 | 亚洲欧美综合精品久久成人| 高清毛片aaaaaaaaa片| 欧美一区二区三区精品| ,亚洲人成毛片在线播放| 欧美无砖专区一中文字| 无码人妻熟妇av又粗又大| 欧美视频在线观看 亚洲欧| 国产精品不卡av| 一区二区久久久| 欧美成人片在线观看| 亚洲欧美精品午睡沙发| 糖心vlog免费在线观看 | 一区在线电影| 日韩激情图片| 中文字幕av导航| 91精品99| 国产欧美自拍视频| 亚洲综合小说| 黄色录像特级片| 欧美午夜电影在线观看 | 精品99一区二区三区| www.色播.com| 亚洲精品一区二区三区影院| 色窝窝无码一区二区三区| 亚洲国产古装精品网站| 天天爱天天干天天操| 精品性高朝久久久久久久| 欧美精品少妇| 中文字幕在线精品| 免费不卡视频| 欧美国产极速在线| av最新在线| 热门国产精品亚洲第一区在线| 欧洲av不卡| 国产玖玖精品视频| 欧美电影在线观看一区| 电影午夜精品一区二区三区| 麻豆精品少妇| 日韩欧美亚洲在线| 亚洲精品一区二区在线看| 韩国无码av片在线观看网站| 亚洲激情婷婷| 国产福利影院在线观看| 精品伊人久久久久7777人| 少妇极品熟妇人妻无码| 久久综合av免费| 国精产品视频一二二区| 亚洲男同1069视频| 99精品视频99| 欧美日韩午夜精品| 粉嫩小泬无遮挡久久久久久| 亚洲欧美中文日韩在线v日本| 看女生喷水的网站在线观看| 欧美激情国产日韩精品一区18| 在线观看欧美日韩电影| 国产狼人综合免费视频| 给我免费播放日韩视频| 日韩av高清在线播放| 午夜精品偷拍| 亚洲综合在线网站| 国产91综合网| 天堂网av2018| 亚洲福利一区二区三区| 中文字幕777| 亚洲国产成人久久综合| 老司机在线永久免费观看| 午夜精品福利电影| 一区在线不卡| 欧美极品一区| 极品日韩av| 美女黄色片视频| 不卡电影一区二区三区| 亚洲一二三四视频| 精品久久久久久久久中文字幕 | 欧美日韩中文视频| 欧美剧情电影在线观看完整版免费励志电影 | 成人av免费电影网站| 91精品久久久久久蜜桃| 精品国内自产拍在线观看视频 | 日韩电影免费观看中文字幕 | 欧美在线色图| 成人黄色av片| 国产精品亚洲视频| 美国黄色特级片| 色综合网站在线| 亚洲av无码一区二区三区性色| 在线亚洲午夜片av大片| 成人影院av| 国产精品播放| 中出一区二区| 中文字幕在线观看日| 国产欧美精品在线观看| 日本一级黄色录像| 日韩精品在线一区二区| 美女免费久久| 国产欧美精品一区二区| 国产欧美日韩免费观看| 亚洲熟妇无码一区二区三区| 国产河南妇女毛片精品久久久| 日本视频在线免费| 欧美性一二三区| 高清美女视频一区| 日韩美女免费观看| 色天天色综合| 国产男女无遮挡| 2023国产精品自拍| 在线观看国产亚洲| 日韩高清有码在线| 激情黄产视频在线免费观看| 黑人巨大精品欧美一区二区小视频| 欧美日韩综合| xxxx视频在线观看| 亚洲国产三级在线| 亚洲精品国产片| 欧美精品久久一区二区 | 精品播放一区二区| 国产精品论坛| 欧美12av| 免费在线看成人av| 99成人在线观看| 欧美一级在线免费| 丝袜中文在线| 精品日韩欧美| 久久久久国产精品午夜一区| 国产毛片久久久久久久| 欧美性生活久久| 欧美激情二区| 99re在线观看视频| 在线免费高清一区二区三区| 色呦呦一区二区| 色婷婷激情综合| 一级日本在线| 波多野结衣精品久久| 99精品久久| 日本一区二区视频在线播放| 欧美日韩第一区日日骚| 黄色国产网站在线播放| 国产二区不卡| 久久精品卡一| 欧美另类videoxo高潮| 精品sm捆绑视频| av在线日韩| xxxxxx在线观看| 99re6这里只有精品视频在线观看| 潘金莲一级淫片aaaaaa播放| 日韩一级黄色av| 国内精品麻豆美女在线播放视频 | 社区色欧美激情 | 日韩精品三级| 看av免费毛片手机播放| 国产精品欧美综合在线| www.狠狠干| 日韩美女主播视频| 91精品一区二区三区综合在线爱| 国产亚洲精品成人a| 色噜噜久久综合| www视频在线免费观看 | 99久久夜色精品国产亚洲96 | 久久精品在线免费观看| 国产精品久久久久久在线| 91精品国产91久久| 天天天综合网| 欧洲女同同性吃奶| 91精品欧美综合在线观看最新| 欧美久久天堂| 日本三日本三级少妇三级66| www成人在线观看| 精品人妻一区二区三区含羞草 | 亚洲日本va| 国产又粗又长又大的视频| 亚洲国产cao|