while循环内部的函数

function inside while loop

本文关键字:函数 内部 循环 while      更新时间:2023-12-27

我想做的是通过特定的按钮点击来获取特定textarea标签的内容,所以我认为循环可以解决这个问题。PHP上的while循环的作用是使文本区域的名称和按钮的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>

我不确定我是否答对了你的问题,但为什么不写一个javascript函数并将索引作为参数传递呢?类似:

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

onclick='feedbacks($i)'

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

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

您正在运行时创建这些元素textareabutton,因此必须使用委派来注册这些按钮的单击事件。此外,您必须将代码封装在.ready()函数中,这意味着您必须在DOM准备好之后才能对其进行操作。

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

  • .on(代表团)
  • .ready()
  • .prve()

这里有两个主要问题。


命名您的函数

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

您可以使用一个函数表达式,然后在某种程度上分配结果,您可以用变量来标识该结果。例如

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,并在处理时抛出可怕的内在事件属性

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

请注意,这使用了一些最近添加到浏览器DOM中的内容。如果您希望与旧浏览器(尤其是IE9和更早版本)兼容,那么您可能需要重写它,以添加对遗留方法的一些支持。像YUI或jQuery这样的库可以帮助实现这一点。

您的JavaScript代码中有一些错误:

  1. 您试图在循环中定义一系列函数,该函数成为该循环的局部函数。您无法在循环之外访问这些函数。为了实现这一点,您应该在window对象上定义函数,语法为window["feedbacks1"] = function () {}
  2. function feedbacks+i()是无效语法,请使用window['feedbacks' + i],如(1)所示
  3. 循环中定义的函数将共享一些局部变量(闭包)。函数feedbacks#{i}中的变量将共享相同的i。循环之后,i变成了2001,所有定义的函数都将尝试获得名为feedbacks2001的文本区域,这当然不会起作用。您将需要(function (i) { /* the code using i */ })(i);技巧来制作共享变量的本地副本

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