我想再次使用 $("divid").load(...) 将包含自己脚本的页面加载到 div 中。我面临的问题与事件有关。假设我们从父页面触发(“猴子”),在加载的页面上我们绑定(bind)(“猴子”)并执行警报(“猴子绑定(bind)”)。如果多次调用相同的加载方法,则多次调用绑定(bind)。现在我可以在绑定(bind)之前取消绑定(bind),或者在绑定(bind)之前检查处理程序的数量然后不绑定(bind)它以防止这种情况发生。如果我以后想在另一个“子页面”(加载到 div 中的页面)中绑定(bind)到该触发器,这两个选项都不可扩展。
我理想情况下想要做的是检查我要添加的处理程序是否已经存在,但我仍然想使用匿名处理程序......(我认为最后一个请求有点多)。目前,我有一个解决方法,即使用预定义/命名方法,然后在绑定(bind)之前检查它。
// Found this on StackOverflow
function getFunctionName(fn)
{
var rgx = /^function\s+([^\(\s]+)/
var matches = rgx.exec(fn.toString());
return matches ? matches[1] : "(anonymous)"
}
function HandlerExists(triggerName, handlerName) {
exists = false;
if ($(document).data('events') !== undefined) {
var event = $(document).data('events')[triggerName];
if(event !== undefined)
{
$.each(event, function(i, handler) {
alert(handlerName);
if (getFunctionName(handler) == handlerName) {
exists = true;
}
});
}
}
return exists;
}
我觉得这是一种非常粗略的处理方法,但似乎有效。我只是在绑定(bind)之前执行以下操作,如下所示:
if (!HandlerExists("test", "theMethod")) {
$(document).bind("test", theMethod);
}
有没有人有更优雅的解决方案?例如,有什么方法可以检查特定脚本是否已加载?所以我可以使用 getScript() 在第一次加载时从子页面加载 js,然后在后续加载时简单地不加载它(并且只是触发一个将由他预先存在的 js 处理的触发器)。
最佳答案
使用 jQuery 的事件命名空间防止重复绑定(bind)
实际上有几种不同的方法可以防止重复。一个只是在解除绑定(bind)时传递原始处理程序,但如果它是一个副本并且不在内存中的同一空间中,它将不会解除绑定(bind),另一种流行的方法(使用 namespace )是实现此目的的更确定的方法。
这是事件的常见问题。因此,我将稍微解释一下 jQuery 事件和使用命名空间来防止重复绑定(bind)。
ANSWER:(简明扼要)
// bind handler normally
$('#myElement').bind('myEvent', myMainHandler);
// bind another using namespace
$('#myElement').bind('myEvent.myNamespace', myUniqueHandler);
// unbind the unique and rebind the unique
$('#myElement').unbind('myEvent.myNamespace').bind('myEvent.myNamespace', myUniqueHandler);
$('#myElement').bind('myEvent.myNamespace', myUniqueHandler);
// trigger event
$('#myElement').trigger('myEvent');
// output
myMainHandler() // fires once!
myUniqueHandler() // fires once!
答案示例:(完整详细解释)
首先让我们创建一个要绑定(bind)的示例元素。我们将使用 ID 为#button 的按钮。然后制作 3 个函数,它们可以并将用作处理程序以绑定(bind)到事件:
函数 exampleOne() 我们将通过单击进行绑定(bind)。 函数 exampleTwo() 我们将绑定(bind)到点击的命名空间。 函数 exampleThree() 我们将绑定(bind)到点击的命名空间,但多次解除绑定(bind)和绑定(bind)而不删除其他绑定(bind),这可以防止重复绑定(bind),同时不删除任何其他绑定(bind)方法。
示例开始:(创建要绑定(bind)的元素和一些方法作为我们的处理程序)
<button id="button">click me!</button>
// create the example methods for our handlers
function exampleOne(){ alert('One fired!'); }
function exampleTwo(){ alert('Two fired!'); }
function exampleThree(){ alert('Three fired!'); }
将exampleOne绑定(bind)到click:
$('#button').bind('click', exampleOne); // bind example one to "click"
现在,如果用户单击按钮或调用 $('#button').trigger('click'),您将收到警报“One Fired!”;
将 exampleTwo 绑定(bind)到 click 的命名空间:“名称是任意的,我们将使用 myNamespace2”
$('#button').bind('click.myNamespace2', exampleTwo);
这很酷的是,我们可以触发将触发 exampleOne() 和 exampleTwo() 的“click”,或者我们可以触发将仅触发 exampleTwo() 的“click.myNamespace2”
将 exampleThree 绑定(bind)到 click 的命名空间:“同样,名称是任意的,只要它与 exampleTwo 的命名空间不同,我们将使用 myNamespace3”
$('#button').bind('click.myNamespace3', exampleThree);
现在,如果“点击”get 被触发,所有三个示例方法都将被触发,或者我们可以针对特定的命名空间。
将它们放在一起以防止重复
如果我们继续像这样绑定(bind) exampleThree():
$('#button').bind('click.myNamespace3', exampleThree);
$('#button').bind('click.myNamespace3', exampleThree);
$('#button').bind('click.myNamespace3', exampleThree);
它们会被解雇三次,因为每次调用 bind 时都会将其添加到事件数组中。所以,真的很简单。只需在绑定(bind)之前解除该 namespace 的绑定(bind),如下所示:
$('#button').unbind('click.myNamespace3').bind('click.myNamespace3', exampleThree);
$('#button').bind('click.myNamespace3', exampleThree);
$('#button').unbind('click.myNamespace3').bind('click.myNamespace3', exampleThree);
$('#button').bind('click.myNamespace3', exampleThree);
$('#button').unbind('click.myNamespace3').bind('click.myNamespace3', exampleThree);
$('#button').bind('click.myNamespace3', exampleThree);
如果点击函数被触发,exampleOne()、exampleTwo() 和 exampleThree() 只会被触发一次。
将它们全部封装在一个简单的函数中:
var myClickBinding = function(jqEle, handler, namespace){
if(namespace == undefined){
jqEle.bind('click', handler);
}else{
jqEle.unbind('click.'+namespace).bind('click.'+namespace, handler);
}
}
总结:
jQuery 事件命名空间允许绑定(bind)到主事件,但也允许在不影响兄弟命名空间或父命名空间的情况下创建和清除子命名空间,以极少的创造性思维允许防止重复绑定(bind)。
关于JQuery 事件模型和防止重复处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180326/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss