2009-09-12 39 views
1

我正在生成一組html行輸入文本字段,我希望我的最終用戶能夠重新排序。我不想使用AJAX,但用Javascript即可。如何在不進入AJAX的情況下對一行html輸入字段進行重新排序

我很好,每行的側面放置了一些箭頭按鈕,當按下時會上下移動字段。

我的問題與AJAX是它太重(50-60kb)只是這個功能。我查看了一些雅虎代碼(YUI),但是再一次看來,它對於某個特定的功能來說似乎過分了。我發現這個 - http://www.danvk.org/wp/dragtable/ - 這似乎是最輕的代碼,但只允許列重新排序。

我將在最後一個選項上工作,但我對如何做到這一點的其他想法/方法持開放態度(即允許用戶重新排序行字段)。

PS:這個討論並不重要,我想,但我使用PHP來生成這些html文本字段。

+1

爲什麼你需要爲AJAX?您對服務器沒有任何疑問,您在本地工作,而且Ajax與此無關。如果您只想對行進行重新排序,則可能需要編寫自己的輕量級解決方案。 – bandi 2009-09-12 08:03:53

+0

對不起,但如果訂單不會被保留,重新排序項目有什麼意義? 你從哪裏得到60k的數據? Railscasts有一個使用ajax和原型持續訂單的插曲。你一定要看。 Ruby代碼不難理解。 – Eimantas 2009-09-12 08:04:06

+0

我的猜測是,OP提到AJAX是因爲他們已經閱讀了關於在服務器上的數據源中輸入順序的任何變化的持久性。沒有命令的持久性,沒有AJAX需要,雖然JavaScript將是 – 2009-09-12 08:11:49

回答

1

添加到約瑟夫的答案...

根據W3C DOM Level 2 Core specification

的insertBefore

插入現有子節點refChild之前節點newChild對象。 [...] 如果newChild已經在樹中,它首先被刪除。

因此,在撥打insertChild()之前不需要致電removeChild()

此外,IE6 DOM支持非常糟糕,所以您可能需要爲它編寫特定的代碼。或者,也許你寧願不浪費時間來支持這個瀏覽器,並且ask users to upgrade。或者,如果您真的需要支持IE6,可能使用JavaScript庫(如jQuery)可能是一個簡單的解決方案。

編輯:這是最後的JavaScript解決方案的基礎上,約瑟夫的回答是:

function up(row) { 
    var prevRow = row.previousSibling; 
    if(prevRow) { 
     row.parentNode.insertBefore(row, prevRow); 
    } 
} 
+0

您好,德尼爾森,感謝您的意見。它看起來不像IE7正確支持它。我正在嘗試下面的代碼,它在FF中工作,但不在IE7中(輸入字段不移動)。 (行){ var prevRow = row.previousElementSibling; (prevRow!= null){row.parentNode.removeChild(row); row.parentNode.insertBefore(row,prevRow); } }; – Steve 2009-09-13 05:46:44

+0

嘿,我剛剛注意到了這個問題! 'row.previousElementSibling'錯誤,正確的應該是'row.previousSibling'。我基於W3C規範(查看我的答案中的鏈接)以及MDC(Mozilla開發人員中心https://developer.mozilla.org/en/DOM/Node)這樣說。 – 2009-09-13 06:47:32

+0

奇妙!這解決了我遇到的所有問題!突出抓住德尼爾森 - 非常感謝你!這是我的頭幾天!再次感謝!!!!! – Steve 2009-09-13 09:49:58

0

你似乎很困惑; AJAX是一個通用術語,指的是使用Javascript通過子請求從服務器加載額外內容,而無需實際加載新頁面。有許多不同的Javascript庫可以處理AJAX請求。

當你說「AJAX」時,你可能正在考慮像JQuery這樣的更受歡迎的庫之一?

至於你的問題 - 有一點要記住的是,通過適當的服務器配置,客戶端瀏覽器將在第一次請求後通用緩存Javascript庫;因此一致的總體加載時間不受這些庫的大小的影響 - 僅限於首頁加載。如果您使用Google-hosted copy of JQuery,即使您的網站的絕大多數訪問者可能已經緩存了該文件,也可以避免這種情況。

1

您可以編寫JavaScript與此類似

function up(row) { 
    var prevRow = row.previousElementSibling; 
    if(prevRow != null) { 
     row.parentNode.removeChild(row); 
     document.body.insertBefore(row, prevRow); 
    } 
}; 

,並用它在你行這樣的功能:

<p> 
    <input type="text"/> 
    <a onclick="up(this.parentNode)">Up</a> 
</p> 

我同意你,你並不真的需要參考一個像這樣的簡單任務的Javascript框架。

+0

謝謝約瑟夫 - 這看起來非常有前途!我正在閱讀更多內容,並試圖弄清楚如何使它適用於文本輸入字段的「行」。但再次感謝! :) – Steve 2009-09-12 10:33:50

+0

這似乎不工作在IE中,但... – Steve 2009-09-12 11:33:12

相關問題