更新1:
以下是更多的脚本:
$(".favorites").sortable(
{update:function() {
var that = this;
var urls = "";
var texts = "";
$.map($(".favorites a"), function(elt) {
urls += "url=" + elt.href + "&";
texts += "text=" + $(elt).html() + "&";
});
$.ajax({
url: 'favorites.asmx/save',
type: 'POST',
data: { strItems:$(that).sortable("serialize",{key:'item'}), strURLs:urls.substr(0,urls.length - 1), strTexts:texts.substr(0,texts.length - 1) },
error: function(xhr, status, error) {
console.log(xhr.responseText);
},
success: function() {
console.log("Values sent:- strURLs: " + urls.substr(0,urls.length - 1));
}
});
原始问题:
我有以下脚本可以使用,但我不明白:
$.map($(".favorites a"), function(elt) {
urls += "url=" + elt.href + "&";
texts += "text=" + $(elt).html() + "&";
});
我理解此链接中的基本示例:http://api.jquery.com/jQuery.map/,但我不理解上面发布的脚本。
答案 0 :(得分:5)
map
的目的是通过获取传递给它的数组或对象的每个元素来创建一个数组,并通过你给它的函数过滤它们;函数的返回值一起收集到结果数组中,这是map
的返回值。
那段代码没有这样做。它没有从迭代器返回任何东西,也没有使用结果数组。基本上它只是通过滥用map
来重新发明.each
。那个脚本应该是:
$(".favorites a").each(function() {
urls += "url=" + this.href + "&";
texts += "text=" + $(this).html() + "&";
});
(请注意,我假设urls
和texts
已经声明并在您引用的代码之前进行了初始化。)
以下是正确使用map
:
var hrefs = $.map($(".favorites a"), function(elt) {
return elt.href;
});
// hrefs is now an array containing the `href`s of all of the links
答案 1 :(得分:1)
基本上,$ .map遍历现有数组,将其传递给你提供的回调(上面的“函数”),然后它会从你的回调中获取那些新项目并将它们放入品牌打击中 - 新阵列。
答案 2 :(得分:1)
您拥有的代码是从容器中获取所有链接(<a>
标签)并使用名为“favorites”的类并构建两个字符串:一个是链接的目标URL,第二个是文本“inside”每个链接。
从它的外观来看,这两个字符串然后被发送到服务器。
作为T.J.克劳德完美地解释说,你根本不必使用.map()
,它工作的事实并不意味着它是正确的或最佳的做法。
答案 3 :(得分:0)
map()
通过使用在源数组的每个元素上传递给它的函数将数组转换为另一个数组:
var source = [ 1, 2, 3, 4 ];
var result = $.map(source, function(element){
return element.toString() + " Rocks!";
});
// result now contains [ '1 Rocks!', '2 Rocks!', '3 Rocks!', '4 Rocks!' ]
在您显示的用例中,map()
实际上是错误的调用方法,因为没有结果数组(函数不返回任何内容)。这种用法只是使用map()
迭代集合并执行与元素无关的操作。
在这种情况下,您应该使用each()
来简单地遍历源数组并对每个元素执行一些操作。