2017-07-28 52 views
1

它是從twitter上的挑戰中提取的,你只能用一個twitt的140個角色來製作遊戲。任何人都可以向我解釋這140行字符的代碼?

在代碼段中,dont不能正常工作,但如果將它保存到.html擴展名文件中,它將起作用。

<body onload=d=Date.now,t=d(s=0)><p style="float:left" onclick="(e=d(++s)-t)<15e3?style.margin=e%300+' 0 0 '+e*7%300:alert(s)">X</p></body>

它有一個奇怪的語法...

+0

這只是javascript,這是「縮小/醜化」,所以你不能輕鬆閱讀函數名稱。分解它。在您的控制檯/瀏覽器中測試它。 –

+0

它*確實也能正常工作。這是一個基於時間的功能。點擊X.稍等片刻。再次點擊它。 (如果沒有任何反應,請稍等一會,再次點擊)。 –

+0

這是一種遊戲。要查看您可以在幾秒鐘內點擊X多少次。 –

回答

1

其分解:

<body onload=d=Date.now,t=d(s=0)> 

這只是一個簡單的身體標記與onload事件處理程序。這是JavaScript代碼,將在元素加載後運行。

d=Date.now 

只是保存功能成window.d,哪一個更容易通過d訪問。

t=d(s=0) 

這和做t=Date.now(s=0)一樣。 Date.now不使用任何參數,因此它與做t=Date.now()相同。他只是使用函數調用參數來初始化s0。所以,現在,他有3個變量:

d=Date.now; 
t=Date.now(); //the timestamp when the body loads 
s=0; 

然後有p元素:

<p style="float:left" onclick="(e=d(++s)-t)<15e3?style.margin=e%300+' 0 0 '+e*7%300:alert(s)">X</p> 

其中有一個onclick事件處理程序:

(e=d(++s)-t)<15e3?style.margin=e%300+' 0 0 '+e*7%300:alert(s) 

這僅僅是一個三元表達式(類似於到if/else)。你可以分成三部分。條件,真相表達,虛假表達。

的條件是:

(e=d(++s)-t)<15e3 

15e315000。所以,你必須:

(e=d(++s)-t) < 15000 

第一部分:

(e=d(++s)-t) 

是賦值表達式(返回指定的值)。做d(++s)和做Date.now(++s)一樣。請記住,函數對參數不做任何處理,他只是使用函數調用中的參數來將s增加1。Date.now正在返回右側的時間戳(當您單擊p元素時)。

然後它將該時間戳與以前的時間戳相減(存儲在t中)並將其存儲在e中。 e現在是點擊和物體加載之間的毫秒數。

所以:

(e=d(++s)-t)<15e3 

是毫秒的量與15000進行比較。如果這是不到15秒,真情表達運行,如果是超過15秒假表達式運行。

事實表達是做:

style.margin=e%300+' 0 0 '+e*7%300 

它的p元件周圍走動一個非常簡單的方法。邊界大概是300,所以e%300將返回小於300的餘量。另一個餘量乘以7,因此它們不同。

style.margin的工作原理是事件處理程序以非常特殊的方式被解析。基本上,您可以訪問該元素的任何屬性,就好像它在範圍內一樣。

假表達:

alert(s); 

只是打印的你點擊次數。

它並沒有對我的工作,鉻,直到我說單位:

<body onload=d=Date.now,t=d(s=0)><p style="float:left" onclick="(e=d(++s)-t)<15e3?style.margin=e%300+'px 0 0 '+e*7%300 + 'px':alert(s)">X</p></body>

這是一場遊戲,看多少次,你可以在15秒鐘,然後單擊X。

0

你這裏的片段是HTML裏面包含一些JS。簡化的腳本使用ternary operator而不是通用的if {} else {}聲明。這個代碼的版本可能有助於理解它:

<body onload=d=Date.now,t=d(s=0)> 
    <p style="float:left" onclick="clickFunction()">X</p> 
</body> 

<script> 

    var clickFunction = function() { 

     if((e = d(++s) - t) < 15e3) { 

      style.margin = e % 300 + ' 0 0 ' + e * 7 % 300; 

     } else { 

      alert(s); 

     } 

    } 

</script> 
1

這裏就是我覺得原來的函數名分別爲:

基本上,它檢查,因爲頁面加載多少時間過去了,如果之前點擊添加保證金15秒。我將其更改爲5秒,並添加了紅色而不是邊距。

<body onload="date = Date.now, time = date(clicks = 0)"> 
 
    <p onclick="(elapsed = date(++clicks)-time) < 5000 ? this.style.color='red' : alert('Clicks:'+clicks)"> Click me within 5 seconds. 
 
    </p> 
 
</body>

1

的onload功能:

d只是一個快捷方式Date.now(),每次有調用它會產生不同的結果的時間。該參數不相關的功能以任何方式,Date.now()將產生相同的結果,當與任何參數調用,所以

噸= d(S = 0)

記錄時間,當頁面已加載,並且還將s(點擊次數)設置爲零。

的onclick功能:

此使用簡寫格式

布爾?真情況下:假情況

,所以

(E = d(++ S) - 叔)< 15e3?

e是頁面加載時間和當前時間之間的差異。 ++ s參數也不會影響函數,但會增加記錄的點擊次數。如果此差值小於15e3(即十進制毫秒15000或15秒),則使用「右上方左下角」邊距格式切換

元素的上邊距和左邊距。您會注意到中間的2個數字保持爲0,只有頂部和左側的數字在點擊時發生變化。

邊距的隨機數(0到300之間)是通過取上邊距的時間差並將其除以300(模數),並在對左邊距進行相同的數學計算之前乘以7得到的,數字不一樣,X不會僅對角線移動。

一旦經過了15秒,接下來的下一次點擊就會報警s的值。

+0

'd(s = 0)'的好結果。誰會想到這樣做,以保存一個半列? – Miro

+0

我認爲這是爲了讓人迷惑ppl,沒有意識到他保存了1個字符:) –

相關問題