首页 >web前端 >js教程 >黑客javascript以获取乐趣和利润:第一部分

黑客javascript以获取乐趣和利润:第一部分

William Shakespeare
William Shakespeare原创
2025-03-10 00:29:10353浏览

黑客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