循环中的函数

时间:2013-12-01 08:19:54

标签: javascript jquery json

我想要做的是在按钮的特定点击中获取特定textarea标签的内容,所以我认为一个循环将解决这个问题。 PHP上的while循环的作用是使textarea的名称不同,按钮的onclick触发器。但是javascript中的循环不起作用。请有人帮忙完成我的任务是什么?抱歉英语不好...提前致谢

    <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>

4 个答案:

答案 0 :(得分:2)

我不确定我的问题是否正确,但为什么不编写一个单独的javascript函数并将索引作为参数传递? 像:

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

onclick='feedbacks($i)'

答案 1 :(得分:2)

您的代码不正确,因为您已使用Jquery标记了您的问题,我想建议以下解决方案,

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

您正在运行时创建这些元素textareabutton,因此您必须使用委托才能为这些按钮注册click事件。此外,您必须将代码包装在.ready()函数中,这意味着您必须在准备好后才操作DOM。

请参阅此处以获取参考资料,

答案 2 :(得分:0)

这里有两个主要问题。


命名您的功能

命名函数时,不能使用变量,只能使用单个标识符。

您可以使用函数表达式,然后稍微分配一下您可以使用变量识别的结果。 e.g。

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这样的库可以帮助解决这个问题。

答案 3 :(得分:-1)

您的JavaScript代码中存在一些错误:

  1. 您试图在循环中定义一系列函数,该函数成为该循环的本地函数。您无法在循环外访问这些函数。为了使这项工作,你应该在window对象上定义函数,语法为window["feedbacks1"] = function () {}
  2. function feedbacks+i()语法无效,请使用window['feedbacks' + i],如(1)中所述。
  3. 循环中定义的函数将共享一些局部变量(闭包)。函数feedbacks#{i}中的变量将共享相同的i。在循环之后,i变为2001并且所有定义的函数将尝试获取名称为feedbacks2001的textarea,这当然不起作用。您将需要(function (i) { /* the code using i */ })(i);技巧来制作共享变量的本地副本。
  4. 我做了a demo on jsFiddle来纠正错误。我只展示了2个textareas。以下javascript应该适用于你2000 textareas案例。

    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);
    }