在Javascript程序中无法理解?

时间:2015-05-06 12:32:00

标签: javascript events while-loop

<html lang="en">
    <head>
        <title>Chapter 10: Example 1</title>
    </head>
    <body>
        <img src="usa.gif" onclick="changeImg(this)" />
        <img src="mexico.gif" onclick="changeImg(this)" />
        <script>
            var myImages = [
                "usa.gif",
                "canada.gif",
                "jamaica.gif",
                "mexico.gif"
            ];

            function changeImg(that) {
                var newImgNumber = Math.round(Math.random() * 3);
                while (that.src.indexOf(myImages[newImgNumber]) != -1) {
                    newImgNumber = Math.round(Math.random() * 3);
                }
                that.src = myImages[newImgNumber];
            }
        </script>
</body>
</html>

该程序的作者在代码的解释中说: while循环的目的是确保您不选择与当前图像相同的图像。如果myImages[newImgNumber]中包含的字符串在当前图像的src属性中找到,那么您知道它是相同的,并且您需要获取另一个随机数。您将继续循环直到获得新图像,此时在现有弧中找不到myImages[newImgNumber]indexOf()方法将返回-1,从而突破循环。

我根本无法得到解释。换句话说,任何人都可以用同样的方式解释我吗?代码来自Beginning Javascript 5e,Jeremy Mcpeak,Chapter Events。

4 个答案:

答案 0 :(得分:1)

Math.random() * 3给出0到3之间的数字。myImages[newImgNumber]给出数组中某个图像名称的名称。例如,如果您致电changeImg(myImg)且myImg为<img src="usa.gif" />,则函数that.src内的"usa.gif"that.src.indexOf("usa.gif")"usa.gif".indexOf("usa.gif")that.src.indexOf("canada.gif"))将返回0,所以循环将继续,你将得到一个新的随机数。在下一次迭代中,它将是<?php public function getData($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_COOKIE, 'token=' . $this->token); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch); $res = json_decode($result); curl_close($ch); // sidenote: Always check, if json_decode was successful, it can return false on failure if ( $res !== null ) { // you get an array of objects, not an object, see your json input echo $result[0]->{'id'}; } //print_r($result); } ,它将返回-1,因为&#34; canada.gif&#34;在&#34; usa.gif&#34;中找不到,它将返回-1,它将退出循环。

答案 1 :(得分:0)

来自W3Schools上的indexOf():

  

如果要搜索的值永远不会发生,则此方法返回-1。

循环继续,直到找到有效的newImgNumber(索引)。

答案 2 :(得分:0)

您可以像这样查看数组:

myImages[0] = "usa.gif";
myImages[1] = "canada.gif";
myImages[2] = "jamaica.gif";
myImages[3] = "mexico.gif";

因此,当您获得0-3之间的随机数时,您需要确保幻灯片中的下一个图像src与当前显示的src不同。

答案 3 :(得分:0)

  • 它生成一个随机数,它将用作myImages数组
  • 中的索引
  • myImages[newImgNumber]将检索随机检索图像的相应名称, 所以它采用此名称并检查它是否与src属性中的名称不匹配。 它通过调用indexOf来执行此操作,该indexOf返回在找到传入(参数)字符串的上下文字符串中的索引;如果没有找到,则strA.indexOf(strB);返回-1。例如,indexOf返回 strA 中的索引,其中 strB 存在。
  • 因此,如果src调用的结果不是 -1,则当前随机检索的图像名称与while属性中的名称匹配。仅当结果 -1时,此函数才会将它们视为不同的名称。

indexOf循环可能有点难以理解,因为它可以从头到尾解决问题:只要indexOf方法找到随机检索的名称,然后它应该随机检索另一个名称并尝试直到while 返回-1,这意味着这个随机检索的名称是新的。

如果它是一个新名称,那么它会使它超过src循环,然后将其分配给indexOf属性。

[*]使用src确定它们是否是相同的图像非常弱。例如,如果调用现有的baseWindow.GroupsStackPanel.Dispatcher.BeginInvoke(() => { //You Code Here baseWindow.GroupsStackPanel.Children.Add(i); }); 属性,例如“not-usa.gif”,则上述函数中的条件仍然表示它与“usa.gif”的名称相同,这显然是错误的