2012-01-05 119 views
0

此原型代码的等效JavaScript代码是什么?prototype to javascript

var Confirm = Class.create(); 
Confirm.prototype = { 
     initialize: function(element, message) { 
       this.message = message; 
       Event.observe($(element), 'click', this.doConfirm.bindAsEventListener(this)); 
     }, 

     doConfirm: function(e) { 
       if(! confirm(this.message)) 
         e.stop(); 
     } 
} 
+5

原型是JavaScript的。 – Jeff 2012-01-05 15:16:37

+0

@FelixKling。这个在我最喜欢的酒吧中排名第一。 – 2012-01-05 15:19:03

回答

-1

取决于你想要的抽象程度。最简单的例子:

<button onclick="return confirm('Are you sure?')">something</button> 
+0

@Downvoter:请阅读http://meta.stackexchange.com/a/21086了解为什么评论你的downvotes很重要。 – georg 2012-01-05 15:27:21

+0

我没有让你失望,但我想你错过了很多代码。 'Class.create();'比你的例子做得更多。 – JaredMcAteer 2012-01-05 15:30:22

+0

然后是整个混合标记和代码,建议有人从好的解耦DOM2代码移回DOM0。 – 2012-01-05 15:33:27

2

粗略地说:

var Confirm = (function() 
    function Confirm(element, message) { 
     var self = this; 
     this.message = message; 
     hookEvent(element, "click", function(event) { 
      self.doConfirm(event); 
     }); 
    } 
    Confirm.prototype.doConfirm = Confirm$doConfirm; 
    function Confirm$doConfirm(e) { 
     if (!confirm(this.message)) { 
      if (e.stopPropagation) { 
       e.stopPropagation(); 
      } 
      else { 
       e.cancelBubble = true; 
      } 
      if (e.preventDefault) { 
       e.preventDefault(); 
      } 
      else { 
       e.returnValue = false; 
      } 
     } 
    } 

    return Confirm; 
})(); 

(您可以缩短略有如果你不介意使用匿名函数;我更喜欢help my tools help me通过给函数的名称)

在上面,hookEvent是一个实用函数,您必须提供,要么调用addEventListenerattachEvent(以支持IE8和更早版本),如下所示:

function hookEvent(element, eventName, handler) { 
    // Very quick-and-dirty, recommend using a proper library, 
    // this is just for the purposes of the example. 
    if (typeof element.addEventListener !== "undefined") { 
     element.addEventListener(eventName, handler, false); 
    } 
    else if (typeof element.attachEvent !== "undefined") { 
     element.attachEvent("on" + eventName, function(event) { 
      return handler(event || window.event); 
     }); 
    } 
    else { 
     throw "Browser not supported."; 
    } 
} 

注意跨浏览器兼容性需要多少工作量。您不必使用Prototype,但我强烈建议您使用另一个像样的库,即使不是Prototype,如jQueryYUIClosureany of several others。您将节省lot努力解决跨浏览器差异,并处理利用其他人在这一领域所做的重要工作而提出的边缘案例。

如果你的目标是将关闭的原型,而不是完全动过库,这里是使用jQuery例如同样的事情:使用$().clickhookEvent$.proxy以避免产生一个明确的关闭(仍然

var Confirm = (function() 
    function Confirm(element, message) { 
     this.message = message; 
     $(element).click($.proxy(this.doConfirm, this)); 
    } 
    Confirm.prototype.doConfirm = Confirm$doConfirm; 
    function Confirm$doConfirm(e) { 
     if (!confirm(this.message)) { 
      return false; 
     } 
    } 

    return Confirm; 
})(); 

创建一个,只是在幕后为你做),事实上,在jQuery事件处理程序中,return false与停止传播和阻止默认操作(就像Prototype的stop)一样。您也可以使用stopPropagationpreventDefault,而不用担心浏览器的差异; jQuery为你处理它。大多数图书馆都会

如果你离开Prototype,但仍然想要类似Class功能,here's one,你可以放入你的代码。我在该博客文章中的目标不是取代Prototype的Class(当时我正在使用Prototype),而是解决了我发现Prototype的巨大处理超级调用的低效方式。但是在这样做的时候,一个完整的实现可以替代Class创建。我真的需要更新其中的术语,因为它当然不是关于类(JavaScript没有类),它只是用于JavaScript的原型继承的一些方便的管道工具。

+0

“JavaScript没有类,永远不会” - 对最后一部分小心! es-discuss的某些部分正在推动他们的努力,尽管从我所看到的我不认为他们会进入ES Harmony。 – Domenic 2012-01-05 16:21:13

+0

@Domenic:我在他的[和谐电子邮件](https://mail.mozilla.org/pipermail/es-discuss/2008-August/003400.html)上以Brendan Eich的声明为基础 - 但我声明被误解了! (包,命名空间和早期绑定都很好;可以有宣誓的类放在该列表中,但显然不是。)因此从上面删除了它。 :-) – 2012-01-05 16:28:36

1

(Inb4 Raynos到达与他的pd疯狂。)

function Confirm(element, message) { 
    this.message = message; 

    element.addEventListener("click", this.doConfirm.bind(this), false); 
} 

Confirm.prototype.doConfirm = function (e) { 
    if (!confirm(this.message)) { 
     e.preventDefault(); 
     e.stopPropagation(); 
    } 
}; 
+1

原型的“停止”既有'preventDefault'又有'stopPropagation'。当然,像所有网络用户中的三分之一(比中国更多)使用IE8或更低版本,它们没有'addEventListener'和相关的'preventDefault' /'stopPropagation'。 – 2012-01-05 15:34:51

+0

@ T.J.Crowder感谢您的原型提示。然而,他要求提供JavaScript,而不是向后兼容的JavaScript,所以我会避免沾沾自喜的IE8恶心,并将其留给其他答案... – Domenic 2012-01-05 16:17:52

+0

#dominic:当然,你的电话,但忽略了如此巨大的百分比目前的现实是一个相当大的疏忽。 – 2012-01-05 16:32:54