簡體   English   中英

在jQuery中獲取數據的替代方法,而不是重復使用parent()和next()?

[英]Alternative method to get data in jQuery than to use parent() and next() repeatedly?

我有一個任務列表數據的HTML表,當單擊某行時,我試圖獲取所有數據值並將它們存儲到一個對象中。

我下面有一些HTML和JavaScript的演示,所有演示都按我的需要運行。

問題是我知道jQuery部分的質量確實很差,因為它調用的是這樣的東西...

$taskEl.parent().parent('td').next().next().next().text()

我覺得這些可以改善,但是我不確定如何改善。 大多數操作已經在我要清理的現有項目上完成,而這1部分確實讓我感到煩惱。

我希望以其他方式獲取數據方面的幫助嗎?

還是這是最有效的方法?

另外,如果需要添加新的ID或數據屬性,我可以修改某些HTML。

JSFiddle演示 ...單擊任務標題中的鏈接時,它將為演示目的將選擇的值打印到DOM中: DEMO

演示JavaScript以從DOM任務列表中獲取任務數據並使用它創建一個JS對象:

//Open Task Modal when a Task record is clicked in Task List
$('body').on('click', '.taskName', function() {


    // Set and Cache Task ID from clicked on Task Item
    var taskId = $(this).parent().parent().parent().dataAttr('task-id');

    var $taskEl = $(this);

    // Populate Task Data Object from DOM values
    taskDataObject = {
        //projectId: projectTaskModal.cache.projectId,
        taskId: taskId,
        taskName: $taskEl.text(),
        taskDescription: $taskEl.next('.description').text(),
        taskStatus: $taskEl.parent().parent('td').next().text(),
        taskPriority: $taskEl.parent().parent('td').next().next().text(),
        taskTags: $taskEl.parent().parent('td').next().next().next().text(),
        taskCreatedDate: $taskEl.parent().parent('td').next().next().next().next().text(),
        taskModifiedDate: $taskEl.parent().parent('td').next().next().next().next().next().text(),
        taskDueDate: $taskEl.parent().parent('td').next().next().next().next().next().next().text(),
    };

});

演示任務列表HTML

<span id="projectIdPlaceholder" data-project-id="1234"></span>

  <table>

  <!-- test task list record 1 -->
  <tr id="task-row-1414135033730" data-task-id="1414135033730">
    <td width="1%" class="task-checkbox">
      <div class="status_update status-checkbox-Not-Started" data-id="1414135033730" data-status="Not Started" id="1414135033730"></div>
    </td>

    <td width="59%" class="task-name">
      <div><span id="1414135033730-taskName" class="taskName strikethrough">Add a Plugin System similar to WordPress Action and Filter Hooks
        <span class="open-description-icon open-description-icon-close" title"toggle="" description="" view"="">+</span>
        </span>
        <div id="1414135033730-taskDescription" class="description" style="display: block;">Project module will Fire Events before and After key events and Plugins in a custom/modulename/plugins/ folder will load and be able to Listen for these Event Hooks and then run it;s own code before and after these actions are executed!</div>
      </div>
    </td>
    <td width="10%">
      <div id="1414135033730-status" class="Not Started status">                 Not Started</div>
    </td>
    <td width="10%">
      <div id="1414135033730-taskPriority" class="priority">Low</div>
    </td>
    <td width="10%">
      <div class="type">Other</div>
    </td>
    <td width="10%">
      <div id="1414135033730-createdDate" class="createdDate">2014-10-24 07:18:41</div>
    </td>
    <td width="10%">
      <div id="1414135033730-modifiedDate" class="modifiedDate">2014-10-24 07:18:41</div>
    </td>
    <td width="10%">
      <div id="1414135033730-dueDate" class="dueDate">None</div>
    </td>
  </tr>

  <!-- test task list record 2 -->
  <tr id="task-row-1414135033731" data-task-id="1414135033731">
    <td width="1%" class="task-checkbox">
      <div class="status_update status-checkbox-Completed" data-id="1414135033731" data-status="Completed" id="1414135033731"></div>
    </td>

    <td width="59%" class="task-name">
      <div>
        <span id="1414135033731-taskName" class="taskName">Testing Task Record Number 2
        <span class="open-description-icon open-description-icon-close" title"toggle="" description="" view"="">+</span>
        </span>
        <div id="1414135033731-taskDescription" class="description" style="display: block;">My project task description for demo testing task record number 2!</div>
      </div>
    </td>
    <td width="10%">
      <div id="1414135033731-status" class="Completed status">Completed</div>
    </td>
    <td width="10%">
      <div id="1414135033731-taskPriority" class="priority">High</div>
    </td>
    <td width="10%">
      <div class="type">Magento</div>
    </td>
    <td width="10%">
      <div id="1414135033731-createdDate" class="createdDate">2014-10-27 03:10:14</div>
    </td>
    <td width="10%">
      <div id="1414135033731-modifiedDate" class="modifiedDate">2014-10-27 03:22:24</div>
    </td>
    <td width="10%">
      <div id="1414135033731-dueDate" class="dueDate">06/21/2015</div>
    </td>
  </tr>
</table>

