RELATEED CONSULTING
相關咨詢
選擇下列産品馬上(shàng)在線溝通(tōng)
服務時(shí)間(jiān):9:00-18:00
你(nǐ)可(kě)能遇到了下面的問題
關閉右側工具欄
PHP+MySQL+jQuery實現随意拖動層并即時(shí)保存拖動位置
  • 作(zuò)者:admin
  • 發表時(shí)間(jiān):2013-07-02 14:17:12
  • 來(lái)源:未知

想拖動頁面上(shàng)的層,完全可(kě)以用jQuery ui的Draggable方法來(lái)實現,那(nà)如何将拖動後層的位置保存下來(lái)呢?本文将給出答(dá)案。本文講解了如何采用PHP+MySQL+jQuery,實現随意拖動層并即時(shí)保存拖動位置。


之前我有(yǒu)文章:jQuery實現拖動布局并将排序結果保存到數(shù)據庫,文中以項目為(wèi)示例,講解了實現拖動布局的方法。本文與之不同之處在于可(kě)以任意拖動頁面位置,原理(lǐ)就是通(tōng)過拖動将拖動後層的相對位置left,top和(hé)z-index三個(gè)參數(shù)更新到數(shù)據表中對應的記錄,頁面通(tōng)過CSS解析每個(gè)層不同的位置。請(qǐng)看具體(tǐ)實現步驟。

準備MySQL數(shù)據表

首先需要準備一張表notes,用來(lái)記錄層的內(nèi)容,背景色和(hé)坐(zuò)标等信息。

CREATE TABLE IF NOT EXISTS `notes` (
  `id` int(11) NOT NULL auto_increment,
  `content` varchar(200) NOT NULL,
  `color` enum('yellow','blue','green') NOT NULL default 'yellow',
  `xyz` varchar(100) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

然後向表中插入幾條記錄,注意xyz字段表示的是層的xyz坐(zuò)标的組合,格式為(wèi)"x|y|z"。

drag.php

在drag.php中,需要讀取notes表中的記錄,顯示在drag.php頁面中,代碼如下:

include_once('connect.php'); //鏈接數(shù)據庫
$notes = '';  
$left='';  
$top='';  
$zindex='';  
$query = mysql_query("select * from notes order by id desc");
while($row=mysql_fetch_array($query)){
	list($left,$top,$zindex) = explode('|',$row['xyz']); 
	$notes.= '
'.$row['id'].'.'.htmlspecialchars($row['content']).'
'; }

然後将讀取出來(lái)的$notes現在在div中。

注意,我在生(shēng)成的每個(gè)DIV.note中定義了位置,即設置該div的left,top和(hé)z-index值。

CSS

.demo{position:relative; height:500px; margin:20px; border:1px dotted #d3d3d3}
.note{width:150px; height:150px; position:absolute; margin-top:150px; padding:10px;
 overflow:hidden; cursor:move; font-size:16px; line-height:22px;}
.note span{margin:2px}

.yellow{background-color:#FDFB8C;border:1px solid #DEDC65;}
.blue{background-color:#A6E3FC;border:1px solid #75C5E7;}
.green{background-color:#A5F88B;border:1px solid #98E775;}

有(yǒu)了樣式之後,然後運行(xíng)drag.php,這時(shí)就可(kě)以看到頁面中排列的的幾個(gè)層,但(dàn)是還(hái)不能拖動,因為(wèi)還(hái)要加入jQuery。

jQuery

首先需要載入jquery庫和(hé)jquery-ui插件以及global.js。


然後再global.js加入代碼:

$(function(){
	var tmp;
	
	$('.note').each(function(){
		tmp = $(this).css('z-index');
		if(tmp>zIndex) zIndex = tmp;
	})
	make_draggable($('.note'));
});
var zIndex = 0;

global.js中,首先在$(function()裏定義了一個(gè)變量tmp,通(tōng)過判斷每個(gè)div.note的z-index值,保證拖動時(shí),該DIV在最上(shàng)層(即z-index為(wèi)最大(dà)值),就是不會(huì)被别的層覆蓋。

并且設置zIndex的初始值為(wèi)0。

接下來(lái),寫了一個(gè)函數(shù)make_draggable();該函數(shù)調用jquery ui插件的Draggable方法,處理(lǐ)拖動範圍,透明(míng)度及拖動停止後執行(xíng)的更新操作(zuò)。

function make_draggable(elements){
	elements.draggable({
		opacity: 0.8,
		containment:'parent',
		start:function(e,ui){ ui.helper.css('z-index',++zIndex); },
		stop:function(e,ui){
			$.get('update_position.php',{
				  x		: ui.position.left,
				  y		: ui.position.top,
				  z		: zIndex,
				  id	: parseInt(ui.helper.find('span.data').html())
			});
		}
	});
}

當拖動時(shí),将當前層的z-index屬性設置為(wèi)最大(dà)值,即保證當前層在最上(shàng)面,不被其他層覆蓋,并且設置了拖動範圍和(hé)透明(míng)度,當停止拖動時(shí),向後台update_position.php發送一個(gè)ajax請(qǐng)求,傳遞的參數(shù)有(yǒu)x,y,z和(hé)id的值。接下來(lái)我們來(lái)看update_position.php的處理(lǐ)。

update_position.php保存拖動位置

update_position.php需要做(zuò)的是,獲取前台通(tōng)過ajax請(qǐng)求發來(lái)的數(shù)據,更新數(shù)據表中相應的字段內(nèi)容。

include_once('connect.php');
if(!is_numeric($_GET['id']) || !is_numeric($_GET['x']) || !is_numeric($_GET['y']) || 
!is_numeric($_GET['z']))
die("0");

$id = intval($_GET['id']);
$x = intval($_GET['x']);
$y = intval($_GET['y']);
$z = intval($_GET['z']);

mysql_query("UPDATE notes SET xyz='".$x."|".$y."|".$z."' WHERE id=".$id);

echo "1";

如此完成了拖動并實時(shí)保存的效果,請(qǐng)看DEMO演示。

看完本文後,你(nǐ)是不是會(huì)想到拖動保存更多(duō)實際的應用呢,本站(zhàn)在接下來(lái)的文章會(huì)通(tōng)過貼便簽的實例來(lái)說明(míng)拖動保存的應用,敬請(qǐng)關注。