大家好.我看起来似乎是一个微不足道的问题.我有以下JavaScript:
$(function() {
var r = GetResults();
for(var i = 0; i < r.length; i++) {
// Do stuff with r
}
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
return data;
});
}
Run Code Online (Sandbox Code Playgroud)
由于我正在异步调用方法,脚本继续执行,当遇到for循环时,r显然不会有值.我的问题是:当我有一个正在进行异步操作的方法,并且我依赖于它在主块中返回的数据时,如何在数据返回之前暂停执行?就像是:
var r = GetResults(param, function() {
});
Run Code Online (Sandbox Code Playgroud)
其中函数是回调函数.我无法将for循环处理移动到JSON请求的回调函数中,因为我在整个页面中多次重用GetResults的功能,除非我想复制代码.有任何想法吗?
我想创建一个运行第三方脚本的页面,其中包括document.writeDOM已经完全加载后.
我的页面不是XHTML.我的问题是document.write覆盖了我自己的页面.(这是DOM加载后的功能).
我尝试覆盖document.write函数(以类似于http://ejohn.org/blog/xhtml-documentwrite-and-adsense/的方式),但不包括document.write包含部分标记的情况.
打破上述代码的一个例子是:
document.write("<"+"div");
document.write(">"+"Done here<"+"/");
document.write("div>");
Run Code Online (Sandbox Code Playgroud)
有没有办法通过JavaScript修改document.write插入点?有没有人有更好的想法如何做到这一点?
我正在使用这个http://fancybox.net/
有没有办法添加属性不显示右上角的关闭"X"按钮?我的意思是我可以使用'callbackOnShow'将它隐藏在hide()中,但这还不够快.我想要它不渲染而不是渲染然后隐藏.
如果用户查看我的JavaScript文件,复制函数的内容并使用AJAX向我的服务器发送请求,会发生什么?有没有办法正确防止这种情况发生?
正如在JavaScript 1.7的Mozilla changlog中可以看到的,他们已经添加了解构分配.可悲的是,我不是很喜欢这种语法(为什么要写a和b两次?):
var a, b;
[a, b] = f();
Run Code Online (Sandbox Code Playgroud)
这样的事情会好很多:
var [a, b] = f();
Run Code Online (Sandbox Code Playgroud)
这仍然是向后兼容的.类似Python的解构不会向后兼容.
无论如何,我能够想出的最好的JavaScript 1.5解决方案是:
function assign(array, map) {
var o = Object();
var i = 0;
$.each(map, function(e, _) {
o[e] = array[i++];
});
return o;
}
Run Code Online (Sandbox Code Playgroud)
其工作方式如下:
var array = [1,2];
var _ = assign[array, { var1: null, var2: null });
_.var1; // prints 1
_.var2; // prints 2
Run Code Online (Sandbox Code Playgroud)
但这真的很糟糕,因为_没有任何意义.它只是一个存储名称的空壳.但遗憾的是它需要因为JavaScript没有指针.在正面,您可以在值不匹配的情况下指定默认值.另请注意,此解决方案不会尝试切片阵列.所以你不能做类似的事情{first: 0, rest: 0}.但如果有人想要这种行为,那很容易做到.
什么是更好的解决方案?
如何在<div id="mydiv">...</div>使用javascript 之间插入一些HTML代码?
例如:<div id="mydiv"><span class="prego">Something</span></div>大约10行html.谢谢
我正试图把我的脑袋包裹起来(那里有一个笑话)我跑过去:
(function () { /* do cool stuff */ })();
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?将功能放入parens的目的是什么?之后为什么空荡荡的?
我有一个像这样的JavaScript对象:
[{
name : "soccer",
elems : [
{name : "FC Barcelona"},
{name : "Liverpool FC"}
]
},
{
name : "basketball",
elems : [
{name : "Dallas Mavericks"}
]
}]
Run Code Online (Sandbox Code Playgroud)
现在我想在浏览器中搜索这个JavaScript对象.搜索"FC"应该给我这样的东西:
[
{name : "FC Barcelona"},
{name : "Liverpool FC"}
]
Run Code Online (Sandbox Code Playgroud)
怎么这么快?这有没有JavaScript库?
我已经读过将几个多个javascript文件合并到一个文件中可以提高性能,这是真的吗?
如果是这样,是否有一种简单而无差错的方法来合并它们,或者可能是一个自动执行此操作的在线工具?
非常感谢.
我们使用存储过程在数据库中实现大多数业务规则.
我永远无法决定如何最好地将数据约束违规错误从数据库传递回用户界面.我所谈论的约束更多地依赖于业务规则而不是数据完整性.
例如,诸如"无法插入重复键行"之类的db错误与业务规则"您不能具有多个具有相同名称的Foo"相同.但是我们已经在最常识的位置"实现"了它:作为一个唯一的约束,当规则被违反时抛出异常.
其他规则,例如"你每天只允许100个Foos"不会导致错误,因为它们由自定义代码优雅地处理,例如return empty dataset应用程序代码检查并传递回ui层.
这就是问题所在.我们的ui代码看起来像这样(这是AJAX.NET webservices代码,但任何ajax框架都可以):
WebService.AddFoo("foo", onComplete, onError); // ajax call to web service
function onComplete(newFooId) {
if(!newFooId) {
alert('You reached your max number of Foos for the day')
return
}
// update ui as normal here
}
function onError(e) {
if(e.get_message().indexOf('duplicate key')) {
alert('A Foo with that name already exists');
return;
}
// REAL error handling code here
}
Run Code Online (Sandbox Code Playgroud)
(作为旁注:我注意到这是stackoverflow在您提交评论过快时所执行的操作:服务器生成HTTP 500响应并且ui捕获它.)
所以你看,我们在这里处理两个地方的业务规则违规,其中一个(即唯一的constaint错误)作为特殊情况处理,应该处理真正的错误(而不是违反业务规则),因为.NET将Exceptions一直传播到onError()处理程序.
这感觉不对.我认为我的选择是:
javascript ×8
jquery ×2
ajax ×1
closures ×1
dom ×1
fancybox ×1
html ×1
merge ×1
performance ×1
scope ×1
sql-server ×1
web-services ×1