1一152期六合图库资料

Flyingis

Talking and thinking freely !
Flying in the world of GIS !
隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
數據加載中……

[翻譯] 如何在 JavaScript 中實現拖放(下)

??? 譯者: Flyingis

??? 終于完成了全文的翻譯,由于時間比較參促,文章沒有過多的校正與潤色,閱讀過程中難免會有些許生硬或不準確的感覺,請大家見量并指出,方便他人閱讀。

??? 原文作者將拖放功能的實現分步講解,其核心的地方在于移動和放置元素時,鼠標、移動元素、目標元素關系的處理,只要這個問題處理好了,代碼就很容易理解,譯文僅供輔助參考之用。

??? 整合所有的功能

??? 最后我們使用所有代碼片斷,來創建一個完整的拖放函數腳本。我們所要做的第一件事情是DOM操作,如果你對此并不十分熟悉,可以閱讀《
JavaScript Primer on DOM Manipulation 》。

??? 接下來的代碼創建容器和容器組,使得在這些容器中可以拖動每個元素,這在本文第二個demo的基礎上來完成。這段代碼能夠用來重新規劃元素的順序,將導航窗口放在頁面的左側或右側,或再加入你所能想到的其他的功能。

??? 我們將使用偽代碼來一步步進行講解,將真實的代碼通過注釋的方式留給讀者查看。

??? 1.當文檔第一次被加載時,我們創建一個名為dragHelper的DIV標簽,當我們開始移動一個元素的時候,dragHelper將成為一個隱藏元素,可以四處移動。真實的元素并不會被拖動,僅僅使用insertBefore和appendChild來移動。我們在開始的時候隱藏dragHelper。

??? 2.我們創建mouseDown和mouseUp函數。起初,所有的這些函數都假設記錄了鼠標按鈕的狀態,以至于iMouseDown變量在鼠標按下的時候為true,沒有按下的時候為false。

??? 3.我們創建一個全局變量DragDrops,以及一個函數CreateDragContainer。DragDrops包含一組相互關聯的容器。傳入CreateDragContainer的任何變量(代表容器)被組織成一個新的集合,使元素能夠在這些容器間自由移動。通過setAttribute,CreateDragContainer函數同樣將各容器中的元素綁定在一起。

??? 4.現在我們的代碼知道每個元素所在的集合,現在來看mouseMove函數。mouseMove函數首先設置了一個變量target,表示鼠標下面的目標元素,如果這個元素在集合(用getAttribute判斷)中就繼續下面操作:

??? 4.1.首先,在必要的時候,我們運行一個簡單的腳本來改變目標元素的class屬性,這樣就創造了一個翻動的效果。

??? 4.2.然后我們檢查鼠標是否點擊(因為我們的代碼已經運行到這里),如果事件發生:

??? 4.2.1.設置變量curTarget為當前元素。
??? 4.2.2.記錄元素當前在文檔中的位置,以便在需要的時候可以將它的值取回。
??? 4.2.3.將當前元素克隆到dragHelper,使得我們能夠移動元素的隱藏備份。
??? 4.2.4.因為在dragHelper中我們完全擁有了拖動元素的一個備份,這個元素會始終在鼠標下,我們必須移除dragObj屬性,讓代碼知道dragObj已不在集合中。
??? 4.2.5.我們快速記錄集合中每個元素當前的位置、寬度和高度。當元素第一次開始被拖動時,我們僅需做一次這種工作,否則每當鼠標移動的時候我們都必須做一次,甚至一秒內幾百次。

??? 4.3.如果鼠標沒有點擊,要么我們和之前擁有同樣的目標元素,要么沒有目標元素,不論哪種情況我們都不會做任何事情。

??? 5.現在我們檢查curTarget變量。curTarget應該僅包含一個被拖動的對象,因此如果它存在,表示我們正在拖動一個元素:

??? 5.1.移動隱藏DIV到鼠標,這個元素和文章前面所創建的元素一樣能夠被拖動。

