2015-05-06 72 views
1
<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循环的目的是确保你不会选择与当前相同的图像。如果在当前图像的src属性中找到包含在myImages[newImgNumber]中的字符串,则知道它是相同的,并且您需要获得另一个随机数。您将保持循环,直到获得新图像,此时不会找到myImages[newImgNumber]在现有的弧中,-1将由indexOf()方法返回,从而跳出循环。在Javascript程序中无法理解?

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

+3

这里的每个人都会给出与作者一样的解释。你无法理解哪部分?也许[indexOf()](http://www.w3schools.com/jsref/jsref_indexof.asp)会有所帮助。 – Zee

+0

唉,实际上这里的每个人都会尝试猜测OP发现哪个部分令人困惑。他们中的大多数或全部将浪费他们的时间。 –

回答

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"))将返回0,所以循环将继续,你会得到一个新的随机数。在下一次迭代中,它将是that.src.indexOf("canada.gif"),它将返回-1,因为在“usa.gif”中找不到“canada.gif”,它将返回-1并且它将退出循环。

+0

这个程序可以使用for或者if/else来编写吗?如果是这样,怎么做?这会使它更清晰。 –

0

从的indexOf()上:

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

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

0

你可以看一下数组是这样的:

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

因此,当你0-3之间的随机数,你需要确保在幻灯片你的下一个图片src与当前SRC是不同的所示。

0
  • 它产生其将所述myImages阵列
  • myImages[newImgNumber]在作为索引使用将检索随机检索的图像的相应的名称的随机数, 所以需要此名称,并检查它不” t匹配src属性中的名称。 它通过调用indexOf来完成此操作,该操作返回发现传入的(参数)字符串的上下文字符串中的索引;如果没有找到,则indexOf返回-1。例如strA.indexOf(strB);返回索引strA其中strB存在。
  • 因此,如果indexOf调用的结果不是 -1,那么当前随机检索的图像名称匹配* src属性中的名称。只有当结果 -1这个函数才会认为它们是不同的名称。

while循环可能有点棘手理解,因为它一种处理该问题的后端到前端:它说,只要indexOf方法确实找到随机检索到的名称,然后将其应该随机检索另一个名称并尝试,直到indexOf确实返回-1,这意味着这个随机检索的名称是新的。

如果它是一个新的名称,那么它使它通过while循环,然后它被分配到src属性。

[*]使用indexOf来确定它们是否是相同的图像是非常薄弱的​​。例如,如果调用现有的src属性,比如说“not-usa.gif”,那么上述函数中的条件仍然会指出它与“usa.gif”的名称相同,这显然是错误的。