我在jQuery .each()函数中缺少什么?

时间:2016-03-25 05:32:43

标签: javascript jquery each

我有这个功能,我试图找出/修复,似乎无法确定问题/无法找到让它运作的方法。

基本上我的CMS正在吐出我想要的某些href:

第1部分)更改目标href网址

第2部分:更改按钮的文字

现在我只有2个这类按钮的实例,所以这里是我在我的控制台中打印的内容:

第1部分:对于这部分,我得到了正确的网址,没有我要删除的字符。

第2部分)按钮文本的两个实例(请参阅全部),然后是第一个按钮的正确变量btnParent,然后是第二个按钮,最后是&#的一个实例34;产品"

我的问题是,我无法弄清楚如何:

第1部分将已删除的网址作为每个功能发回给各自按钮的href。

第2部分)让each()函数将新文本打印为"查看全部+ BLAH +产品"对于每个实例,然后将新文本附加到相应的按钮。

以下是代码:



function viewMoreBtn() {
	var btnMain = $("li:contains('See All')");
	var btnText = $("li:contains('See All')").text();
	var btnParent = $("li:contains('See All')").parent('ul').prev('li').text();

// PART 1 - STRIP LINK URL OF -_-// CHARACTERS
	$.each(btnMain, function(i, v) {
		v = $(this).find('a').attr('href').replace('-_-//', '');
		console.log(v);
	});

// PART 2 - ADD LABEL TO HTML TEXT OF BTN
	$.each(btnMain, function(index, value) {
		value = (btnText + btnParent + 'Products');	
		$(btnMain).text(value);
		console.log(value);
	});
}
viewMoreBtn();




谢谢。

3 个答案:

答案 0 :(得分:5)

jQuery对象,$(...)返回已经有each方法。该元素作为this上下文传递。您可以使用jQuery进一步处理作用域上下文中的对象。基本上,你有正确的代码,只是在错误的范围内。

第1部分

btnMain.each(function() {
    var $li = $(this);
    var $a  = $li.find('a');
    var desiredUrl = $a.attr('href').replace('-_-//', '');
    $a.attr('href', desiredUrl);
});

第2部分

btnMain.each(function() {
    var $li = $(this);
    var btnText = $li.text();
    varbtnParent = $li.parent('ul').prev('li').text();
    value = (btnText + btnParent + 'Products'); 
    console.log(value);

    $li.find('a').text(value);

});

答案 1 :(得分:3)

请参阅@ Zequ的回答,了解返回的btnMain中each()函数的迭代。

这就是$ .each(obj,function(key,value)的工作方式:你遍历btnMain,对于$ .each()的每次迭代,函数将迭代的索引赋给i和值btnMain at the index to v。

$.each(btnMain, function(i, v) {
    //v = $(this).find('a').attr('href').replace('-_-//', '');
    console.log(i); // I am the index of $.each() iterator
    console.log(v); // I am the node from the btnMain array
    // I don't know if this is right without seeing your HTML, but it seems like what you want
    v.find('a').attr('href').replace('-_-//', '');
});

第二个$ .each()遵循相同的模式。

答案 2 :(得分:1)

如果我理解正确,你就会混淆你的变量。

$。每个都是传递的数组/对象的每个元素的函数。它为您提供索引和元素,请检查the reference

在第1部分中,您将 v 定义为您想要的字符串,您根本不需要更改元素,您需要这样的内容:

$.each(btnMain, function() {
    // you're saying you got the correct URLs, so the only thing you need to do is to change the element afterwards
    var element = $(this).find('a');
    v = element.attr('href').replace('-_-//', '');
    element.attr('href', v);
});`

您也可以使用btnMain.each代替$.each

在第2部分中,您将变量(它实际上是您要迭代的元素)更改为您想要的字符串,然后通过尝试更改btnMain的文本来关注它。这是错误的,从我的理解,btnMain是一个由两个元素组成的数组,你无法改变它的文本。您应该更改元素的值(您调用的值)。它会是那样的

$.each(btnMain, function(index, element){
    // I think this is the time you want to define the btnParent, relative to the element
    var btnParent = element.parent('ul').prev('li').text();
    var value = (btnText + btnParent + 'Products');       
    element.text(value);
}

我认为这就是你所需要的。 此外,您可以将两个部分合并为一个,因为两个部分都在btnMain

上进行迭代