??? 5.2.然后我們檢查鼠標是否存在于當前集合中每個容器中。

??? 5.2.1.如果鼠標在某個容器中,我們檢查容器中的每個元素,查看我們正拖動的元素屬于哪個位置。
??? 5.2.2.然后我們將所拖動的元素放置在容器中另一個元素的前面,或容器的最后位置。
??? 5.2.3.最后我們確定元素可見。

??? 6.剩下的事情就是捕獲mouseUp事件:
??? 6.1.首先需要隱藏dragHelper:它不再被需要,因為我們沒有拖動任何東西。
??? 6.2.如果拖動的元素是可見的,它已經存在于任何它所屬的容器中,所有工作已完成。
??? 6.3.如果拖動的元素不可見,我們將它放回它原來所在的地方。
// ?iMouseDown?represents?the?current?mouse?button?state:?up?or?down
/**/ /*
lMouseState?represents?the?previous?mouse?button?state?so?that?we?can
check?for?button?clicks?and?button?releases:

if(iMouseDown?&&?!lMouseState)?//?button?just?clicked!
if(!iMouseDown?&&?lMouseState)?//?button?just?released!
*/

var ?mouseOffset? = ? null ;
var ?iMouseDown?? = ? false
;
var ?lMouseState? = ? false
;
var ?dragObject?? = ? null
;

// ?Demo?0?variables

var ?DragDrops??? = ?[];
var ?curTarget??? = ? null
;
var ?lastTarget?? = ? null
;
var ?dragHelper?? = ? null
;
var ?tempDiv????? = ? null
;
var ?rootParent?? = ? null
;
var ?rootSibling? = ? null
;

Number.prototype.NaN0
= function () { return ?isNaN( this ) ? 0 : this ;}


function ?CreateDragContainer() {
??
/**/
/*
??Create?a?new?"Container?Instance"?so?that?items?from?one?"Set"?can?not
??be?dragged?into?items?from?another?"Set"
??
*/

??
var ?cDrag? = ?DragDrops.length;
??DragDrops[cDrag]?
=
?[];

??
/**/
/*
??Each?item?passed?to?this?function?should?be?a?"container".??Store?each
??of?these?items?in?our?current?container
??
*/

??
for ( var ?i = 0 ;?i < arguments.length;?i ++ ) {
????
var ?cObj? =
?arguments[i];
????DragDrops[cDrag].push(cObj);
????cObj.setAttribute('DropObj',?cDrag);

????
/**/
/*
????Every?top?level?item?in?these?containers?should?be?draggable.??Do?this
????by?setting?the?DragObj?attribute?on?each?item?and?then?later?checking
????this?attribute?in?the?mouseMove?function
????
*/

????
for ( var ?j = 0 ;?j < cObj.childNodes.length;?j ++ ) {

??????
// ?Firefox?puts?in?lots?of?#text?nodesskip?these

?????? if (cObj.childNodes[j].nodeName == '#text')? continue ;

??????cObj.childNodes[j].setAttribute('DragObj',?cDrag);
????}

??}

}


