【问题标题】:Iterate through columns' data atrributes遍历列的数据属性
【发布时间】:2017-01-13 11:47:03
【问题描述】:

我正在尝试通过迭代表列的数据属性列表来动态设置我想要通过的超链接字符串,同时获取它们的名称和值来创建我的超链接字符串。

这是 HTML 代码。

<table width="85%" border="1" align="center" cellpadding="2" cellspacing="2" id="results"  name="results222">               
        <cfoutput query="qryGetMain">
            <cfset count = count + 1>
            <tr>
                <td align="center" class="tblHeader" nowrap>#state#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="">#openTickets#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="">#closedTickets#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="LT8">#openTicketsLTE8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="GT8">#openTicketsGT8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="GT15">#openTicketsGT15#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="GT30">#openTicketsGT30#</td>

                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="LT8">#closedTicketsLTE8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="GT8">#closedTicketsGT8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="GT15">#closedTicketsGT15#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="GT30">#closedTicketsGT30#</td>               
            </tr>

         </cfoutput>   

    </tbody>

这是我的 JS 代码。我已经遍历了我想要的特定表的所有表列。 从 Var link_array = [] 开始,几行是我从Using jQuery to get data attribute values with .each() 提出的其他问题中得到的,但无法让它做我想做的事。我已经尝试过其他我能想到但不想在这里展示的东西,因为它只会让我认为的每个人更加困惑。

$('table[name="results222"] tr').find('td').each(function() {
                    if($(this).text() == '0' || $(this).text() == '0.00') {
                        $(this).css('background','red');    
                    }
                    else if ($(this).text() > 0) {
                        var link_array = [];

                        var link_array = $.map(this, function(el) {
                             return {name: 'state', value: $(el).data()}
                        });
                        $(this).html('<a href=details.cfm>'+$(this).text()+'</a>');
                    }
                });

所以我需要一个基本上可以使超链接像这样的字符串

href=details.cfm?state=GA&ticketType=open&dataRange=LT8。

我看看我是否在 .data('state') 中定义了一个参数,它实际上确实遍历了我可以获得值的所有数据状态属性,但我宁愿创建一些更动态的东西,以便当一个新开发者在 HTML 代码中创建另一个数据属性,JS 会自动选择新的。

提前致谢!

从 Z-Bone 的回答中添加的代码。

$('table[name="results222"] tr').find('td').each(function() {
                    if($(this).text() == '0' || $(this).text() == '0.00') {
                        $(this).css('background','red');    
                    }
                    else if ($(this).text() > 0) {
                        var data = $(this).data();
                        var href = "details.cfm?";
                        if (data) {
                            var first = true;
                            for (var i in data) {
                                if (!first) {
                                    href += "&";
                                }
                                href += i + "=" + (data[i] || "");
                                first = false;
                            }
                        }
                        $(this).html('<a href="' + href + '">' + $(this).text() + '</a>');
                    }

                });

【问题讨论】:

  • 听起来比必要的复杂。我也认为不需要 javascript。

标签: javascript jquery


【解决方案1】:

已编辑

试试这个动态执行的新代码

$('table[name="results222"] tr').find('td').each(function () {
	if ($(this).text().length == 0) {
		$(this).css('background', 'red');
	} else if ($(this).text().length > 0) {
		var data = $(this).data();
		var href = "details.cfm?";
		if (data) {
			var first = true;
			for (var i in data) {
				if (!first) {
					href += "&";
				}
				href += i + "=" + (data[i] || "");
				first = false;
			}
		}
		$(this).html('<a href="' + href + '">' + $(this).text() + '</a>');
	}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table width="85%" border="1" align="center" cellpadding="2" cellspacing="2" id="results"  name="results222">               
        <cfoutput query="qryGetMain">
            <cfset count = count + 1>
            <tr>
                <td align="center" class="tblHeader" nowrap>#state#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="">#openTickets#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="">#closedTickets#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="LT8">#openTicketsLTE8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="GT8">#openTicketsGT8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="GT15">#openTicketsGT15#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="open" data-dataRange="GT30">#openTicketsGT30#</td>

                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="LT8">#closedTicketsLTE8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="GT8">#closedTicketsGT8#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="GT15">#closedTicketsGT15#</td>
                <td align="center" class="style6 " nowrap data-state="#state#" data-ticketType="closed" data-dataRange="GT30">#closedTicketsGT30#</td>               
            </tr>

         </cfoutput>   

    </table>

【讨论】:

  • 这将创建我的链接字符串,但请记住,我想看看是否有一种方法可以动态获取基本上以“数据”开头的每个属性,获取其名称和值并在链接字符串中使用.如果它不能完成,那么这很好,但要确保没有办法在不硬编码 JS 代码中的属性名称的情况下获取所有(无论多少)。感谢您的帮助!
  • @ScrumMasterGuy 哦,好吧,我误解了你的需要。再次检查
  • 这非常接近我的需要。但是您是否碰巧知道为什么它只获取数据属性之一?好像它应该遍历每个属性并像您一样创建该字符串。现在我总是得到“details.cfm?state=SC”
  • 我的代码就是这样做的。它遍历所有数据属性...在您的代码中存在一些问题,但主要问题是您使用 `$(el).data() 就好像它是一个字符串,而它实际上是一个包含所有数据属性一起......我建议你使用我的答案中的逻辑,因为它完全符合你的需要 - 从所有数据属性构建一个 href
  • 我已将您的代码添加到我的原始帖子中,以表明我正在完全使用您的代码,但无论出于何种原因,它仅获取数据状态属性的值并用于链接。没有添加任何其他属性。我可以肯定地看到您的代码想要在您首先进行检查的地方循环,等等,但它没有选择其他代码。感谢您的所有帮助:)
【解决方案2】:

how to create query parameters更改

function paramaterizeData(data) {
   let ret = [];
   for (let d in data)
     ret.push(d + '=' + data[d]);
   return '?'+ret.join('&');
}
var data = { 'state': 'state54', 'ticket_type': 'open', 'dataRange': 'LT8' };
var querystring = paramaterizeData(data);

https://jsfiddle.net/fmzwqmja/5/

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2012-10-29
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多