2016-03-21 7 views
0

ЧТО Я ХОЧУ БЫВАЕТjavascript: var i не определен? (Четко определено)

Так что я хочу, так это функция Парта() нажать кнопку [Z] каждые 2 секунды. Кнопка, которую нужно щелкнуть, должна измениться, потому что сценарий представляет собой цикл цикла, например, например. В первом цикле он нажимал кнопку 1, затем кнопку 2, затем кнопку 3, потому что var z = 1 + i ++. Это возможно? z предполагается равным числу 1, плюс номер цикла. Это должен цикл до тех пор, как переменный я меньше 50.

ЧТО ПРОИСХОДИТ

Он работает должным образом, перекручивание и все, если я проверить работу скрипта без переменного г. Однако без переменной z я должен вручную изменить число, которое будет равным z, что является кропотливым и раздражающим.

var z = 1 + i++ 
for(i=0;i<50;i++) { 
    setInterval(partA, 2000); 
    function partA() { 
    buttons = document.getElementsByTagName('button'); 
    document.getElementsByTagName('button')[z].click(); 
    } 
} 

Должен ли i ++ быть определен другим способом? Ошибка я получаю при запуске скрипта в консоли:

Uncaught ReferenceError: i is not defined (...)

at :2:13

at Object.InjectedScript._evaluateOn (:878:140)

at Object.InjectedScript._evaluateAndWrap (:811:34)

at Object.InjectedScript.evaluate (:667:21)

+3

Вот как мы определим variable: 'var i = 0;' (локальная область) или 'i = 0;' (глобальная область) или просто 'var i;' (без начального значения - я предполагаю, что это не то, что вы хотите). Выполнение 'i ++' без определения 'i' ранее всегда приведет к ошибке. – blex

+3

'var z = 1 + i ++' does ** не ** установить долгосрочную динамическую взаимосвязь между 'z' и' i'. Это не означает: «всякий раз, когда я использую' z', рассматривайте его так, как если бы я использовал '1 + i ++'. Это означает: «присваивать' z' вычисленное значение «1 + i ++» прямо сейчас ». – Pointy

+0

@Pointy Будет ли способ создать динамические отношения между ними? –

ответ

0

Почему вы пытаетесь определить г вне цикла? Просто используйте i.

for (var i = 0; i < 50; i++) { 
    ... 
    document.getElementsByTagName('button')[i].click(); 
} 
+0

Это не говорит OP, почему они получили ссылочную ошибку или почему это заставляет ее уйти, а также не устраняет проблему закрытия. Все функции будут пытаться щелкнуть 50-ю кнопку (если только * i * не будет изменен до завершения функции). – RobG

0

без изменения коды слишком много я бы написать это ... вы знаете его циклические 50 раз, вы знаете, я это приращение от 0 до 49, использовать я изменить название кнопки и вы не «т необходимости г ...

для (я = 0; я < 50; я ++) {
    setInterval (Parta, 2000);
    функция Parta() {
        кнопки ('кнопка') = document.getElementsByTagName;
        document.getElementsByTagName ('button') [i + 1] .click();
   }
}

+0

Я уже пытался это сделать, и он, похоже, не работал, я снова повторил ti, и он не работает, поэтому я попытался использовать z. –

+0

Я бы также добавил объявление var перед i в цикле for ... другой мудрый он объявлен глобально и может помешать другим петлям, которые вы пишете, используя переменную i. – zachkadish

1

Там есть несколько предложений, которые я мог бы посоветовать с вашим кодом, так что я буду пытаться решать каждую из них по отдельности.

Сначала определите свою функцию вне вашей петли. Если вы хотите знать причины этого, пожалуйста, прочитайте: Don't make functions within a loop

Во-вторых, вы должны действительно объявить i как переменную, чтобы установить область действия, к которой она применима. Некоторая полезная информация по этому вопросу находится по адресу: Declaring variables without var keyword

В-третьих, при запуске цикла вы можете запустить код внутри IIFE. Причина этого заключается в том, что вы запускаете setInterval, к тому времени, когда он запустится i, на самом деле будет 3 (или последний номер вашего цикла). Это связано с асинхронным характером setInterval и что ссылка на i связана с функцией, а не с значением i.

Пример

for(var i=0;i<3;i++) { 
    (function(i) { 
    setInterval(clickButton(i), 2000); 
    })(i) 
} 

function clickButton(idx) { 
    return function() { 
     buttons = document.getElementsByTagName('button'); 
     document.getElementsByTagName('button')[idx].click();  
    } 
} 

JSBin Demo

http://jsbin.com/harigewuze/edit?html,js,output

0

1) Это, как вы хотите, чтобы ваш код выглядеть следующим образом:

var z; 

for(i=0;i<50;i++) { 
z=i; 
setInterval(partA, 2000); 
} 

function partA() { 
buttons = document.getElementsByTagName('button'); 
document.getElementsByTagName('button')[z].click(); 
} 

2) К сожалению, в javascript у вас есть проблема с этим кодом из-за факта областей. Моя рекомендация - прочесть эту ссылку сначала http://www.mennovanslooten.nl/blog/post/62 и понять, как она работает. Если вы сделали это понять, то большой палец up..you только способствовало себя на более высокий уровень в JavaScript;)

3) Если вы все еще возникают проблемы, разместить его на JSFiddle

+0

Исходная ошибка заключается в том, что * i * не был объявлен или создан иным образом, прежде чем пытаться использовать его в задании. Это также не изменяет проблему закрытия, все функции имеют замыкание на * z *, и когда run будет читать свое последнее присвоенное значение (имя переменной не имеет значения). Не объявлять * i *, или * кнопки *, это не очень хорошая идея. – RobG

+0

Я уже говорил, что в пункте 2 (К сожалению, ...) – Qaddura

+0

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

Смежные вопросы