function ?mouseMove(ev) {
????ev?
= ?ev? ||
?window.event;

????
/**/
/*
????We?are?setting?target?to?whatever?item?the?mouse?is?currently?on
????Firefox?uses?event.target?here,?MSIE?uses?event.srcElement
????
*/

????
var ?target? = ?ev.target? || ?ev.srcElement;
????
var ?mousePos? =
?mouseCoords(ev);

????
// ?mouseOut?event?-?fires?if?the?item?the?mouse?is?on?has?changed

???? if (lastTarget? && ?(target !== lastTarget)) {
??????
// ?reset?the?classname?for?the?target?element

?????? var ?origClass? = ?lastTarget.getAttribute('origClass');
??????
if (origClass)?lastTarget.className? =
?origClass;
????}


????
/**/ /*
????dragObj?is?the?grouping?our?item?is?in?(set?from?the?createDragContainer?function).
????if?the?item?is?not?in?a?grouping?we?ignore?it?since?it?can't?be?dragged?with?this
????script.
????
*/

????
var ?dragObj? = ?target.getAttribute('DragObj');

????
// ?if?the?mouse?was?moved?over?an?element?that?is?draggable

???? if (dragObj != null ) {
??????
// ?mouseOver?event?-?Change?the?item's?class?if?necessary

?????? if (target != lastTarget) {
????????
var ?oClass? =
?target.getAttribute('overClass');
????????
if (oClass)
{
??????????target.setAttribute('origClass',?target.className);
??????????target.className?
=
?oClass;
????????}

??????}


??????
// ?if?the?user?is?just?starting?to?drag?the?element
?????? if (iMouseDown? && ? ! lMouseState) {
????????
// ?mouseDown?target

????????curTarget? = ?target;

????????
// ?Record?the?mouse?x?and?y?offset?for?the?element

????????rootParent? = ?curTarget.parentNode;
????????rootSibling?
=
?curTarget.nextSibling;

????????mouseOffset???
=
?getMouseOffset(target,?ev);

????????
// ?We?remove?anything?that?is?in?our?dragHelper?DIV?so?we?can?put?a?new?item?in?it.

???????? for ( var ?i = 0 ;?i < dragHelper.childNodes.length;?i ++ )?dragHelper.removeChild(dragHelper.childNodes[i]);

????????
// ?Make?a?copy?of?the?current?item?and?put?it?in?our?drag?helper.

????????dragHelper.appendChild(curTarget.cloneNode( true ));
????????dragHelper.style.display?
=
?'block';

????????
// ?set?the?class?on?our?helper?DIV?if?necessary

???????? var ?dragClass? = ?curTarget.getAttribute('dragClass');
????????
if (dragClass)
{
??????????dragHelper.firstChild.className?
=
?dragClass;
????????}


????????
// ?disable?dragging?from?our?helper?DIV?(it's?already?being?dragged)
????????dragHelper.firstChild.removeAttribute('DragObj');

????????
/**/
/*
????????Record?the?current?position?of?all?drag/drop?targets?related
????????to?the?element.??We?do?this?here?so?that?we?do?not?have?to?do
????????it?on?the?general?mouse?move?event?which?fires?when?the?mouse
????????moves?even?1?pixel.??If?we?don't?do?this?here?the?script
????????would?run?much?slower.
????????
*/

????????
var ?dragConts? = ?DragDrops[dragObj];

????????
/**/
/*
????????first?record?the?width/height?of?our?drag?item.??Then?hide?it?since
????????it?is?going?to?(potentially)?be?moved?out?of?its?parent.
????????
*/

????????curTarget.setAttribute('startWidth',??parseInt(curTarget.offsetWidth));
????????curTarget.setAttribute('startHeight',?parseInt(curTarget.offsetHeight));
????????curTarget.style.display??
= ?'none';

????????
// ?loop?through?each?possible?drop?container

???????? for ( var ?i = 0 ;?i < dragConts.length;?i ++ ) {
??????????
with (dragConts[i])
{
????????????
var ?pos? =
?getPosition(dragConts[i]);

????????????
/**/
/*
????????????save?the?width,?height?and?position?of?each?container.

????????????Even?though?we?are?saving?the?width?and?height?of?each
????????????container?back?to?the?container?this?is?much?faster?because
????????????we?are?saving?the?number?and?do?not?have?to?run?through
????????????any?calculations?again.??Also,?offsetHeight?and?offsetWidth
????????????are?both?fairly?slow.??You?would?never?normally?notice?any
????????????performance?hit?from?these?two?functions?but?our?code?is
????????????going?to?be?running?hundreds?of?times?each?second?so?every
????????????little?bit?helps!

????????????Note?that?the?biggest?performance?gain?here,?by?far,?comes
????????????from?not?having?to?run?through?the?getPosition?function
????????????hundreds?of?times.
????????????
*/

????????????setAttribute('startWidth',?parseInt(offsetWidth));
????????????setAttribute('startHeight',?parseInt(offsetHeight));
????????????setAttribute('startLeft',?pos.x);
????????????setAttribute('startTop',?pos.y);
??????????}


??????????
// ?loop?through?each?child?element?of?each?container
?????????? for ( var ?j = 0 ;?j < dragConts[i].childNodes.length;?j ++ ) {
????????????
with (dragConts[i].childNodes[j])
{
??????????????
if ((nodeName == '#text')? || ?(dragConts[i].childNodes[j] == curTarget))? continue
;

??????????????
var ?pos? =
?getPosition(dragConts[i].childNodes[j]);

??????????????
// ?save?the?width,?height?and?position?of?each?element

??????????????setAttribute('startWidth',??parseInt(offsetWidth));
??????????????setAttribute('startHeight',?parseInt(offsetHeight));
??????????????setAttribute('startLeft',???pos.x);
??????????????setAttribute('startTop',????pos.y);
????????????}

??????????}

????????}

??????}

????}


????
// ?If?we?get?in?here?we?are?dragging?something
???? if (curTarget) {
??????
// ?move?our?helper?div?to?wherever?the?mouse?is?(adjusted?by?mouseOffset)

??????dragHelper.style.top?? = ?mousePos.y? - ?mouseOffset.y;
??????dragHelper.style.left?
= ?mousePos.x? -
?mouseOffset.x;

??????
var ?dragConts?? =
?DragDrops[curTarget.getAttribute('DragObj')];
??????
var ?activeCont? = ? null
;

??????
var ?xPos? = ?mousePos.x? - ?mouseOffset.x? + ?(parseInt(curTarget.getAttribute('startWidth'))? / 2
);
??????
var ?yPos? = ?mousePos.y? - ?mouseOffset.y? + ?(parseInt(curTarget.getAttribute('startHeight')) / 2
);

??????
// ?check?each?drop?container?to?see?if?our?target?object?is?"inside"?the?container

?????? for ( var ?i = 0 ;?i < dragConts.length;?i ++ ) {
????????
with (dragConts[i])
{
??????????
if (((getAttribute('startLeft'))? < ?xPos)? &&

????????????((getAttribute('startTop'))?
< ?yPos)? &&
????????????((getAttribute('startLeft')?
+ ?getAttribute('startWidth'))? > ?xPos)? &&
????????????((getAttribute('startTop')??
+ ?getAttribute('startHeight'))? > ?yPos)) {

????????????
/**/
/*
????????????our?target?is?inside?of?our?container?so?save?the?container?into
????????????the?activeCont?variable?and?then?exit?the?loop?since?we?no?longer
????????????need?to?check?the?rest?of?the?containers
????????????
*/

????????????activeCont?
= ?dragConts[i];

????????????
// ?exit?the?for?loop

???????????? break ;
????????}

??????}

????}


????
// ?Our?target?object?is?in?one?of?our?containers.??Check?to?see?where?our?div?belongs
???? if (activeCont) {
??????
// ?beforeNode?will?hold?the?first?node?AFTER?where?our?div?belongs

?????? var ?beforeNode? = ? null ;

??????
// ?loop?through?each?child?node?(skipping?text?nodes).

?????? for ( var ?i = activeCont.childNodes.length - 1 ;?i >= 0 ;?i -- ) {
????????
with (activeCont.childNodes[i])
{
??????????
if (nodeName == '#text')? continue
;

????????????
// ?if?the?current?item?is?"After"?the?item?being?dragged

???????????? if (
??????????????curTarget?
!= ?activeCont.childNodes[i]? &&

??????????????((getAttribute('startLeft')?
+ ?getAttribute('startWidth'))? > ?xPos)? &&
??????????????((getAttribute('startTop')??
+ ?getAttribute('startHeight'))? > ?yPos)) {
????????????????beforeNode?
=
?activeCont.childNodes[i];
????????}

??????}

????}


????
// ?the?item?being?dragged?belongs?before?another?item
???? if (beforeNode) {
??????
if (beforeNode != curTarget.nextSibling)
{
????????activeCont.insertBefore(curTarget,?beforeNode);
??????}


????
// ?the?item?being?dragged?belongs?at?the?end?of?the?current?container
????}
? else ? {
??????
if ((curTarget.nextSibling)? || ?(curTarget.parentNode != activeCont))
{
????????activeCont.appendChild(curTarget);
??????}

????}


????
// ?make?our?drag?item?visible
???? if (curTarget.style.display != '') {
??????curTarget.style.display??
=
?'';
????}

??}
? else ? {

????
// ?our?drag?item?is?not?in?a?container,?so?hide?it.

???? if (curTarget.style.display != 'none') {
??????curTarget.style.display??
=
?'none';
????}

??}

}


??
// ?track?the?current?mouse?state?so?we?can?compare?against?it?next?time
??lMouseState? = ?iMouseDown;

??
// ?mouseMove?target

??lastTarget?? = ?target;

??
// ?track?the?current?mouse?state?so?we?can?compare?against?it?next?time

??lMouseState? = ?iMouseDown;

??
// ?this?helps?prevent?items?on?the?page?from?being?highlighted?while?dragging

?? return ? false ;
}


