我正在构建一个 MooTools 类,我的初始化函数中有这个:
this.css = null;
window.addEvent('domready', function(){
this.document = $(document);
this.body = $(document.body);
this.head = $(document.head);
}.bind(this));
好的,现在开始提问... 我应该在 init 中声明 this.css = null 还是任何其他空变量:
this.css = null; // Maybe this.css = '' - empty string?
接下来是关于窗口和文档...我是否应该将其放入 $() 中,因为它可以双向工作,所以我只想知道首选哪种方式?总结一下:
window.addEvent() // or should I use $(window).addEvent()
this.document = $(document) // or this.document = document
this.body = $(document.body) // or this.body = document.body
我将这些值存储到对象中以避免多次 DOM 查询,这样可以吗?或者每次调用 $(selector)/$$(selector) 会更好吗?
还有两件事......关于绑定(bind)......每次都使用 .bind(this) 是可以的还是使用 .bind(this.myDiv) 并在函数内部使用它会更好,例如: this.setStyle(...);而不是 this.myDiv.setStyle(...)
(function(){
this.setStyle('overflow-y', 'visible');
}.bind(this.body)).delay(100);
或
(function(){
this.body.setStyle('overflow-y', 'visible');
}.bind(this)).delay(100);
最后一件事是关于垃圾收集的……我是否必须自己处理垃圾以及如何处理(据我所知,MooTools 会在卸载时自行处理)。令人困惑的部分是我在 MT 文档中找到了函数:
myElement.destroy();
他们说:清空一个元素的所有子元素,删除元素并将其作为垃圾处理。在 pageUnload 之前清除内存很有用。
所以我必须自己倒垃圾?怎么做?什么时候使用 .destroy()?我正在处理一个大型项目,我注意到 IE 在多次执行脚本时变慢(那么如何处理?可能需要一些清理,内存泄漏?)。
最佳答案
噗,有点长
首先,初始变量。 this.css = null...我唯一一次设置“空”变量是:typecast;当它是一个对象的属性时,我可能会引用并且不希望未定义;当它是一个字符串时,我将与之连接,或者是一个数字,我将增加/减少; null 在这一点上并不是很有用。
编写 mootools 类时的一个常见/好的做法是使用 Options 类作为混合。这允许您使用可以在实例化时覆盖的默认设置来设置默认选项对象。类似地,Object.merge({ var: val}, useroptions); 可以覆盖提供的默认值。
现在,iirc,有时您必须使用 $(document.body) 这不是因为 document.body 不起作用,而是因为应用 $() 还在 IE 中应用 Element 原型(prototype)(因为 Element 原型(prototype)没有在那里扩展,这些方法直接应用于元素,当你 $ 它们时会发生这种情况)。此外,$ 分配目标元素的内部 UID 并允许元素存储用于该元素。我看不到使用 $(document) 或 $(window) 的意义 - 默认情况下,它们会根据需要“扩展”。在任何情况下,即使在 IE 中,您也只需要 $(something) 一次,之后就可以继续将其用作“something”。查看我的 document.getElementById("foo").method() 示例 - 您可以自己运行 $("foo"); 然后尝试 document.getElementById("foo").method() 再次 - 它也适用于 IE。
window.addEvent(); // is fine.
document.body.adopt(new Element("div")); // not fine in IE.
new Element("div").inject(document.body); // fine.
和他们自己:
$(document.body).adopt(new Element("div")); // fine.
document.body.adopt(new Element("span")); // now fine, after first $.
在 ie8 中查看:http://www.jsfiddle.net/AePzD/1/ - 第一次尝试设置背景失败,但第二次尝试成功。随后,document.body.methods() 调用将正常工作。
http://www.jsfiddle.net/AePzD/2/ - 这显示了元素($ 也返回)如何在 webkit/mozilla 中有方法,而不是在 trident 中。但是,用 $("foo") 替换它,它将开始工作。经验法则:$ 元素在应用方法之前不会动态创建。
毫无疑问,存储选择器是一个好的性能实践。但它也可以用许多变量填充您的作用域链,所以要小心。如果你将使用一个选择器两次或更多次,最好将它缓存起来。不这样做不是戏剧,如今像 sizzle 和 slick 这样的选择器引擎非常快,这无关紧要(除非您当时正在制作动画并且它会影响您的 FPS)。
至于绑定(bind),随你喜欢。
记住延迟有第二个参数,BIND:
(function(){
this.setStyle('background', 'blue');
}).delay(100, $("foo"));
所以做了不少功能。这个特定的绑定(bind)不是很有用,但在类里面,你可能想做
(function(){
this.element.setStyle('background', 'blue');
this.someMethod();
}).delay(100, this));
GC。当然,mootools 有自己的 GC。然而,.destroy 是一个很好的做法,imo。如果您不需要 DOM 中的某些内容,请使用 element.dispose()。如果您不再将它附加到 DOM,请使用 .destroy() - 删除所有子节点并清理。更多内存\o/
关于 IE 的建议...狡猾。如果可以的话,你可以使用 drip 来跟踪内存泄漏,像 dynatrace 这样的东西可以很好地进行分析。在实践方面......确保你不使用内联js,你总是清理你不需要的东西(事件,元素)并且通常要小心,特别是当你堆叠事件和处理ajax时(带来需要事件的新元素——考虑事件委托(delegate)……)。使用更少的 dom 节点 - 也有助于...
关于javascript - $(document.body) 和 document.body 是一样的吗?上课打扫垃圾和捆绑? - MooTools 1.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754461/
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。关于您编写的代码问题的问题必须在问题本身中描述具体问题—并且包括有效代码以重现它。参见SSCCE.org寻求指导。关闭8年前。Improvethisquestion我是Rails的新手。我正在制作一个网络应用程序,我在其中使用nokogiri搜索不同的网站以从中提取文本。所以在Gemfile中,我写了require'nokogiri'和'open-uri',但是当我捆绑安装时我得到这个错误:Couldnotfindgem'open-uri(>=0)ruby'inthegemsavailableon
我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
如果我说x.hello()在Java中,对象x正在“调用”它包含的方法。在Ruby中,对象x正在“接收”它包含的方法。这只是表达相同想法的不同术语,还是意识形态上的根本差异?来自Java,我发现Ruby的“接收器”想法非常令人困惑。也许有人可以解释这与Java的关系? 最佳答案 在您的示例中,x不调用hello()。包含该片段的任何对象都是“调用”(即,它是“调用者”)。在Java中,x可以称为接收者;它正在接收对hello()方法的调用。 关于java-Java中的"caller"和R
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
问题总结我想尝试使用Ruby来完成我在Python中所做的事情。在Python中它有r"""syntaxtosupportrawstrings,这很好,因为它允许将原始字符串与代码内联,并以更自然的方式连接它们,而无需特殊缩进。在Ruby中,当使用原始字符串时,必须使用其次是EOT在单独的行中,这会破坏代码布局。你可能会问,为什么不使用Ruby的%q{}?嗯,因为%q{}与Python的r"""相比有局限性因为它不会转义多个\\\并且只处理单个\.我正在动态生成Latex代码并写入一个文件,该文件稍后用pdflatex编译。Latex代码包含类似\\\的内容在许多地方。如果我使用Rub
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
使用facebook登录后,我被重定向到/#_=_,其中显示主页。这种垃圾也出现在其他URL中,例如当注册失败并被重定向到/users/sign_in#_=_为什么会发生这种情况,我该如何解决? 最佳答案 如果你真的不想要它,一些简单的javascript就可以了:if(window.location.hash=="#_=_"){window.location.hash="";} 关于ruby-on-rails-为什么Devise/Omniauth会向URL添加垃圾?,我们在StackO