我想构建一个可以在单个页面上有多个实例的 jQuery 应用程序。
但是,我遇到了一个实例从其他实例接收事件的问题。例如,如果我有以下事件:
$('#start_btn').click(...)
如果单击页面上的任何#start_btn,则所有实例都会启动。
那么,如何设计代码以使每个实例只与自己的 HTML 代码中的元素交互?
更新 - 如果您在这里遇到相同类型的问题;我发现这是错误的方法。jQuery插件设计是最好的方法。
我想构建一个可以在单个页面上有多个实例的 jQuery 应用程序。
但是,我遇到了一个实例从其他实例接收事件的问题。例如,如果我有以下事件:
$('#start_btn').click(...)
如果单击页面上的任何#start_btn,则所有实例都会启动。
那么,如何设计代码以使每个实例只与自己的 HTML 代码中的元素交互?
更新 - 如果您在这里遇到相同类型的问题;我发现这是错误的方法。jQuery插件设计是最好的方法。
你永远不应该在同一页面上有两个具有相同 ID 的控件。如果您想要完全分离的页面,您可能希望将每个应用程序放在自己的 IFRAME 中,并具有自己的完整上下文,然后它们将被完全隔离。
我想这取决于这些东西究竟做了什么,以及一切有多大和有多复杂。
每个文档的 ID 都是唯一的。不要使用它们。相反,使用通用类属性来识别这些实例中的单个应用程序和类(再次)也指向应用程序的特定部分。
示例 HTML:
<div class="app">
<a class="start-button" href="#">button1</a>
</div>
<div class="app">
<a class="start-button" href="#">button2</a>
</div>
假设上述情况,您现在可以确定单击开始按钮的应用程序:
$('.start-button').click(function(event) {
var app = $(event.target).closest('.app');
// Do stuff
});
现在,如果你想在那个特定的应用程序中做一些事情,你可以使用app
或其他一些顶级引用来将更改只保留在那个应用程序中。
例如,单击时隐藏按钮:
$(app, '.start-button').hide();
有关完整运行示例,请参阅此 Fiddle:http: //jsfiddle.net/8Xtue/2/
我在这里介绍的是 JavaScript 应用程序框架的简单基础。如果这是您编写应用程序的风格,您可能需要考虑一些现成的框架,例如 AngularJS ( http://angularjs.org/ ),它已经为您提供了一个非常周到的框架来处理这种可嵌入的 JavaScript应用程序。
您可以命名您的控件。
如果您发布页面的代码,我可以更新此答案,但这可能看起来像
<div id="page1">
<button class=".startBtn">
</div>
<div id="page2">
<button class=".startBtn">
</div>
然后在jquery中
$("#page1 > .startBtn").click()
$("#page2 > .startBtn").click()
或者,如果他们不是直接父母子女
$(".startBtn", "#page1").click()
$(".startBtn", "#page2").click()
这里有一些文档:http: //api.jquery.com/child-selector/
注意:我将 startBtn 更改为类而不是 ID,因为我们通常希望避免在 DOM 中出现重复的 ID。