function ?mouseUp(ev) {
??
if (curTarget)
{
????
// ?hide?our?helper?object?-?it?is?no?longer?needed

????dragHelper.style.display? = ?'none';

????
// ?if?the?drag?item?is?invisible?put?it?back?where?it?was?before?moving?it

???? if (curTarget.style.display? == ?'none') {
??????
if (rootSibling)
{
????????rootParent.insertBefore(curTarget,?rootSibling);
??????}
? else ?
{
????????rootParent.appendChild(curTarget);
??????}

????}


????
// ?make?sure?the?drag?item?is?visible
????curTarget.style.display? = ?'';
??}

??curTarget??
= ? null ;
??iMouseDown?
= ? false
;
}


function ?mouseDown() {
??iMouseDown?
= ? true
;
??
if (lastTarget)
{
????
return ? false
;
??}

}


document.onmousemove?
= ?mouseMove;
document.onmousedown?
=
?mouseDown;
document.onmouseup?
=
?mouseUp;

window.onload?
= ? function ()
{
??
// ?Create?our?helper?object?that?will?show?the?item?while?dragging

??dragHelper? = ?document.createElement('DIV');
??dragHelper.style.cssText?
=
?'position:absolute;display:none;';
????????
??CreateDragContainer(
????document.getElementById('DragContainer1'),
????document.getElementById('DragContainer2'),
????document.getElementById('DragContainer3')
??);

??document.body.appendChild(dragHelper);
}
<!-- ?the?mouse?over?and?dragging?class?are?defined?on?each?item? -->
?
< div? class? ="DragContainer" ?id ="DragContainer1" >
??
< div? class ="DragBox" ?id ="Item1" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#1 </ div >
??
< div? class ="DragBox" ?id ="Item2" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#2 </ div >
??
< div? class ="DragBox" ?id ="Item3" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#3 </ div >
??
< div? class ="DragBox" ?id ="Item4" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#4 </ div > ?
</ div >


