我正在将JSF重型Web应用程序移动到REST并主要是JS模块应用程序.
我已经看过Nicholas Zakas在YUI影院播放的"可扩展的javascript应用程序架构"(精彩视频),我实施了大部分演讲并取得了很大的成功,但我有一些问题:
我发现这个讲座在模块和沙箱之间的关系方面有点混乱,一方面,根据我的理解,模块不应该受到沙盒之外发生的事情的影响,这就是他们通过沙箱发布事件的原因(而不是通过核心,因为核心是用于隐藏基础库)但应用程序中的每个模块都有一个新的沙箱?沙盒是否应该将事件限制为使用它的modoules,还是应该跨页面发布事件?例如:如果我有两个可编辑的表,但我想在不同的沙箱中包含每个表,并且它的事件只影响该沙箱中的模块,比如每个表的消息框,这是一个不同的模块/小部件,我该怎么做呢每个模块的沙箱,
虽然我可以隐藏基本库的小东西,如id选择器等.我仍然希望使用基础库的模块依赖和资源加载,并使用像YUI加载器或dojo.require之类的东西,所以实际上我隐藏了基础库但模块本身是由基础库定义和加载的......对我来说似乎有点奇怪.
库不会返回简单的js对象,但通常会将它们包装起来:例如:你可以做一些类似于$$('.classname')的东西.每个(...清理代码很多,包装底部然后在该模块通过执行.each为基础库创建依赖关系,但不使用这些功能会导致编写大量代码,而这些代码可能会被遗漏......并且实现该功能非常容易出错.
有没有人有建立这个订单的正面堆栈的经验?使用yui数据表但使用dojo进行表单验证更改基础库和/或从不同库中获取模块有多容易?
如果你选择像我说的那样做,并且通过YUI加载器加载dojo表单验证小部件,那么2 + 4的某种组合可能意味着dojocore是一个模块而表单模块依赖于它?
谢谢.
mouseMove事件用于在画布上移动,但我无法检测鼠标何时离开画布.
有没有选项可以检测鼠标何时移出画布?
如何阻止此Javascript函数执行.
我有一个导致严重问题的js函数,我无法删除或修改它的源代码.我想知道是否可以简单地阻止,停止或终止该功能,以便在我解决问题之前不执行该功能.
所以在页面内的某个地方:
<script type="text/javascript"><!--
problem_func();
//--></script>
Run Code Online (Sandbox Code Playgroud)
而我想要的是停止执行该功能,在头部或外部js内放置一个塞子.
有什么建议?
这是现场的例子,如何停止?http://jsbin.com/uxalag/3
可能重复:
如何在DOM节点上查找事件侦听器?
给定一个元素,让我们说a div,是否有可能获得绑定到元素触发的特定事件的处理程序列表?
/* pseudo code: click on a div handlers? */
document.getElementById('myDiv').getHandlers('click');
Run Code Online (Sandbox Code Playgroud)
编辑
好的,这里有更多细节.我想将一个单击处理程序绑定到div,除非另一个处理程序已绑定到div.我的想法如下:
/* pseudo code: click on a div handlers? */
if(!document.getElementById('myDiv').getHandlers('click'))
document.getElementById('myDiv').addEventListener('click', myEventhandler);
Run Code Online (Sandbox Code Playgroud) 在我们的应用程序奇怪的行为(使用strophe XMPP和jquery)之后,我们发现jquery事件循环是同步的并且不会捕获异常.
这意味着如果第一个事件处理程序引发异常,则永远不会调用第二个事件处理程序.
$(document).ready(function() {
$(document).bind('foo', onFoo);
$(document).bind('bar', onBar);
$(document).trigger('foo');
$(document).trigger('bar');
});
function onFoo(e) {
console.log('listener onFoo');
throw 'fail onFoo';
}
function onBar(e) {
console.log('listener onBar'); // not called
}
Run Code Online (Sandbox Code Playgroud)
我们期望看到两个输出,但第二个输出:"监听器onBar"从未显示过.
请参阅JQuery代码,在"触发器"函数中,处理程序循环期间没有try/catch模式.
while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
event.type = i > 1 ?
bubbleType :
special.bindType || type;
// jQuery handler
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
if ( handle ) {
handle.apply( cur, data …Run Code Online (Sandbox Code Playgroud) 我似乎无法找到解决这个问题,我在发布的评论这个问题 ......我用pace.js插件,我很想来加载我的网页/显示部分立即,而不必等待预加载加载所有内容.
我想通过简单地调用start事件并立即显示选择器来做到这一点.
但是,我似乎无法找到我的done事件被解雇的原因,但事实start并非如此.我也尝试过hide,但是stop或者restart不是.
$(window).load(function(){
Pace.on('start', function() {
alert('start') // not fired
});
Pace.on('done', function() {
alert('done') // fired!
});
});
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在动态地将事件添加addEvent("keydown", function() {});到元素中.我的问题是,有时候这个代码会在同一个元素上运行两次或更多次.由于为该事件注册的函数运行了几次,因此行为变得笨拙.
有没有办法让我只在元素上运行一次上面的代码?也许检查之前是否已添加事件?
感谢所有帮助的人.
我们正在使用promise lib Q,我们遇到以下问题. 从promise调用时,window.open()被浏览器阻止
我们尝试在promise机制开始之前打开窗口,这是有效的,但问题是当打开一个新选项卡(并获取focues)时,所有浏览器资源都引用新选项卡,逻辑仍然在导致性能不佳的第一个标签.
当承诺结束然后捕获此事件并打开新窗口时,还有其他方法可以处理此事件.
更新
它是什么意思"所有浏览器资源都引用了新标签"我们发现了有趣的行为:)我们在用户点击按钮时运行应用程序,在这种情况下我们打开新标签并将焦点更改为新选项卡我们正在等待应用程序启动,这需要大约15秒(直到应用程序实际运行).我们做了以下测试(这很有趣:))当我们点击运行应用程序并打开新选项卡时,我们立即点击返回第一个选项卡(有按钮),这样做的时间减少到4.5秒!!!! 似乎焦点改变了浏览器处理资源的方式.
IM寻找替代解决方案!
在Chrome的开发工具中,有一个可爱的界面,您可以在其中查看附加到给定DOM元素的所有事件侦听器,并根据您的需要删除其中任何一个.这是一个截图(为强调添加了箭头):
我想编写一个Chrome扩展程序,可以自动从任何网页中删除事件监听器(我正在尝试编写Chrome扩展程序以禁用任何试图强制它的网站上的平滑滚动 - 我想删除'轮'听众<body>是最直接的做法).是否有任何JavaScript API可用于从Chrome扩展程序访问和修改此事件侦听器列表,还是仅限于开发工具GUI?
要清楚,我知道removeEventListener(),但是该方法要求您具有对原始侦听器对象的引用 - 我没有这样的引用,因此该方法不适合我的目的.
我不确定我是否正确解释这一点,但在这里......
我有一个在JQuery中工作的函数,用于将选定的下拉值分配给变量,然后在单击确认按钮时将变量传递给HTML的不同部分.
这是HTML的精简版本
<p id="t1"></p>
<select id="selectLevel">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
</select>
<span class="btn" id="confirmLevel">Confirm</span>
Run Code Online (Sandbox Code Playgroud)
这是我使用的JQuery.
$(document).ready(function() {
$('#confirmLevel').click(function() {
var PClevel = $("#selectLevel option:selected").text();
$('#t1').append('Level ' + PClevel);
});
});
Run Code Online (Sandbox Code Playgroud)
问题是,如果我稍后尝试为其他函数调用PCLevel变量,则没有任何反应.我在这里错过了什么?或者最好完全跳过JQuery并使用Javascript来做同样的事情?
javascript variables jquery global-variables javascript-events