首頁 > web前端 > js教程 > 黑客javascript以獲取樂趣和利潤:第一部分

黑客javascript以獲取樂趣和利潤:第一部分

William Shakespeare
發布: 2025-03-10 00:29:10
原創
356 人瀏覽過

黑客javascript以獲取樂趣和利潤:第一部分

在過去的幾年中,JavaScript已成為網絡開發和設計經驗的很大一部分。它使我們能夠張開沉悶,靜態的頁面,避免頁面刷新,並完成界面工程的一些驚人壯舉 - 僅使用HTML和CSS而言是不可能的。當然,Ajax和Dom腳本現在被視為工廠的運行,並且是構建網站時每個Web開發人員工具包的一部分。但是我們可以將其推多遠呢?這是一種功能強大的,面向對象的語言,具有豐富的輸出機制,所以我們肯定可以將其用於啟動彈出窗口?

那麼,在面對這樣的問題時,任何自尊心的極客都會做什麼?當然,他們寫了一個2D,側滾動平台遊戲!

在這個兩部分的系列中,您將學習足夠的HTML,CSS和JavaScript,使您能夠構建自己的JavaScript平台遊戲。我在示例中使用了原型JavaScript庫,僅僅是因為這是我所知道的 - 其他許多可用的JavaScript庫很可能具有等效的功能。

>在獲得有趣的東西之前,我們需要瀏覽一些高級JavaScript技術,這將使我們能夠欺騙您的瀏覽器,以為它是一個8位遊戲機。

鑰匙要點