< div? class ="DragContainer" ?id ="DragContainer2" ? >
??
< div? class ="DragBox" ?id ="Item5" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#5 </ div >
??
< div? class ="DragBox" ?id ="Item6" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#6 </ div >
??
< div? class ="DragBox" ?id ="Item7" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#7 </ div >
??
< div? class ="DragBox" ?id ="Item8" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#8 </ div >
</ div >

< div? class ="DragContainer" ?id ="DragContainer3" >
??
< div? class ="DragBox" ?id ="Item9" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#9 </ div >
??
< div? class ="DragBox" ?id ="Item10" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#10 </ div >
??
< div? class ="DragBox" ?id ="Item11" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#11 </ div >
??
< div? class ="DragBox" ?id ="Item12" ?overClass ="OverDragBox" ?dragClass ="DragDragBox" > Item?#12 </ div >
</ div >

??? 關于作者

??? Mark Kahn是一位Web Developer和DBA。可以通過這個網址跟他聯系:
http://www.jslibrary.org

??? 原文鏈接: http://www.webreference.com/programming/javascript/mk/column2/3.html?

??? 另外兩篇:
[翻譯] 如何在 JavaScript 中實現拖放(上) ?? [翻譯] 如何在 JavaScript 中實現拖放(中)

posted on 2006-10-15 17:03 Flyingis 閱讀(6300) 評論(19)  編輯  收藏 所屬分類: Web 客戶端技術