由於您具有可用的任務ID,並且所有div都有ID,因此我將直接定位元素ID。 在jQuery中,您可以越具體越好。

$('body').on('click', '.taskName', function() {

    // Get the task (row) that will be used for running all the selections
    var taskid = $(this).closest("tr").dataAttr('task-id');
    var taskSel = "#" + taskid + "-";

    // Populate Task Data Object from DOM values
    taskDataObject = {

        taskId: taskid;,
        taskName: $(taskSel + "taskName").text(),
        taskDescription: $(taskSel + "taskDescription").text(),
        taskStatus: $(taskSel + "taskStatus").text(),
        taskPriority: $(taskSel + "taskPriority").text(),
        taskTags: $(taskSel + "taskTags").text(),
        taskCreatedDate: $(taskSel + "taskCreatedDate").text(),
        taskModifiedDate: $(taskSel + "taskModifiedDate").text(),
        taskDueDate: $(taskSel + "taskDueDate").text(),
    };
});

您的不同值在divspan ,並帶有描述性的類名,您可以使用find()和它們的className在單擊的行中選擇它們。

像這樣:

//Open Task Modal when a Task record is clicked in Task List
$('body').on('click', '.taskName', function() {

    // Get the task (row) that will be used for running all the selections
    $task = $(this).closest("tr");

    // Populate Task Data Object from DOM values
    taskDataObject = {
        //projectId: projectTaskModal.cache.projectId,
        taskId: $task.data('task-id'),
        taskName: $task.find(".taskName").text(),
        taskDescription: $task.find(".description").text(),
        taskStatus: $task.find(".status").text(),
        taskPriority: $task.find(".priority").text(),
        taskTags: $task.find(".type").text(),
        taskCreatedDate: $task.find(".createdDate").text(),
        taskModifiedDate: $task.find(".modifiedDate").text(),
        taskDueDate: $task.find(".dueDate").text()
    };

});

編輯:為保持一致,我用$task.find(".taskName").text()$(this).next(".description").text() $task.find(".taskName").text()替換了$(this).text() $task.find(".description").text() 並刪除taskIdtaskEl因為它們是多余的。

Edit2:將$(this).parent().parent().parent()替換$(this).closest("tr") 這樣,如果將來HTML結構發生更改(並且父級數目發生更改),仍將選擇任務行,並且代碼應該可以正常工作。

建議不要使用data-*屬性存儲值並使用JavaScript動態構建對象,而不是手動選擇每個元素,例如:

HTML:

<table id="table">
    <tr>
        <td data-name="taskName" data-value="Test">
            <div class="foo">Test</div>
        </td>
        <td data-name="taskDate" data-value="1439275213">
            <div class="foo">2014-10-24 07:18:41</div>
        </td>
    </tr>
</table>

JavaScript:

var $nodes = $('#table').find('td[data-name]'); // find TDs with 'data-attr'
var attributes = {};
$nodes.each(function() { // generate object with all data-name/data-value pairs
    var $node = $(this);
    attributes[$node.attr('data-name')] = $node.attr('data-value');
});
console.log(attributes); // prints { taskName: "Test", taskDate: "1439275213" }

演示: http//jsfiddle.net/andunai/uu65ntks/

PS此方法還允許您顯示不同於其值的值,例如,顯示人類可讀的日期,但將其序列化為unix時間戳。

這里有多種選擇,取決於您的需求,

這個例子不是最快的,但是接近最佳性能,它的很好用法是從$選擇器中重新加載DOM元素,這意味着處理DOM的並行事件將呈現相同的內容,而不是$ this = $(this),重新選擇dom元素,再也不是就性能而言的最佳做法(在dom中搜索),仍然比動態修改的html提供最佳結果。

您的來電:

$('body').on('click', '.taskName', function() {

    var taskId = $(this).attr('id').replace('-taskName', '');
    taskDataObject = {
        //projectId: projectTaskModal.cache.projectId,
        taskId: taskId,
        taskName: $(this).text(),
        taskDescription:$('[id="' + taskId + '-taskDescription"').text(),
        taskStatus:$('[id="' + taskId + '-status"').text(),
        taskPriority: $('[id="' + taskId + '-taskPriority"').text(),
        taskTags: "undefined please defeine corect atribute on div",
        taskCreatedDate: $('[id="' + taskId + '-createdDate"').text(),
        taskModifiedDate: $('[id="' + taskId + '-modifiedDate"').text(),
        taskDueDate: $('[id="' + taskId + '-dueDate"').text(),
    };

        deepTrim(taskDataObject);
        printObjectToDom(taskDataObject);
});

您可以在主父html上編寫自定義選擇器,與我的示例類似

var T_REX = $(this).parent().parent()... whatever;

var T_REX_CUBS = TREX.children();

var taskname = T_REX_CUBS[0].find("div.taskName").text();

或最簡單的

var T_REX = $(this).closest('tr');

var taskid = T_REX.attr('data-task-id');

var taskname = T_REX.find("div.taskName").text();

現在,最快的選擇是保存主要的父對象,然后再應用jquery定制選擇器,但是如果表中的數據實時更改,則不建議這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM