2011-12-19 9 views
0

У меня есть серия массивов, которые содержат слова, которые я хочу использовать в виде текста в различных HTML-div (их около 35, для краткости я включил только несколько).Как ссылаться на массив в аргументе функции

var bodyplan = ['Anguilliform', 'Compressiform', 'Depressiform', 'Filiform', 'Fusiform', 'Globiform', 'Sagittiform', 'Taeniform']; 

var mouthposition = ["Inferior", "Jawless", "Subterminal", "Superior", "Terminal"]; 

var barbels = ['1', '2', '4 or more']; 

var caudalshape = ['Continuous', 'Emarginate', 'Forked', 'Lunate', 'Rounded', 'Truncate']; 

У меня есть функция переключения, которая, как предполагается, чтобы изменить текст на основе выбора пользователя:

switch(n){ 
      case 1: 
      changelabels(bodyplan, 8); 
      break; 
      case 2: 
      changelabels(mouthposition, 5); 
      break; 
      case 3: 
      changelabels(barbels, 3); 
      break; 
      case 4: 
      changelabels(caudalshape, 6); 
      break; 
      case 5: 
      changelabels(dorsalspines, 8); 
      break; 
      default: 
      alert("handquestsel error")}}; 

Наконец, у меня есть функция, которую я хотел бы внести изменения (за исключением Безразлично» т):

function changelabels(opt1,opt2){ 
    var i = opt2; 
    var im = opt2 - 1; 
    var c = 1; 
    var index = 0; 
    while (i>=c){ 
     var oldlbl = document.getElementById("rb" + c + "lbl"); 
     var newlbla = opt1.slice(im,i); 
     var newlblb = opt1.toString(); 
     oldlbl.innerHTML = newlblb; 
     c = c + 1 
     index = index + 1 
}}; 

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

EDIT: Я хочу, чтобы оператор switch вызывал функцию и передавал функцию, соответствующий массив, из которого можно вытащить метки. Цель приложения - помочь пользователю научиться идентифицировать рыбу. Когда пользователь делает выбор на странице, будет показана серия изображений для различных состояний символов с сопроводительной меткой, описывающей состояние. Например, когда пользователь выбирает Позиция рта, серия divs будет показывать разные позиции рта, которые есть у рыб, и иметь надпись под изображением, чтобы сообщить пользователю, что называется определенным статусом символа. Я могу получить фотографии, чтобы они менялись просто отлично, но у меня есть ад с ярлыками.

+1

«но я так много раз менял его, что я не уверен, что происходит дальше», вот когда вы встаете со своего стола, четыре раза ходите по зданию и возвращайтесь к нему. –

+0

Какова ваша конечная цель? Придание этой четкости может помочь нам определить лучшее решение. – JesseBuesking

+0

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

ответ

0

Если я правильно читаю ваши требования и код, в инструкции switch вы передаете как ссылку на соответствующий массив, так и ожидаемую длину этого массива - вам не нужен второй параметр, потому что все массивы JavaScript имеют .length property ,

Вы не хотите использовать .slice(), чтобы получить отдельные значения из массива, потому что возвращает новый массив, скопированный из оригинала - просто использовать arrayVariable[index], чтобы получить отдельный элемент в index.

Так, полагая, что вместе попробовать что-то вроде этого (с существующими определениями массива):

switch(n){ 
    case 1: 
     changelabels(bodyplan); 
     break; 
    case 2: 
     changelabels(mouthposition); 
    // etc. 
} 

function changelabels(data) { 
    var i, 
     lbl; 

    for (i = 0; i < data.length; i++) { 
     lbl = document.getElementById("rb" + (i+1) + "lbl"); 
     lbl.innerHTML = data[i]; 
    } 
} 

Обратите внимание, насколько проще, которое, чем ваш код? Я предполагаю, что элементы, которые вы обновляете, имеют идентификатор в формате «rb1lbl», «rb2lbl» и т. Д. С нумерацией, начиная с 1: я получаю эти идентификаторы с помощью (i + 1), потому что индексы массива JavaScript начинаются с нуль. Обратите также внимание на то, что вам даже не нужна переменная lbl: вы можете просто сказать document.getElementById("rb" + (i+1) + "lbl").innerHTML = data[i] - однако я ее оставил, чтобы у нас было что-то, чтобы расшириться ниже ...

