我有这个功能,我试图找出/修复,似乎无法确定问题/无法找到让它运作的方法。
基本上我的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();

谢谢。
答案 0 :(得分:5)
jQuery对象,$(...)
返回已经有each
方法。该元素作为this
上下文传递。您可以使用jQuery进一步处理作用域上下文中的对象。基本上,你有正确的代码,只是在错误的范围内。
btnMain.each(function() {
var $li = $(this);
var $a = $li.find('a');
var desiredUrl = $a.attr('href').replace('-_-//', '');
$a.attr('href', desiredUrl);
});
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
上进行迭代