简化 CasperJS 中多个子元素的映射以仅使用一个函数
Simplify mapping multiple children elements in CasperJS to use only one function
我有这段代码,可以使用,但想简化它。特别是,我相信有一个 shorthand 方法来引用子元素,这样我就不需要编写多个函数。如果有 shorthand 方法可以简化此代码,请告诉我!
当前代码是
function getLineNumbers() {
var lineNumber = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(1)');
return Array.prototype.map.call(lineNumber, function(elem) {
return elem.textContent;
}); }
function getSKUs() {
var SKU = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(2)');
return Array.prototype.map.call(SKU, function(elem) {
return elem.textContent;
}); }
function getDescriptions() {
var description = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(3)');
return Array.prototype.map.call(description, function(elem) {
return elem.textContent;
}); }
function getPrices() {
var price = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(4)');
return Array.prototype.map.call(price, function(elem) {
return elem.textContent;
}); }
function getQuantities() {
var quantity = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(5)');
return Array.prototype.map.call(quantity, function(elem) {
return elem.textContent;
}); }
function getTotals() {
var total = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(6)');
return Array.prototype.map.call(total, function(elem) {
return elem.textContent;
}); }
然后我在后面的函数中使用以下代码调用它:
lineNumber = lineNumber.concat(this.evaluate(getLineNumbers));
SKU = SKU.concat(this.evaluate(getSKUs));
description = description.concat(this.evaluate(getDescriptions));
price = price.concat(this.evaluate(getPrices));
quantity = quantity.concat(this.evaluate(getQuantities));
total = total.concat(this.evaluate(getTotals));
有没有什么方法可以简化这段代码,这样我只需要一个函数(例如 getInvoiceData)就可以将子元素适当地链接到正确的数组?
您已经使用一个函数(CSS select 或 :nth-child()
)来 select 一个特定的子元素。您可以只有一个函数,并通过单独的参数将预期的子索引传递到页面上下文中:
function getText(i) {
var elements = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child('+i+')');
return Array.prototype.map.call(elements, function(elem) {
return elem.textContent;
});
}
lineNumber = lineNumber.concat(this.evaluate(getText, 1));
SKU = SKU.concat(this.evaluate(getText, 2));
...
我有这段代码,可以使用,但想简化它。特别是,我相信有一个 shorthand 方法来引用子元素,这样我就不需要编写多个函数。如果有 shorthand 方法可以简化此代码,请告诉我!
当前代码是
function getLineNumbers() {
var lineNumber = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(1)');
return Array.prototype.map.call(lineNumber, function(elem) {
return elem.textContent;
}); }
function getSKUs() {
var SKU = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(2)');
return Array.prototype.map.call(SKU, function(elem) {
return elem.textContent;
}); }
function getDescriptions() {
var description = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(3)');
return Array.prototype.map.call(description, function(elem) {
return elem.textContent;
}); }
function getPrices() {
var price = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(4)');
return Array.prototype.map.call(price, function(elem) {
return elem.textContent;
}); }
function getQuantities() {
var quantity = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(5)');
return Array.prototype.map.call(quantity, function(elem) {
return elem.textContent;
}); }
function getTotals() {
var total = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(6)');
return Array.prototype.map.call(total, function(elem) {
return elem.textContent;
}); }
然后我在后面的函数中使用以下代码调用它:
lineNumber = lineNumber.concat(this.evaluate(getLineNumbers));
SKU = SKU.concat(this.evaluate(getSKUs));
description = description.concat(this.evaluate(getDescriptions));
price = price.concat(this.evaluate(getPrices));
quantity = quantity.concat(this.evaluate(getQuantities));
total = total.concat(this.evaluate(getTotals));
有没有什么方法可以简化这段代码,这样我只需要一个函数(例如 getInvoiceData)就可以将子元素适当地链接到正确的数组?
您已经使用一个函数(CSS select 或 :nth-child()
)来 select 一个特定的子元素。您可以只有一个函数,并通过单独的参数将预期的子索引传递到页面上下文中:
function getText(i) {
var elements = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child('+i+')');
return Array.prototype.map.call(elements, function(elem) {
return elem.textContent;
});
}
lineNumber = lineNumber.concat(this.evaluate(getText, 1));
SKU = SKU.concat(this.evaluate(getText, 2));
...