В вашей функции вы, кажется, меняетесь метки на наборе элементов (метки радиокнопки?), по одному на каждое значение в массиве, но вы останавливаетесь, когда у вас заканчиваются элементы массива, что означает, что любые оставшиеся элементы будут по-прежнему удерживать значения из предыдущего выбора (например, если предыдущий выбор был «bodyplan» с 8 вариантами, и вы переходите на «востановление» только с 5 - вы, вероятно, должны скрыть 3 оставшихся элемента, которые в противном случае продолжали бы отображать последние несколько элементов «bodyplan». Один из способов сделать это вместо установив петлю на основе длины массива, которую вы могли бы перебрать по элементам, и если текущий элемент имеет индекс за пределами массива hi де ней, что-то вроде этого:

function changelabels(data) { 
    var i, 
     lbl, 
     elementCount = 20; // or whatever your element count is 

    for (i = 0; i < elementCount; i++) { 
     lbl = document.getElementById("rb" + (i+1) + "lbl"); 
     if (i < data.length) { 
     lbl.innerHTML = data[i]; 
     lbl.style.display = ""; 
     } else { 
     lbl.innerHTML = ""; 
     lbl.style.display = "none"; 
     } 
    } 
} 

Если эти элементы этикетки для радиокнопок (только предположение на основе идентификаторов), то вы также хотите, чтобы скрыть или показать соответствующие кнопки радио, но я надеюсь, что вы может выяснить, как добавить пару строк к выше, чтобы сделать это.

(Как уже упоминалось выше, будьте осторожны, о том, идентификаторам элементов подсчитывать от 1, когда индексы массива начинаются с 0.)

Если выше не работает, пожалуйста, должность (по крайней мере, некоторые из) соответствующего HTML - Очевидно, мне просто нужно было догадаться, каково это.

+0

Спасибо всем за ответ. Я собираюсь попробовать эти вещи сегодня, и я опубликую результаты. Если я не смогу заставить его работать, я просто собираюсь изменить код и перейти дальше. – WyoBuckeye

+0

Я принял ваши предложения. Массивы по-прежнему недоступны. Я могу заставить оператор innerHTML сменить метку непосредственно на строку. Пример: 'document.getElementById ("rb" + (i + 1) + "lbl"). InnerHTML = "string"'. Но если я попытаюсь обратиться к массиву «.... innerHTML = bodyplan [i]», это не сработает. По какой-то причине я не могу получить доступ к массиву, и я буду проклят, если я знаю почему. программирование, но то, что я пытаюсь сделать, не очень сложно. У меня было немного проблем с чем-либо до этого, и у меня есть страницы кода, написанные для этого. Но эта одна часть, где я пытаюсь получить доступ к массиву, падает. – WyoBuckeye

+0

Мои подозрения проблемы с областью действия были подтверждены. Я переместил массив в функцию метки заметок, и все сработало нормально. По какой-то причине глобальные переменные, которые я объявлял в верхней части страницы, на самом деле не являются глобальными. Я понятия не имею, почему это случай, но. – WyoBuckeye

-1

Я не понимаю, что вы пытаетесь достичь именно с помощью своего кода. Но для передачи переменной (в данном случае массива) по ссылке вам просто нужно добавить «&» перед переменной.

function the_name(&$var_by_ref, $var_by_value) { 
// Here if you modify $var_by_ref this will change the variable passed to the function. 
} 

Подробнее: http://php.net/manual/en/language.references.pass.php

Надежда, что помогает.

+1

В JavaScript массивы всегда передаются по ссылке, потому что это объект. Проход по ссылочному индикатору '&' не существует. – Halcyon

+0

Это не помогло, но спасибо. – WyoBuckeye

1

Почему не просто что-то вдоль линий:

document.getElementById("bodyplan_label").innerHTML = bodyplan[bodyplan_index]; 

Вы, кажется, пытается поставить все на самом деле абстрактные структуры данных, я не вижу причин для. Просто держите это просто.

bodyplan Также имеет только 8 элементов, так bodyplan[8] даст вам out of bounds exception, потому что массивы начинаются 0 как это принято во всех современных языках программирования.

+0

Я пробовал это. Кажется, что проблема связана с доступом к массивам. Например, если я сделаю это заявление: document.getElementById ("bodyplan_label"). InnerHTML = "bodyplan [bodyplan_index]"; метки заменяются на строку внутри двойных кавычек. Но когда я забираю цитаты и стараюсь, ничего не происходит. Заявление работает для изменения метки. Однако, только если я даю ему строку, чтобы изменить ее. Я проверил объявления массива, чтобы убедиться, что использую правильный синтаксис, но они просто не доступны. – WyoBuckeye

+0

Мои подозрения в проблеме с областью действия были подтверждены. Я переместил массив в функцию метки заметок, и все сработало нормально. По какой-то причине глобальные переменные, которые я объявил в верхней части страницы, на самом деле не являются глобальными.Я понятия не имею, почему это так. – WyoBuckeye

+0

'" bodyplan [bodyplan_index] "' означает фактическую строку _bodyplan [bodyplan_index] _, 'bodyplan [bodyplan_index]' означает значение в позиции 'bodyplan_index' массива' bodyplan' – Halcyon

0

РЕШЕНИЕ: Изменен масштаб переменных массива на локальный, перемещая их в функцию, в которой они используются, вместо того, чтобы иметь их в качестве глобальных переменных в верхней части страницы. Я не понимаю, как я выполнял каждое правило объявления переменных. Но по какой-то неизвестной причине глобальные переменные в javascript отвратительны.

Решение Изменить: обнаружена ошибка при объявлении моих глобальных переменных. Возможно, это послужило источником моей проблемы, почему я не смог получить к ним доступ. Но на данный момент это не проблема, так как я исправил свой код.

+0

Это хорошая практика программирования на любом языке, чтобы свести глобалы к минимуму, но это вопрос организации и модуляции, а не способ избежать ненадежной части языка. ** Globals _do_ работают в JavaScript ** - в этом нет никакого трюка. Конечно, я рад, что вы заработали свою программу, но, должно быть, было что-то еще неправильно, чтобы остановить ее работу. Я подозреваю, что ваша «неизвестная причина», вероятно, может быть объяснена более опытными сценаристами здесь, если бы мы могли видеть весь ваш код в контексте - возможно, вы могли бы вставить его на http://jsbin.com. – nnnnnn

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