2013-12-01 3 views
0

Что я пытаюсь сделать, так это получить содержимое определенного тега textarea за определенные клики кнопки, поэтому я думаю, что цикл решит эту проблему. Цикл while на PHP выполняет роль создания имени textarea и кнопки onclick кнопки. Но цикл в javascript не будет работать. Пожалуйста, кто-нибудь поможет, что нужно для выполнения моей задачи? Извините за плохой английский ... Заранее спасибоfunction in while loop

<html> 
    <head> 
    <script> 

    var i = 0; 

    while(i < 2000) 
    { 
     i++; 

     function feedbacks+i() 
     { 
     var feed = document.getElementsByName("feedback"+i)[0].value; 
     alert(feed); 
     } 
    } 

    </script> 
    </head> 

    <body> 

    <?php 

    while($i < 2000) 

    $i++; 
    echo "<textarea name='feedback$i' >you post</textarea>"; 
    echo "<button onclick='feedbacks$i()' >send feedback</button>"; 

    ?> 

    </body> 
    </html> 
+0

Зачем вам нужна страница с 2000 текстовыми областями? Просто интересуюсь. – JAL

+0

Я думаю, что вы хотите, это ОДНА функция, которая принимает аргумент, а не 2000 функций. – jfriend00

ответ

2

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

function feedbacks(index) { 
    var feed = document.getElementsByName("feedback"+index)[0].value; 
    alert(feed); 
} 

и

onclick='feedbacks($i)' 
+0

Я получил это !!! Спасибо, сэр за этот замечательный ответ. Я действительно оценил вас за исправление моих работ. Я просто новичок в javascript, поэтому, пожалуйста, будьте терпеливы ко мне :) Пожалуйста, если я смогу провести время. Пожалуйста, посетите мои другие вопросы, потому что их больше. Мне очень нравится писать коды для наших проектов, и я высоко ценю, если у меня есть ответы. Да благословит Бог: D – AlexJaa

2

Ваш код некорректен, так как вы отметили свой вопрос с Jquery, я хотел бы предложить следующее решение,

$(document).ready(function(){ 
    $(document).on('click','button',function(){ 
    alert($(this).prev('textarea').val()) 
    }); 
}); 

Вы создавая эти элементы textarea и button во время выполнения. Поэтому вам необходимо использовать делегацию inorder для регистрации события click для этих кнопок. Кроме того, вы должны обернуть свой код внутри функции .ready(), что означает, что вам нужно манипулировать DOM только после того, как он будет готов.

Пожалуйста, смотрите здесь для ссылки,

+0

Это мой первый вариант сделать это, сэр. Но, к сожалению, по какой-то причине я не знаю. Но всякий раз, когда я извлекаю некоторую страницу, содержащую данные из базы данных с помощью кнопок или textarea, я не мог хорошо выполнять коды jQuery. Но я действительно оценил вас за исправление моих работ. Я просто новичок в javascript, поэтому, пожалуйста, будьте терпеливы ко мне :) Пожалуйста, если я смогу провести время. Пожалуйста, посетите мои другие вопросы, потому что их больше. Мне очень нравится писать коды для наших проектов, и я высоко ценю, если у меня есть ответы. Да благословит Бог: D – AlexJaa

0

У вас есть две основные проблемы здесь.


Называя вашу функцию

Когда вы называете функцию, вы не можете использовать переменные, только один идентификатор.

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

an_array_i_created_earlier[i] = function() { 
    // etc etc 
} 

Затворы

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

Вы можете обойти это, создав новое закрытие.

function createFunction(i) { 
    return function() { 
     // can use i sanely here because it was passed into a local variable belonging to `createFunction` 
    }; 
} 

an_array_i_created_earlier[i] = createFunction(i); 

Это все очень грязно, хотя. Вы можете забыть о том, что нужно иметь дело с i целиком и выбросить ужасно внутренние атрибуты событий, пока вы на нем.Вместо этого, перемещаться по DOM, чтобы найти элемент:

addEventListener('click', function (evt) { 
    var textarea, t = evt.target; 
    if (t.classList.contains('feedback')) { 
     textarea = t.previousElementSibling; 
     alert(textarea.value); 
    } 
}); 

Обратите внимание, что это использует некоторые довольно недавние дополнения браузера DOM. Если вам нужна совместимость со старыми браузерами (в частности, IE9 и более ранние), вы, вероятно, захотите переписать его, чтобы добавить некоторую поддержку устаревших подходов. Это может помочь библиотека, такая как YUI или jQuery.

+0

Ваши объяснения потрясающие !!! Я могу понять, но не могу полностью понять логику сэра. Пожалуйста, я хочу знать больше. Я очень признателен за то, что вы исправили мои работы. Я просто новичок в javascript, поэтому, пожалуйста, будьте терпеливы ко мне :) Пожалуйста, если я смогу провести время. Пожалуйста, посетите мои другие вопросы, потому что их больше. Мне очень нравится писать коды для наших проектов, и я высоко ценю, если у меня есть ответы. Да благословит Бог: D – AlexJaa

-1

Там какая-то ошибка в коде JavaScript:

  1. Вы пытались определить последовательность функций в цикле, а функция стала локальной функцией для этого цикла. Вы не можете получить доступ к этим функциям вне цикла. Чтобы выполнить эту работу, вы должны определить функцию на объекте window с синтаксисом window["feedbacks1"] = function() {}.
  2. function feedbacks+i() недействительный синтаксис, используйте window['feedbacks' + i], как указано в (1).
  3. Функции, определенные в цикле, будут совместно использовать локальную переменную (замыкание). Переменная в функции feedbacks#{i} будет разделяться одинаково i. После цикла i стал 2001, и все функции, определенные, будут пытаться получить textarea с именем feedbacks2001, что, конечно же, не сработает. Для создания локальной копии общей переменной вам понадобится трюк (function (i) { /* the code using i */ })(i);.

Я сделал a demo on jsFiddle, которые исправляют ошибки. Я показал только 2 текстовых поля. Следующий javascript должен работать для вас в 2000 текстовом поле.

for (var i = 0; i <= 2; ++i) { 
    window["feedbacks" + i] = (function (i) { 
     return function (e) { 
      var feed = document.getElementsByName("feedback"+i)[0].value; 
      alert(feed); 
     }; 
    })(i); 
} 
+0

Точка № 1 неверна. Javascript имеет только область действия, а не область блока, поэтому функция, определенная в цикле, такая же, как функция, определенная в верхней части содержащей функции или содержащей область. Кроме того, я считаю, что лучшим решением будет ОДНА функция, которая принимает аргумент, а не кучу почти идентичных функций. – jfriend00

+0

@ jfriend00 Спасибо за указание. –

+0

Я гость, вы, ребята, правы. хе-хе жаль отсутствие знаний. Я действительно оценил вас за исправление моих работ.Я просто новичок в javascript, поэтому, пожалуйста, будьте терпеливы ко мне :) Пожалуйста, если я смогу провести время. Пожалуйста, посетите мои другие вопросы, потому что их больше. Мне очень нравится писать коды для наших проектов, и я высоко ценю, если у меня есть ответы. Да благословит Бог: D – AlexJaa