日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何在ASP.NET網(wǎng)站中使用HTML 5拖放功能

拖放操作在桌面應(yīng)用程序中司空見慣?,F(xiàn)在的Web應(yīng)用程序也試圖利用拖放操作的簡易性和強(qiáng)大功能,提供改善的用戶體驗(yàn)。Web開發(fā)人員經(jīng)常借助基于JavaScript的庫或自定義方法,以便在自己的應(yīng)用程序中能夠?qū)崿F(xiàn)拖放操作。幸運(yùn)的是,HTML5本身內(nèi)置了支持拖放的功能。你使用拖放功能,可以拖動(dòng)某個(gè)HTML元素,將它拖放到另一個(gè)HTML元素中。在此過程中,還可以將數(shù)據(jù)從源元素傳送到目標(biāo)元素。如果把拖放操作與服務(wù)器端處理集成起來,你就可以提供豐富的用戶體驗(yàn)。本文介紹了如何在ASP.NET網(wǎng)站中使用HTML5的拖放功能。

為HTML元素啟用拖動(dòng)功能

要使用HTML5的拖放功能,第一步是讓一個(gè)或多個(gè)元素可以拖動(dòng)。為此,你只需要將HTML元素的可拖動(dòng)屬性設(shè)成true。比如說,下面這行標(biāo)記代碼將

元素設(shè)成了可拖動(dòng)元素:

 
 
 
 
  1. Some content
 

拖放事件

將一個(gè)或多個(gè)DOM元素標(biāo)為可拖動(dòng)元素只完成了一部分工作。想讓你的拖放操作實(shí)際可以使用,而且對最終用戶有視覺吸引力,就要處理某些事件。下面列出了這些事件:

事件描述
dragstart拖動(dòng)操作開始時(shí),該事件被觸發(fā)。
drag元素拖動(dòng)時(shí),該事件被觸發(fā)。
dragenter可拖動(dòng)元素被拖動(dòng),并輸入有效的拖放目標(biāo)后,該事件被觸發(fā)。
dragleave被拖放到有效拖放目標(biāo)的可拖動(dòng)元素離開拖放目標(biāo)后,該事件被觸發(fā)。
dragover可拖動(dòng)元素被拖放到有效拖放目標(biāo)上方后,該事件被觸發(fā)。
drop已拖動(dòng)元素被拖放到有效拖放目標(biāo)上面后,該事件被觸發(fā)。
dragend拖動(dòng)操作結(jié)束后,該事件被觸發(fā)。

