2010-10-20 2 views
2

В этом коде переменные идентификатора и данных верны в обратном вызове, но я не знаю, как передать вправо i для каждой итерации цикла. Я пробовал читать функции и пробовал как 10 вещей, но, увы, я должен искать мудрость стека.Еще одна проблема с функцией javascript function

function callback() 
{ 
    $(ident).html(data.fields[i].value); 
    $(ident).fadeTo('slow',1); 
} 

for(i=0;i<data.fields.length;i++) 
{ 
    ident='#'+data.rID+'_'+data.fields[i].field; 
    $(ident).fadeTo('slow',0,callback); 
} 

ответ

4

Измените функцию "обратного вызова":

function callback(i) { 
    return function() { 
    $(ident).html(data.fields[i].value); 
    $(ident).fadeTo('slow',1); 
    }; 
} 

Затем в цикле:

$(ident).fadeTo('slow',0,callback(i)); 

Эта реализация "обратного вызова" возвращает функция, которую вы перейдёте к «fadeTo() ».

+0

нужно сделать переменную 'ident' локальной в цикле, чтобы сохранить правильную ссылку .. или изменить ее на' $ (this) 'в обратном вызове –

+0

Я не уверен, что вы имеете в виду Gaby, решение работало отлично написано ^^ – Matt

+0

Кажется, из опубликованного кода «идентификатор» является глобальным или, по крайней мере, относительно глобальным. Разумеется, это действительно может быть передано функции, а также «данные». – Pointy

-1

Вы можете использовать анонимную функцию вместо указателя на callback, так что вы можете передать в i к callback.

function callback(i, elem) 
{ 
    $(elem).html(data.fields[i].value); 
    $(elem).fadeTo('slow',1); 
} 

for(i=0;i<data.fields.length;i++) 
{ 
    var ident='#'+data.rID+'_'+data.fields[i].field; 
    $(ident).fadeTo('slow',0,function() { callback(i, this); }); 
} 

Вместо того, чтобы ident глобальную переменную, было бы лучше, чтобы объявить его (что делает его объем ограничен к текущей функции в), а затем использовать this в функции обратного вызова, чтобы ссылаться на этот элемент.

Если вы не используете callback где-нибудь еще, это может иметь смысл просто поставить его реализацию внутри анонимной функции, а не определять его отдельно и взывает к нему:

for(i=0;i<data.fields.length;i++) 
{ 
    ident='#'+data.rID+'_'+data.fields[i].field; 
    $(ident).fadeTo('slow',0,function() { 
     $(ident).html(data.fields[i].value); 
     $(ident).fadeTo('slow',1); 
    }); 
} 

выше пример с встроенной анонимной функцией не работает, потому что ссылка на i разделяется между обратными вызовами.

+1

Это не сработает. Каждый экземпляр этой функции в конечном итоге ссылается на одно и то же значение «i» (это «data.fields.length»). – Pointy

+1

оба примера неверны. Первый из них, потому что обратный вызов по-прежнему ссылается на глобальную переменную 'ident', а параметр' i' будет таким же. И второй как 'i', так и' ident' будет ошибочным в обратном вызове. –

+0

Спасибо за отзыв. Пример inline определенно неверен (нужно сделать, как @Pointy, и использовать новую функцию, чтобы дать «i» другую область). Я обновил другой, так что 'ident' не является глобальной переменной, вместо этого меняя его, чтобы использовать' this' из обратного вызова. – bdukes

0

Одним из способов было бы объявить функцию обратного вызова в цикле for.

0

Мой первоначальный ответ был некорректным. Благодаря @Pointy для хэдз-ап.

Это похоже на ответ @ Pointy, но имеет другое место для закрытия.

function callback(k) { 
    $(this).html(data.fields[k].value); 
    $(this).fadeTo('slow',1); 
} 

for(i=0;i<data.fields.length;i++) { 
    (function(j) { 
      ident='#'+data.rID+'_'+data.fields[j].field; 
      $(ident).fadeTo('slow',0, function() { callback.call(this, j) }); 
    })(i); 
} 
Смежные вопросы