JavaScript javaScript庫簡化了javaScript中的類創建和繼承,從而更容易構建複雜的功能。
    > 儘管語言缺乏對經典的OOP繼承的本機支持,但可以模仿JavaScript的原型繼承以創建成熟的面向對象的模式。
  • >使用JavaScript進行動畫涉及操縱CSS屬性並使用計時器來處理框架更改並確保光滑的視覺過渡。 JavaScript中的事件處理對於交互式應用程序至關重要,該方法由圖書館提供的方法來處理瀏覽器不一致並簡化開發過程。
  • 構建101
  • > JavaScript(JS)是一種面向對象的編程(OOP)語言。這意味著我們可以將構造(例如視頻遊戲角色)表示為代碼中的對象。如果您熟悉一些更傳統的OOP語言,建立JS課程似乎有些奇怪。對於初學者而言,而不是像Ruby中的所有物體一樣,JS中的所有內容都是數據類型。這些數據類型具有內部數據類型(稱為原型),該類型告訴數據類型如何行為。因此,我們需要以這樣的方式定義課程:
    1. 知道這是一個類

    2. >
    3. 可以創建並初始化為定義的初始狀態

    >讓我們看一些構建新類的JS代碼,然後創建一個新對象:>

    // Declare the class <br>
    function WalkingSprite(element, x, y) { <br>
      this.x = x; <br>
      this.y = y; <br>
      this.element = element; <br>
    } <br>
     <br>
    WalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
      <br>
      walk: function(direction) { <br>
        this.x += direction; <br>
      } <br>
    } <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製
    >粗略地瀏覽此代碼,表明我們已經建立了一個名為Walkingsprite的新類,該類別具有三個屬性(元素,x和y)和一個功能,稱為Walk。如果我們

    實例化對象的新版本並將其稱為walk函數,則我們的koopa對象現在將位於坐標點(20,30)。以這種方式聲明類有點麻煩 - 我們必須創建一個類,然後更新原型。值得慶幸的是,原型(庫)已將其封裝到一個名為Class.Create的方便函數中。以上代碼變為以下內容:

    與類繼承一起工作
    var WalkingSprite = Class.create({ <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
     <br>
      initialize: function(element, x, y) { <br>
        this.element = element; <br>
        this.x = x; <br>
        this.y = y; <br>
      }, <br>
     <br>
      walk: function(steps) { <br>
        this.x += steps; <br>
      } <br>
    }); <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製
    OOP的另一個基本組成部分是繼承的概念。基本上,如果您有一個具有某些變量和函數的基類,則所有類別 shartasit sharthit 這些變量和函數。然後,您可以添加其他功能,甚至覆蓋這些功能以做其他功能。這在我們的遊戲中可能真的很有用,因為我們所有的角色都可能表現出一些常見的屬性 - 它們都可以在屏幕上行走 - 但也許只有一種角色可以跳躍。聽起來像是繼承的完美候選人。

    不幸的是,JavaScript本身不支持繼承。那麼,為什麼我浪費了最後一段告訴您的呢?好吧,有了一些騙局,我們可以模仿JavaScript中的類繼承。 因為JavaScript中的所有內容(包括我們類中的功能)都是變量,因此我們可以將它們的值分配給其他變量。因此,如果我們考慮一秒鐘的繼承是什麼,那麼我們要做的就是模仿它,就是將屬性和功能從父類複製為子類。如果我們想從上面創建的班級繼承,我們可以做到這一點:>

    >運行代碼,您將擁有一個新類,該類具有兩個屬性和一個函數的父,以及一個新功能:跳躍。唯一的事情是,這樣的編碼並不能真正擴展; 如果您在父級中添加鴨子功能怎麼辦?您將不得不參加每個孩子課程並添加功能簽名。再次,救援原型!我們以前了解到的班級創建函數可以將另一個類作為其第一個參數。該提供的類將成為父母,它將動態地找到我們所有的屬性和功能,並自動將其註入子類。因此以上將變為:

    >正如預期的那樣,新類具有父類的所有相同屬性!那麼,添加和覆蓋屬性和功能呢?我們在上面說明瞭如何手動執行此操作,但是原型允許我們使用類定義新功能。

    // Declare the class <br>
    function WalkingSprite(element, x, y) { <br>
      this.x = x; <br>
      this.y = y; <br>
      this.element = element; <br>
    } <br>
     <br>
    WalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
      <br>
      walk: function(direction) { <br>
        this.x += direction; <br>
      } <br>
    } <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製

    >在這裡,我們已經覆蓋了步行功能並添加了跳躍功能。等等 - 將卡車向上返回 - $超級可變從哪裡彈出?好問題!使用繼承時,運行父類的函數版本有時很有用。在這種情況下,我們通過將輸入變量加倍並將此新值傳遞給父類,使角色步行最初的要求是最初要求的兩倍。如果您將$ super聲明為函數簽名的第一個參數,則原型將在$ super變量中提供父類版本。這使您可以輕鬆地從覆蓋版本中調用函數的父版本。您會注意到新的跳躍功能沒有$ SUPER變量;我們不使用它,因此我們不需要提供它。如果我們確實需要它,我們可以將其添加為功能簽名的第一個參數。

    >按類名來定義行為

    >現在,我們已經寫了JavaScript類,如果我們可以通過給出特定的類名稱來告訴HTML元素成為Walkingsprite對象,那不是很酷嗎?在JavaScript 1.6中,您可以使用document.getElementByClassName函數輕鬆地找到所有具有特定類名稱的DOM元素。但是,大多數瀏覽器尚不支持1.6版。幸運的是,原型為我們提供了$$函數 - 將其傳遞給CSS選擇器,它將返回所有匹配元素的數組。

    查看以下代碼:

    >
    var WalkingSprite = Class.create({ <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
     <br>
      initialize: function(element, x, y) { <br>
        this.element = element; <br>
        this.x = x; <br>
        this.y = y; <br>
      }, <br>
     <br>
      walk: function(steps) { <br>
        this.x += steps; <br>
      } <br>
    }); <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製

    首先,我們創建Walkingsprite類,然後創建使用Walkingsprite類作為父母的Koopasprite類。接下來,我們通過選擇具有類名稱為“ koopa”的文檔中的所有元素來創建一個koopasprite對象。

    >

    >現在,我們有了一系列的koopasprite對象,並引用了相應的dom元素(稍後會很重要)。我們在這裡所做的是的基礎JavaScript

    。現在,我們已經動態地找到了我們感興趣的HTML元素,我們可以綁定事件(例如OnClick和Onfocus),將它們重新列為或使它們消失!
    製作電影

    >由於我們沒有編寫文本驅動的冒險遊戲,因此我們將需要一種使角色動畫的方法。這超出了它們在屏幕上移動,稍後將覆蓋。如果我們能使角色看起來像是走路,跳躍或躲避,那也將是一件好事。為此,我們將調用一個舊的CSS技巧:背景位置黑客。

    這個想法很簡單:我們構建了構成動畫框架的圖像的色帶,然後通過將它們左右移動來循環它們,然後將它們左右移動。這是一個示例背景圖像:

    黑客javascript以獲取樂趣和利潤:第一部分

    如您所見,我們在一個圖像中有12幀,每個圖像相距48個像素。如果我們有一個馬里奧級別的div,則某些不同框架的CSS可能看起來像:

    // Declare the class <br>
    function WalkingSprite(element, x, y) { <br>
      this.x = x; <br>
      this.y = y; <br>
      this.element = element; <br>
    } <br>
     <br>
    WalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
      <br>
      walk: function(direction) { <br>
        this.x += direction; <br>
      } <br>
    } <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製

    >您可能在創建無閃爍的翻車之前就已經看到了這種技術。回到過去,您將使用一小部分JavaScript創建圖像翻轉效果,該javaScript在發射時更改圖像標籤的SRC值。然而,您第一次這樣做時,瀏覽器仍然需要從服務器下載圖像,這通常會引起閃爍。可以預緊圖像,但這一切都有些笨拙。上級CSS技術使設計人員可以將所有翻轉狀態加載到一個圖像中,並使用:懸停偽級創建單獨的CSS規則以移動背景,從而在沒有JavaScript的情況下進行平滑的過渡。

    不過,在我們的遊戲引擎中,我們將使用JavaScript更改背景圖像的位置。要在JS中設置背景位置,您可以操縱元素的樣式。 backgroundPosition屬性。以下代碼創建了一個名為Mariosprite的新類,該類別為Parent Walkingsprite類添加了渲染函數。此新功能隨著時間延遲而反複調用,並將使用兩個幀進行動畫行走:>

    var WalkingSprite = Class.create({ <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
     <br>
      initialize: function(element, x, y) { <br>
        this.element = element; <br>
        this.x = x; <br>
        this.y = y; <br>
      }, <br>
     <br>
      walk: function(steps) { <br>
        this.x += steps; <br>
      } <br>
    }); <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製

    使用計時器

    >顯然,如果整個遊戲中沒有反複調用渲染函數,則毫無用處。為了確保它每秒發射幾次,我們需要使用JavaScript計時器。有兩種類型的計時器:一個計時器到期後會發射一次,另一種將在我們告訴我們停止之前反復發射
    > t

    毫秒。我們將使用setInterval函數來實現後者:> 這將使馬里奧每秒兩次(500毫秒等於半秒)。因為SetInterval需要一個函數作為其第一個參數,因此我們需要創建一個匿名函數來調用Mario.render函數。

    // Declare the class <br>
    function WalkingSprite(element, x, y) { <br>
      this.x = x; <br>
      this.y = y; <br>
      this.element = element; <br>
    } <br>
     <br>
    WalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
      <br>
      walk: function(direction) { <br>
        this.x += direction; <br>
      } <br>
    } <br>
     <br>
    // Create the child class <br>
    JumpingAndWalkingSprite = WalkingSprite; <br>
    JumpingAndWalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      walk: WalkingSprite.prototype.walk <br>
      jump: function() { <br>
        y += 20; <br>
      } <br>
    }
    登入後複製
    登入後複製
    >可能值得解釋JS的限制,該限制將稍後再咬住我們:JavaScript不是多線程。這意味著無法同時獲得兩個代碼塊。您可以通過設置一個毫秒間隔的單發計時器來中斷

    另一個代碼,這將迫使您的瀏覽器在下一個機會中運行回調函數,但是中斷的代碼將停止,並且不會繼續執行直到中斷函數。因此,將計時器設置為每毫秒射擊,並不保證您的功能會很快被調用。當我談論循環時,我們將看到這一點。

    >允許用戶輸入
    顯然,遊戲需要某種人類輸入,無論是通過鍵盤,鼠標還是操縱桿。因此,要使我們的遊戲成為現場運行的固定精靈,我們將需要回應用戶的投入。在JavaScript中,這稱為

    >事件偵聽 有兩種不同的事件模型,具體取決於您擁有的瀏覽器的風味(驚喜,驚喜),儘管原型在封裝了兩者的細微差別方面也做得非常出色,但值得知道知道引擎蓋下發生了什麼。

    泡泡
    >您可以選擇事件是否通過DOM向下移動到發射的元素(事件捕獲),從元素(事件起泡)或兩者的組合(官方W3C模型)。以下是發生的事情的圖形表示。您在Internet Explorer Land中的那些人被活動冒泡,而其他瀏覽器則支持這兩者。

    如果您已經使用網絡玩了一段時間,則可能會使用諸如OnMouseover或OnClick之類的屬性熟悉內聯事件處理。該技術等同於在CSS中使用樣式屬性 - 這是邪惡的,不要做。值得慶幸的是,有幾種方法可以將事件動態綁定到JavaScript中的元素。考慮以下代碼:

    >

    // Declare the class <br>
    function WalkingSprite(element, x, y) { <br>
      this.x = x; <br>
      this.y = y; <br>
      this.element = element; <br>
    } <br>
     <br>
    WalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
      <br>
      walk: function(direction) { <br>
        this.x += direction; <br>
      } <br>
    } <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製
    >在這裡,我們有三種將事件連接到DOM中的元素的不同方法。第一個使用AddEventListener是W3C標準做事的標準方式。第一個參數是事件的名稱,第二個參數是回調函數的名稱,第三個是布爾值,它指示我們是捕獲(false)還是冒泡(true)。第二個是使用actactevent - 是Internet Explorer的方式;它與W3C版本基本相同,而沒有第三個參數,因為IE僅支持事件冒泡。最後一個(使用元素的OnClick屬性)是一種在所有瀏覽器中都起作用的方法。

    > MouseOver和Mouseout之類的事件非常簡單,但是鍵盤事件更為複雜,因為我們需要知道按下哪個鍵。在這種情況下,我們必須從JavaScript事件對象獲取信息;事件對像要麼傳遞到回調函數中,要么如果您在IE Land中,則在窗口對像中創建一個全局事件對象:window.event,它具有我們需要的信息。

    這是一個示例:

    var WalkingSprite = Class.create({ <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
     <br>
      initialize: function(element, x, y) { <br>
        this.element = element; <br>
        this.x = x; <br>
        this.y = y; <br>
      }, <br>
     <br>
      walk: function(steps) { <br>
        this.x += steps; <br>
      } <br>
    }); <br>
     <br>
    koopa = new WalkingSprite(null, 10, 10); <br>
    koopa.walk(20); <br>
    alert(koopa.x + "," + koopa.y);
    登入後複製
    登入後複製
    登入後複製
    登入後複製
    // Declare the class <br>
    function WalkingSprite(element, x, y) { <br>
      this.x = x; <br>
      this.y = y; <br>
      this.element = element; <br>
    } <br>
     <br>
    WalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      element: null, <br>
      <br>
      walk: function(direction) { <br>
        this.x += direction; <br>
      } <br>
    } <br>
     <br>
    // Create the child class <br>
    JumpingAndWalkingSprite = WalkingSprite; <br>
    JumpingAndWalkingSprite.prototype = { <br>
      x: 0, <br>
      y: 0, <br>
      walk: WalkingSprite.prototype.walk <br>
      jump: function() { <br>
        y += 20; <br>
      } <br>
    }
    登入後複製
    登入後複製
    var JumpingAndWalkingSprite = Class.create(WalkingSprite); <br>
     <br>
    mario = new JumpingAndWalkingSprite(null, 10, 10); <br>
    mario.walk(10): <br>
    alert(mario.x + "," + mario.y); <br>
    mario.jump(); <br>
    alert(mario.x + "," + mario.y); <br>
    
    登入後複製
    >使用Event.Observe設置我們的事件處理程序允許我們丟棄有條件的測試,該測試檢查我們是否通過函數參數或窗口事件具有事件對象。 這一切都是由原型對我們無縫處理的。

    結論
    在這一點上,我們已經探索了JavaScript對象和類(包括諸如繼承之類的OOP概念),如何使用JavaScript和CSS類來提供元素行為,如何使用計時器允許我們重複執行任務(例如動畫)以及聆聽事件的基礎。這為我們提供了足夠的JavaScript在我們的工具箱中,以使我們能夠建立平台遊戲的核心。在下一篇文章中,我將介紹創建基本的碰撞引擎(動畫循環),並向您展示一些滾動瀏覽器窗口的技巧,以獲得80年代的正宗側面滾動效果。

    同時,請查看將上述理論付諸實踐的演示(提示:按箭頭鍵,看看會發生什麼)。您可以下載本文的代碼存檔 - 查看是否可以自己擴展,因為您需要了解本系列第二篇文章的情況。直到下一次……

    >關於JavaScript的娛樂和利潤

    的經常詢問問題

    > JavaScript在道德黑客攻擊中有哪些實際應用?它可用於執行跨站點腳本(XSS)攻擊,黑客將惡意腳本注入受信任的網站。 JavaScript也可以用於網站刮擦,從網站提取數據。此外,它可用於創建用於自動化任務的機器人,並執行各種類型的滲透測試。

    >

    >我如何使用JavaScript進行網站刮擦?

    網站與JavaScript進行刮擦涉及使用Node.js和諸如PuppeTeer和Cheerio之類的工具。這些工具使您可以自動訪問網頁,與其元素進行交互並提取所需數據的過程。這對於從不提供API或自動化重複任務的網站收集信息可能很有用。

    >

    什麼是跨站點腳本(XSS),以及如何在此類攻擊中使用JavaScript?

    cross-site Scipting(xss)是一種在網絡應用程序中典型發現的安全性漏洞。 XSS攻擊使攻擊者能夠將客戶端腳本注入其他用戶查看的網頁。攻擊者可以使用跨站點的腳本漏洞繞過訪問控件,例如相同的原始策略。 JavaScript通常在XSS攻擊中使用,因為它由Web瀏覽器廣泛支持,並且可以有效地操縱網頁內容。

    >如何保護我的網站免受基於JavaScript的攻擊?

    >有幾種保護您的網站免受基於JavaScript的攻擊的方法。最有效的方法之一是輸入驗證,您可以在其中檢查和對網站的所有用戶輸入進行消毒。另一種方法是輸出編碼,您可以在網站上牢固地顯示任何用戶提供的數據。您還可以使用僅HTTP的cookie來防止跨站點腳本(XSS)攻擊。

    可以使用JavaScript來創建bot?是的,可以使用JavaScript來創建bot。使用Node.js(JavaScript運行時)構建在Chrome的V8 JavaScript引擎上,您可以構建服務器端應用程序,包括bot。 Libraries like Puppeteer can be used to automate browser tasks, while others like Discord.js can be used to interact with APIs and create bots for platforms like Discord.

    What is penetration testing and how can JavaScript assist in it?

    Penetration testing, also known as pen testing or ethical hacking, is the practice of testing a computer system, network, or web application to find security攻擊者可能利用的漏洞。 JavaScript可以通過自動執行任務,執行XSS攻擊並利用其他基於JavaScript的漏洞來協助滲透測試。

    >

    >我如何學習道德黑客的JavaScript?

    ​​

    在線有許多資源可以在線學習Javascript以了解道德黑客。 Codecademy,Udemy和Coursera等網站提供有關JavaScript和道德黑客的課程。此外,諸如“ Web Application Hacker's Handbook”和“ JavaScript:The Good Parts”之類的書籍可能非常有用。

    JavaScript是唯一用於倫理hacking的語言嗎?

    不,javascript,javaScript不是唯一在倫理hackakic中使用的語言。 python,Ruby和PHP等其他語言也常用。 However, JavaScript is particularly useful for web-based attacks due to its ubiquity on the web.

    What are some common JavaScript libraries used in ethical hacking?

    Some common JavaScript libraries used in ethical hacking include Node.js for server-side scripting, Puppeteer for browser automation, and Cheerio for web scraping.其他庫(例如Express.js和socket.io)也分別用於構建Web應用程序和實時應用程序。

    >

    我可以使用JavaScript使用JavaScript無需任何事先編程經驗嗎?

    >>

    >> ,儘管可能會學習JavaScript並將其用於無需任何事先的編程經驗,而沒有任何事先的編程經驗,它可以進行任何概念,因此可以概念地理解。這將使您更容易理解不同的攻擊如何工作以及如何有效使用JavaScript。

以上是黑客javascript以獲取樂趣和利潤:第一部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板