你可以兩種方法將事件處理函數(shù)連接到這些事件,即在DOM元素標(biāo)記中,使用onxxxx語法,或者使用JavaScript(或基于JavaScript的庫,如jQuery)。下列標(biāo)記和代碼顯示了這兩種方法。

 
 
 
 
 
  • $("div").each(function () {  
  •   this.addEventListener('dragstart', OnDragStart, false);  
  •   this.addEventListener('drop', OnDrop, false);  
  • }); 
  • 要注意上述代碼如何使用jQuery代碼中的addEventListener()方法來連接事件處理函數(shù)。

    拖操作與放操作之間傳送數(shù)據(jù)

    大多數(shù)時(shí)候,拖動(dòng)某個(gè)元素,然后把它拖放到另外某個(gè)元素上也需要在源元素與目標(biāo)元素之間傳送一些數(shù)據(jù)。為了完成這項(xiàng)數(shù)據(jù)傳送任務(wù),HTML5提供了DataTransfer對象。下列表格列出了DataTransfer對象的一些重要屬性和方法。

    屬性/方法描述
    effectAllowed表明所允許操作的類型??赡艿闹凳牵簄one、copy、copyLink、
    copyMove、link、linkMove、move、all和uninitialized。
     
    dropEffect表明目前選擇的操作的類型。如果操作類型得不到effectAllowed
    屬性的支持,那么操作就失效??赡艿闹凳牵簄one、copy、link和move。
    setDragImage ()設(shè)置拖動(dòng)操作期間顯示的特定元素。
    setData()設(shè)置所傳送的特定數(shù)據(jù)。
    getData()檢索之前設(shè)置的數(shù)據(jù),以便進(jìn)一步處理。
    clearData()清除之前存儲的數(shù)據(jù)。

    你通常會(huì)在dragstart和drop事件處理函數(shù)中使用dataTransfer對象的屬性和方法。

    執(zhí)行拖放操作

    現(xiàn)在不妨把你到目前為止獲得的信息放入到一個(gè)簡單而實(shí)用的應(yīng)用程序中。先建立一個(gè)新的ASP.NET網(wǎng)站。你將創(chuàng)建一個(gè)酷似下圖的簡單的Web表單:

    #p#

    簡單的Web表單

    注意:該實(shí)例在最新版的Firefox上經(jīng)過了測試,但是應(yīng)該也可以在最新版的其他主要瀏覽器上運(yùn)行。正如你所見,Web表單表示一輛簡單的購物手推車。各產(chǎn)品由放在DataList控件里面的DIV元素來表示。這些產(chǎn)品可以拖放到購物袋上。一旦所有需要的產(chǎn)品添加完畢,你可以點(diǎn)擊“Place Order”按鈕,即可將產(chǎn)品數(shù)據(jù)發(fā)送到服務(wù)器、下訂單。上面這個(gè)例子使用了如下所示的Entity Framework數(shù)據(jù)模型。你可以從本文所附的代碼下載鏈接(http://developer.com/imagesvr_ce/6920/drag_drop_Code.zip)獲得SQL Server Express數(shù)據(jù)庫和數(shù)據(jù)模型。

    該例子使用了Entity Framework數(shù)據(jù)模型。

    上面所示的數(shù)據(jù)模型只包括基本的細(xì)節(jié)。在實(shí)際環(huán)境下的購物手推車系統(tǒng)中,你可以捕捉到多得多的細(xì)節(jié)。產(chǎn)品目錄是一個(gè)DataList控件,它的ItemTemplate包括一個(gè)可拖動(dòng)

    元素。該DIV包裝了某個(gè)產(chǎn)品的所有產(chǎn)品細(xì)節(jié)。

     
     
     
     
    1.  
    2.      
    3.          
    4.             
      <%# Eval("Name") %>
       
    5.             
      ' />
       
    6.             
      <%# Eval("Description") %>
       
    7.              
    8.             
      <%# Eval("Cost","Cost : ${0}") %>
       
    9.         
     
  •      
  •  
  •  
  •      
  •      
  •      
  •      
  •      
  •  

    請注意表示產(chǎn)品的DIV元素如何被標(biāo)以設(shè)成true的可拖動(dòng)屬性。負(fù)責(zé)處理產(chǎn)品外觀和感覺的product CSS類如下所示:

     
     
     
     
    1. .product  
    2. {  
    3.     height: 300px;  
    4.     width: 150px;  
    5.     float: left;  
    6.     border: 2px solid #666666;  
    7.     background-color: white;  
    8.     padding:3px;  
    9.     margin:5px;  
    10.     text-align: center;  
    11.     cursor: move;  

    購物手推車還是帶CSS類bag的DIV元素。

     
     
     
     
    1. .bag  
    2. {  
    3.     padding:10px;  
    4.     text-align: center;  
    5.     cursor: move;  

    下一步是將拖放事件處理函數(shù)連接到各個(gè)元素。將使用jQuery來完成這一步,所以確保在部分中引用了jQuery庫。

     
     
     
     
    1.  

    連接各個(gè)事件處理函數(shù)的jQuery代碼會(huì)在ready()事件處理函數(shù)中編寫,如下所示:

     
     
     
     
    1. $(document).ready(function () {  
    2.     $("div .product").each(function () {  
    3.         this.addEventListener('dragstart', OnDragStart, false);  
    4.     });  
    5.    
    6.     $("div .bag").each(function () {  
    7.         this.addEventListener('dragenter', OnDragEnter, false);  
    8.         this.addEventListener('dragleave', OnDragLeave, false);  
    9.         this.addEventListener('dragover', OnDragOver, false);  
    10.         this.addEventListener('drop', OnDrop, false);  
    11.         this.addEventListener('dragend', OnDragEnd, false);  
    12.     });  
    13. }) 

    正如你所見,第一個(gè)each()調(diào)用為dragstart事件添加了事件偵聽函數(shù)。所有的產(chǎn)品DIV元素應(yīng)該會(huì)處理該事件,那樣代碼就會(huì)根據(jù)CSS類product來過濾元素。同樣,購物手推車元素應(yīng)該會(huì)處理其他事件,尤其是drop事件。

    下列標(biāo)記代碼顯示了完整的事件處理函數(shù):OnDragStart、OnDragEnter、OnDragLeave、OnDragOver、OnDrop和OnDragEnd。

     
     
     
     
    1. function OnDragStart(e) {  
    2.     this.style.opacity = '0.3';  
    3.     srcElement = this;  
    4.     e.dataTransfer.effectAllowed = 'move';  
    5.     e.dataTransfer.setData('text/html', $(this).find("header")[0].innerHTML);  
    6. }  
    7.    
    8. function OnDragOver(e) {  
    9.     if (e.preventDefault) {  
    10.         e.preventDefault();  
    11.     }  
    12.     $(this).addClass('highlight');  
    13.     e.dataTransfer.dropEffect = 'move';  
    14.     return false;  
    15. }  
    16.    
    17. function OnDragEnter(e) {  
    18.     $(this).addClass('highlight');  
    19. }  
    20.    
    21. function OnDragLeave(e) {  
    22.     $(this).removeClass('highlight');  
    23. }  
    24.    
    25. function OnDrop(e) {  
    26.     if (e.stopPropagation) {  
    27.         e.stopPropagation();  
    28.     }  
    29.     srcElement.style.opacity = '1';  
    30.     $(this).removeClass('highlight');  
    31.     var count = $(this).find("div[data-product-name='" + e.dataTransfer.getData('text/html') + "']").length;  
    32.     if (count <= 0) {  
    33.         $(this).append("" + e.dataTransfer.getData('text/html') + "
    ");  
  •     }  
  •     else {  
  •         alert("This product is already added to your cart!");  
  •     }  
  •     return false;  
  • }  
  •    
  • function OnDragEnd(e) {  
  •     $("div .bag").removeClass('highlight');  
  •     this.style.opacity = '1';  
  • }     
  • 讓我們逐個(gè)詳細(xì)介紹上面顯示的每個(gè)事件處理函數(shù)。

    OnDragStart

     
     
     
     
    1. function OnDragStart(e) {  
    2.     this.style.opacity = '0.3';  
    3.     srcElement = this;  
    4.     e.dataTransfer.effectAllowed = 'move';  
    5.     e.dataTransfer.setData('text/html', $(this).find("header")[0].innerHTML);  

    dragstart事件處理函數(shù)減少了被拖動(dòng)元素的不透明度,那樣最終用戶就能獲得關(guān)于拖動(dòng)操作的視覺線索。拖動(dòng)操作的來源存儲在全局變量srcElement中,因?yàn)槲覀円院笤赿rop事件處理函數(shù)中需要它。dataTransfer對象的effectAllowed屬性被設(shè)成了move。此外,setData()方法將數(shù)據(jù)設(shè)成了傳送到dataTransfer對象中header元素(即產(chǎn)品名稱)的innerHTML。這樣一來,drop事件處理函數(shù)就知道哪個(gè)產(chǎn)品添加到購物手推車中。setData()方法的第一個(gè)參數(shù)表明了所傳送數(shù)據(jù)的類型(這里是“text/html”)。

    OnDragOver

     
     
     
     
    1. function OnDragOver(e) {  
    2.     ...  
    3.     $(this).addClass('highlight');  
    4.     e.dataTransfer.dropEffect = 'move';  
    5.     return false;  

    dragover事件處理函數(shù)將CSS類添加到拖放目標(biāo),以便為最終用戶提供關(guān)于這一操作的視覺線索。higlight CSS類如下所示:

     
     
     
     
    1. .highlight  
    2. {  
    3.     background-color:Yellow;  

    OnDragOver函數(shù)也將dataTransfer對象的dropEffect設(shè)成move。

    OnDragEnter和OnDragLeave

     
     
     
     
    1. function OnDragEnter(e) {  
    2.     $(this).addClass('highlight');  
    3. }  
    4.    
    5. function OnDragLeave(e) {  
    6.     $(this).removeClass('highlight');  

    dragenter和dragleave事件處理函數(shù)很簡單,只是將highlight CSS類添加到目標(biāo)元素,或者從目標(biāo)元素中清除這個(gè)類。

    OnDrop

     
     
     
     
    1. function OnDrop(e) {  
    2.     ...  
    3.     srcElement.style.opacity = '1';  
    4.     $(this).removeClass('highlight');  
    5.     var count = $(this).find("div[data-product-name='" +   
    6.                 e.dataTransfer.getData('text/html') + "']").length;  
    7.     if (count <= 0) {  
    8.         $(this).append("
    9.         e.dataTransfer.getData('text/html') + "'>" +   
    10.         e.dataTransfer.getData('text/html') + "
    ");  
  •     }  
  •     else {  
  •         alert("This product is already added to your cart!");  
  •     }  
  •     return false;  
  • drop事件處理函數(shù)將源元素的不透明度設(shè)回成了1,因?yàn)橥戏挪僮饕淹瓿?。它還清除了目標(biāo)元素中的highlight CSS類。然后,它將被拖動(dòng)的產(chǎn)品添加到目標(biāo)元素后面。注意使用getData()方法,檢索之前在dragstart事件處理函數(shù)中設(shè)置的數(shù)據(jù)。還要進(jìn)行檢查,確保同一產(chǎn)品不能添加多次。

    OnDragEnd

     
     
     
     
    1. function OnDragEnd(e) {  
    2.     $("div .bag").removeClass('highlight');  
    3.     this.style.opacity = '1';  

    dragend事件處理函數(shù)只是清除拖放目標(biāo)中的highlight CSS類。

    #p#

    將數(shù)據(jù)從客戶端傳送到服務(wù)器

    要將購物手推車中的產(chǎn)品實(shí)際傳送到服務(wù)器端代碼,你就要使用jQuery的$.ajax()方法?!癙lace Order”的click事件處理函數(shù)擁有相關(guān)編碼,如下所示:

     
     
     
     
    1. $("#Button1").click(function () {  
    2.     var data = new Array();  
    3.     $("div .bag div").each(function (index) {  
    4.         data[index] = "'" + this.innerHTML + "'";  
    5.     });  
    6.     $.ajax({  
    7.         type: 'POST',  
    8.         url: 'shoppingcart.aspx/PlaceOrder',  
    9.         contentType: "application/json; charset=utf-8",  
    10.         data: '{ products:[' + data.join() + ']}',  
    11.         dataType: 'json',  
    12.         success: function (results) { alert(results.d); },  
    13.         error: function () { alert('error'); }  
    14.     });  
    15. }); 

    正如你所見,$.ajax()調(diào)用駐留在ShoppingCart.aspx Web表單里面的Web方法PlaceOrder。PlaceOrder Web方法如下所示。

    [WebMethod]

     
     
     
     
    1. public static string PlaceOrder(string[] products)  
    2. {  
    3.     Guid orderId = Guid.NewGuid();  
    4.     DatabaseEntities db = new DatabaseEntities();  
    5.     foreach (string p in products)  
    6.     {  
    7.         Order order = new Order();  
    8.         order.OrderId = orderId;  
    9.         order.ProductName = p;  
    10.         order.Qty = 1;  
    11.         db.Orders.AddObject(order);  
    12.     }  
    13.     db.SaveChanges();  
    14.     return "Order with " + products.Length.ToString() + " products has been added!";  

    PlaceOrder Web方法只是把訂單細(xì)節(jié)放入到Orders表格中。PlaceOrder() Web方法接受一組表示產(chǎn)品名稱的字符串。要注意$.ajax()如何傳送采用JSON格式的產(chǎn)品參數(shù)。Web方法一旦成功完成,success處理函數(shù)就會(huì)向最終用戶顯示提醒信息?,F(xiàn)在運(yùn)行Web表單,將一個(gè)或多個(gè)產(chǎn)品拖放到購物手推車上,然后點(diǎn)擊“Place Order”按鈕,就可以將產(chǎn)品名稱從購物手推車傳送到服務(wù)器。

    結(jié)束語

    HTML5提供了能夠在網(wǎng)頁中實(shí)現(xiàn)拖放功能的一種原生方式。使用這些功能,你就可以改善最終用戶體驗(yàn),讓你的網(wǎng)站更具交互性、更容易使用。DOM元素的可拖動(dòng)屬性管理著某個(gè)元素可不可以拖動(dòng)。dragstart、dragenter、dragleave、 dragover、drop和dragend這些事件讓你可以控制整個(gè)拖放操作。dataTransfer對象讓你可以在拖動(dòng)來源和拖放目標(biāo)之間傳送數(shù)據(jù)。dataTransfer對象的setData()和getData()方法其任務(wù)分別是設(shè)置所傳送的數(shù)據(jù)和檢索已傳送的數(shù)據(jù)。

    原文:http://www.developer.com/lang/using-html5-drag-and-drop-in-asp.net.html

    【編輯推薦】

    1. 基于引擎開發(fā)HTML 5游戲?qū)崙?zhàn)
    2. 8個(gè)非常有用的HTML 5工具你值得擁有
    3. HTML 5開發(fā):地理位置定位指南
    4. 一句代碼實(shí)現(xiàn)HTML 5淘寶語音搜索
    5. 使用HTML 5和CSS3制作登錄頁面完整步驟

    當(dāng)前文章:如何在ASP.NET網(wǎng)站中使用HTML 5拖放功能
    網(wǎng)站路徑:http://www.5511xx.com/article/cojdgii.html