2015-09-03 83 views
0

我正在創建一個表示數據綁定表的JavaScript類,使用jQuery來處理DOM操作。該類有一個$table.$body.$rows屬性,我保留表的jQuery包裝行的集合,以避免在添加或刪除行時執行$table.$body.children('tr')調用。當一行進入或離開編輯模式時,我需要能夠添加和刪除$table.$body.$rows屬性中的對象,我使用jQuery的.add().not()方法完成了該屬性。如何在指定索引處將對象添加到jQuery集合中?

但是,由於.add()方法將新項目添加到jQuery實例中維護的內部集合的末尾,因此這些方法並不合適,但是當正在編輯的行不在表格的最後時。爲了確保$table.$body.$rows集合的排序正確,我需要能夠插入jQuery集合中指定索引處的新項目。這樣的方法已經存在了,還是我要自己寫呢?

我可以讓HTMLTableSectionElement.rows屬性爲我記錄行,並在必要時將特定行簡單地包裝在jQuery對象中,但這看起來效率不高。這引出了第二個問題:無論如何,像.children('tr')這樣的電話有多昂貴,並且我會更好嗎?每次添加或刪除行時只需重新指定$table.$body.$rows

回答

1
  1. 從技術上講,jQuery do add splice() to jQuery.fn,但它沒有記錄。 They almost removed it最近從公共界面,但決定反對它;

    我們希望避免使用這些方法[jQuery.fn。{push,sort,splice}]的現象,但我們不想刪除它們。

    ......這就是你會的。

  2. 可能使用Array.prototype.splice.call,例如:

    Array.prototype.splice.call($table.$body.$rows, 3, 0, newItem); 
    

    ...我不知道怎樣說就錯了。

  3. 雖然在所有誠實,我認爲你正在試圖解決的是不存在的問題。

    我可以只讓行對我的HTMLTableSectionElement.rows財產跟蹤和簡單地包裹在一個jQuery對象的特定行,必要時

    ...我會做到這一點。在修改行時調用.children('tr')和更新$table.$body.$rows不會終止您的應用程序。

+0

那麼哪種方法更具性能:使用'.children('tr')'更新'$ table。$ body。$ rows'或者根據需要用'$()'封裝來自'HTMLTableSectionElement.rows'的行? –

+0

這個差別可以忽略不計。在這兩種情況下,您都是從已經*解析過的DOM節點構建一個jQuery對象,所以在任何情況下都不需要昂貴的(相對而言)DOM查詢。 jQuery [總是優化傳遞DOM元素的情況](https://github.com/jquery/jquery/blob/9d820fbde6d89bc7a06e2704be61cf6c0b4d6e3c/src/core/init.js#L97-L104)。話雖如此......在這裏要注意微觀優化。 0.00000001ms真的很重要嗎?你可以隨時(也應該)簡介它,如果這樣肯定... http://jsperf.com – Matt

+0

這是有道理的。我認爲,當您直接使用HTMLElement對象時,jQuery構造函數邏輯可能非常微不足道,但我不確定。 –

0

你可以在本地數組對象上使用splice函數。

arr.splice(index, 0, item);將在指定的index處插入itemarr

+0

jQuery的類沒有一個拼接的方法,雖然。還是呢?這不在他們的文檔中。 –

相關問題