評論

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

期待這篇文章很久了,呵呵,辛苦啦
2006-10-15 17:44 | 馬嘉楠

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

@馬嘉楠
時間緊,翻譯的還有一些問題,歡迎意見!
2006-10-15 18:11 | Flyingis

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

好東西,能不能給出一個完整的測試用例!謝謝啦!
2006-10-15 20:43 | jerson20081024

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

@jerson20081024
有空我整理出來。
2006-10-16 08:55 | Flyingis

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

我試了一下,用簡單的可以成功,可是不知道為什么,如:
< div class ="DragBox" id ="Item12" overClass ="OverDragBox" dragClass ="DragDragBox" > Item #12 </ div >
中的Item #12 換成表格或是標簽層類的內容,拖動功能有時就出差錯了,拖動時,在IE中整個列會消失,不知道為什么,您可以解釋一下么?
謝謝
2006-10-16 11:53 | xiaoyuer

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

我把JS代碼整理出來了,可以下載:
http://www.qpkxbc.shop/Files/flyingis/drag_drop.rar
@xiaoyuer
我沒有仔細調試,但代碼中多處涉及父子節點的操作,換成標簽層后DOM深度改變,可能因此而影響代碼邏輯功能。
2006-10-16 22:01 | Flyingis

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

@Flyingis
謝謝!!
2006-10-17 10:44 | xiaoyuer

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

謝謝!ke!
2006-10-17 16:06 | ghdvb

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

感謝翻譯!期待例子。
2006-10-17 19:56 | 慈悲魚

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

@Flyingis
今天偶然打開那個作的測試頁面,發現問題了,呵呵,那個問題好像是和IE瀏覽器有關,我一直用Maxthon 今天無意用IE打開就沒出現意外情況,繼續研究!
2006-10-18 10:03 | xiaoyuer

# 能否保存經過拖放后的效果?  回復  更多評論   

能否保存經過拖放后的效果?
2006-12-07 19:30 | tom[匿名]

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

http://www.cnblogs.com/cloudgamer/archive/2008/11/17/1334778.html
這是我寫的拖動效果
多多交流
2008-11-23 17:15 | vvd

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

請問:mouseUp函數中最后如何獲取rootParent對象中的數據?
2009-03-25 16:33 | 小小陳

# android tablets  回復  更多評論   

的拖動效果
2013-02-09 21:37 | android tablets

# free movies online  回復  更多評論   

今天偶然打開那個作的測試頁面,發現問題了,呵呵,那個問題好像是和IE瀏覽器有關,我一直用Maxthon 今天無意用IE打開就沒出現意外情況,繼續研究!
2013-03-11 17:21 | free movies online

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)  回復  更多評論   

這是我寫的拖動效果
多多交流
2013-03-12 16:22 | movies on demand

# movies on line  回復  更多評論   

?? ???! ??? ?? ?? ?? ? ??? ?????.
2013-03-13 17:46 | movies on line

# movies online  回復  更多評論   

請問:mouseUp函數中最后如何獲取rootParent對象中的數據?
2013-03-14 16:26 | movies online

# re: [翻譯] 如何在 JavaScript 中實現拖放(下)[未登錄]  回復  更多評論   

為什么我的那個drapHelper一直提示是null
2013-06-04 10:40 | zoe

只有注冊用戶登錄后才能發表評論。


網站導航:
 
1一152期六合图库资料