Jquery 为遍历所有元素的每个函数编写一个可重用的
我的Jquery插件中有以下代码:Jquery 为遍历所有元素的每个函数编写一个可重用的,jquery,jquery-plugins,Jquery,Jquery Plugins,我的Jquery插件中有以下代码: return this.each(function(){ $(this).removeAttr('src'); new_src = generate_src(); $(this).attr('src' , new_src); }); return this.each(function(){ total_images = get_prop($(this)); // this is
return this.each(function(){
$(this).removeAttr('src');
new_src = generate_src();
$(this).attr('src' , new_src);
});
return this.each(function(){
total_images = get_prop($(this)); // this is the new line added , which calls the get_prop function
$(this).removeAttr('src');
new_src = generate_src();
$(this).attr('src' , new_src);
});
现在我有一个函数,它检查数组中是否存在特定的elements src属性,如果不存在,它会将当前的elements src添加到数组中,让我向您展示该函数:
function get_prop(current){
var current_src = current.attr('src');
if ($.inArray(current_src , src_storage) === -1) {
src_storage.push(current_src);
}
return src_storage.length;
}
total_images = get_prop($(this));
var execute_function = function(element , function_name){
element.each(function(){
val = function_name;
});
return val;
}
现在假设我在插件中执行以下操作:
return this.each(function(){
$(this).removeAttr('src');
new_src = generate_src();
$(this).attr('src' , new_src);
});
return this.each(function(){
total_images = get_prop($(this)); // this is the new line added , which calls the get_prop function
$(this).removeAttr('src');
new_src = generate_src();
$(this).attr('src' , new_src);
});
请注意我是如何添加以下行的:
total_images = get_prop($(this));
此方法的问题:
each函数实际上一次遍历每个元素,这意味着当我在each函数中调用以下函数时:
function get_prop(current){
var current_src = current.attr('src');
if ($.inArray(current_src , src_storage) === -1) {
src_storage.push(current_src);
}
return src_storage.length;
}
total_images = get_prop($(this));
var execute_function = function(element , function_name){
element.each(function(){
val = function_name;
});
return val;
}
它将只对当前元素执行,然后继续执行下一组元素,我实际希望它做的是,迭代整个选定元素集,返回计数,然后执行剩余代码集
那么我做了什么:
我采取了以下的方法
this.each(function(){
total_images = get_prop($(this));
});
return this.each(function(){
$(this).removeAttr('src');
new_src = generate_src();
$(this).attr('src' , new_src);
});
// function to check for images that maybe repeated .
function get_prop(current){
var current_src = current.attr('src');
if ($.inArray(current_src , src_storage) === -1) {
src_storage.push(current_src);
}
return src_storage.length;
}
请注意我是如何添加以下代码行的:
this.each(function(){
total_images = get_prop($(this));
});
$(this).callsomefunction();
现在它工作得很好,它做了我想要它做的事,也就是说
为所有选定元素调用get_prop函数。但不知何故,这似乎是一段多余的代码,一点也不整洁,我不确定一个经验丰富的程序员是否会采用这种方法,我对Jquery相当陌生,我真正想要的是,如果我能编写一个函数,它内部有一个遍历所有元素的每个函数,但不知怎的,我就是不知道怎么做 我会尽量让我的答案比我的问题更清楚 首先,我的问题是什么: 我的问题是每个函数,尤其是它一次迭代一个元素。让我给你举个例子:
return this.each(function(){
$(this).callsomefunction();
// call some more functions
// some more set of instructions
});
现在看一下上面的代码,假设我真正想要的是每个函数执行以下代码行:
this.each(function(){
total_images = get_prop($(this));
});
$(this).callsomefunction();
对于所有选定元素,在移动到下一组指令之前。现在我该怎么做
@abhitalks提供了一把小提琴,实际上解决了我的问题:
以下是我的简单版本:
我有以下功能:
function get_prop(current){
var current_src = current.attr('src');
if ($.inArray(current_src , src_storage) === -1) {
src_storage.push(current_src);
}
return src_storage;
}
现在,我想编写一个函数,当调用该函数时,将对所有选定元素执行上述函数
因此,我编写了以下函数:
function get_prop(current){
var current_src = current.attr('src');
if ($.inArray(current_src , src_storage) === -1) {
src_storage.push(current_src);
}
return src_storage.length;
}
total_images = get_prop($(this));
var execute_function = function(element , function_name){
element.each(function(){
val = function_name;
});
return val;
}
现在,在each函数中,我有以下内容:
return this.each(function(){
store_val = execute_function($(this) , get_prop($(this)));
store_val_length = store_val.length;
$(this).removeAttr('src');
new_src = generate_src();
$(this).attr('src' , new_src);
});
因此,代码总体如下所示:
var execute_function = function(element , function_name){
element.each(function(){
val = function_name;
});
return val;
}
return this.each(function(){
store_val = execute_function($(this) , get_prop($(this)));
store_val_length = store_val.length;
$(this).removeAttr('src');
new_src = generate_src();
$(this).attr('src' , new_src);
});
// function to check for images that maybe repeated .
function get_prop(current){
var current_src = current.attr('src');
if ($.inArray(current_src , src_storage) === -1) {
src_storage.push(current_src);
}
return src_storage;
}
为什么这个问题似乎是这个问题的延续:?@abhitalks这个问题值得一个独立的问题吗?我觉得是的,所以我问。我的问题是否足够清楚,如果不清楚,我不介意编辑,而且,我确实有一个解决方案,我会尝试实现,如果成功地在这里分享它作为一个答案,我不期望redy在stackoverflow上生成烘焙代码,总之,我的想法是,编写一个接受2个参数1的函数,要迭代的元素和2,要在迭代的元素上执行的函数,如果听起来含糊不清,请等一会儿,直到我有时间发布我的答案。这很公平。只是想再澄清一下。。(1) 是否要将“generateSource”函数作为参数传递?(2) 你在用“total_images”做什么?您的代码似乎没有使用它。你想从插件返回一个用于主脚本的总数吗?在这里,我为你做了一个:@abhitalks查看我的答案,如果你能更好,请发布一个答案,我将非常乐意接受。:)