function get_valid_action_buttons () { // Labels to identify the buttons var LABEL_TORRENT_DELETE= 'Delete'; var LABEL_TORRENT_STOP = 'Stop Torrent'; var LABEL_TORRENT_SEED = 'Seed Torrent'; var LABEL_TORRENT_START = 'Run Torrent'; // Register nodes, and calculate the size, from the delete_button's view, that saves alot of checking which elements to get. var listRows = document.evaluate ("//a[@class='delete_button']/../../parent::*", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); var listRowsPointer = listRows.snapshotLength; var listReturn = []; var listReturnPointer = 0; // Pointer points to pointee while (listRowsPointer > 0) { // Register domItem. var listDomRow = listRows.snapshotItem (--listRowsPointer); // Ah, here are those nifty buttons. var domButtons = listDomRow.lastChild.firstChild.childNodes; var domButtonsPointer = domButtons.length; while (domButtonsPointer > 0) { // Decrease domButtons pointer. --domButtonsPointer; // DOM Object var domButton = domButtons[domButtonsPointer].firstChild; // Attach switch title var domButtonTitle = domButton.title; // Check which button we have. switch (domButtonTitle) { case LABEL_TORRENT_DELETE: listReturn[listReturnPointer] = {'delete' : domButton.parentNode}; break; case LABEL_TORRENT_START: listReturn[listReturnPointer] = {'start' : domButton.parentNode}; break; case LABEL_TORRENT_STOP: listReturn[listReturnPointer] = {'stop' : domButton.parentNode}; break; case LABEL_TORRENT_SEED: listReturn[listReturnPointer] = {'seed' : domButton.parentNode}; break; // No valid entry point, decrease pointer. default: --listReturnPointer; break; } // Increase return pointer. listReturnPointer++; } } return listReturn;}console.log (get_valid_action_buttons ());