我正在寻找一个在JavaScript中设置数据结构的体面实现.它应该能够支持纯JavaScript对象的元素.
到目前为止,我只找到了Closure Library的结构.但是我不喜欢它修改我的数据的事实.
我一直在开发jQuery插件已有一段时间了,我想我现在知道如何设计好一个.然而,有一个问题一直困扰着我,那就是如何以强大而优雅的方式处理私有功能.
我的插件通常看起来像这样:
(function($) {
$.fn.myplugin = function(...) {
...
// some shared functionality, for example:
this.css('background-color', 'green');
...
};
$.fn.mypluginAnotherPublicMethod = function(...) {
...
// some shared functionality, for example:
this.css('background-color', 'red');
...
};
}(jQuery));
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:如何巧妙地干掉共享功能?一个明显的解决方案是将它放在插件命名空间中的函数中:
var fill = function($obj, color) {
$obj.css('background-color', color);
};
Run Code Online (Sandbox Code Playgroud)
虽然这个解决方案很有效且命名很好,但我真的不喜欢它.原因很简单:我必须传递jQuery对象.即我必须这样称呼它:fill(this, 'red');,虽然我想这样称呼它:this.fill('red');
当然,我们可以达到这个结果简单地把fill成jQuery.fn.但这感觉非常不舒服.想象一下,在此基础上的方法和每个插件把这些"私人"功能,五成jQuery函数命名空间开发10个插件.它最终陷入了混乱.我们可以通过在前面的每一个与他们属于插件的名称,这些功能减少,但并没有真正使其更具吸引力.这些功能应该是私有的插件,所以我们不希望他们在所有的(直接至少不会)暴露于外界.
所以我的问题是:你们中是否有人有关于如何充分利用两个世界的建议.那是; 插件代码能够调用的方式类似"私人"的插件功能this.fill('red')(或者this.myplugin.fill('red')甚至this.myplugin().fill('red')等),同时防止jQuery函数命名空间的污染.当然它应该是轻量级的,因为这些私有函数可能会被频繁调用.
更新:感谢您的建议.
我特别喜欢David的定义一个包含'private'函数并包装jQuery对象的对象类型的想法.唯一的问题是它仍然不允许我链接"私人"和"公共"功能.这是想要this.fill('red')开始使用语法的重要原因.
我最终找到了一个我认为不是非常优雅的解决方案,但却吸引了"两全其美"的原因:
$.fn.chain = function(func) {
return func.apply(this, Array.prototype.slice.call(arguments, 1));
};
Run Code Online (Sandbox Code Playgroud)
这允许构造如:
this. …Run Code Online (Sandbox Code Playgroud) 查看按钮和锚点的代码示例:http://jsbin.com/ecitex/2/edit
我试图让它们在所有浏览器中都相同.但差异仍然存在,每个浏览器都有不同的差异(尝试过Chrome,Safari,Firefox,IE8).
我错过了哪些CSS规范化?
更新: 建议:
line-height: 50px(虽然我的用户代理(Chrome)默认line-height的button元素是normal,但它仍然垂直居中文本 - 如何?!)cursor: pointer了标准化鼠标光标.http://jsbin.com/ecitex/11/edit
那么,现在查看Firefox中的结果:注意按钮上的填充?然后在IE8中查看结果:哇,请注意两者是如何完全完全不同的?!
更新2:
似乎IE的问题是已知且无法解决的:http://www.quirksmode.org/css/tests/mozie_button2.html
我没有在Firefox的填充上找到任何东西.(quirksmode文章提到了Mozilla的问题,但这是一个不同的问题.)
更新3:
太棒了,我们修复了Firefox问题:http://jsbin.com/ecitex/15/edit
好的,到目前为止,每个答案都提供了解决方案的一部分,所以没有一个单一的最佳答案.我将给予以下人员最佳答案:
line-height: 50px垂直居中的文本中指定一个到垂直居中的文本a,而一个button只有一个垂直居中的文本line-height: normal.我正在寻找一个可以使函数递归的Python装饰器.我发现自己写了很多这样的函数:
def xyz(data):
if not isinstance(data, TypeThatDenotesSingularity):
return map(xyz, data)
return singular_xyz(data)
Run Code Online (Sandbox Code Playgroud)
我认为那里必须有一个装饰器(在标准库中?)可以减少一点点的符号:
@recursive(TypeThatDenotesSingularity)
def xyz(data):
return singular_xyz(data)
Run Code Online (Sandbox Code Playgroud)
我一直在寻找,但我似乎无法到达任何地方.也许我错过了一些必要的术语?
谢谢你指点我正确的方向!
我\xe2\x80\x99m 与 JavaScript\xe2\x80\x99s提出的新 Temporal API作斗争。我想做的事情应该是直截了当的,但我未能找到令人信服的解决方案。我肯定错过了什么。
\n任务如下:根据年、月、日、小时和分钟变量实例化 UTC 日期时间的对象表示。
\n我的想法如下:
\nTemporal.Instant;new Temporal.Instant()需要以纳秒为单位的时间戳,因此 \xe2\x80\x99 不起作用;Temporal.Instant.from()需要一个 ISO 日期时间字符串,这需要我从 \xe2\x80\x94 的五个变量生成格式正确的文本,这是可能的,但有点黑客攻击,有点违背了使用日期时间库的目的;Temporal.PlainDateTime.from(){ year, month, day, hour, minute }具有正确的设计,因为它接受像;这样的对象Instant从中创建一个PlainDateTime. 但这似乎不可能?除了再次通过 \xe2\x80\x94 \xe2\x80\x94 ns\xe2\x80\xa6 中的日期时间字符串或时间戳?这太愚蠢了!这里的用例是非常基本的,但它\xe2\x80\x99(对我来说)根本不明显如何解决它。
\n我期望能够简单地做类似的事情: Temporal.Instant.from({ year, month, day, hour, minute });
现在我能想到的最好的办法是:Temporal.Instant.from(year + \'-\' + String(month).padStart(2, \'0\') + \'-\' + String(day).padStart(2, \'0\') …
在HTML / CSS中,可以通过以下方式指定字体大小(不建议使用,但所有浏览器都支持):
<font size="n">text</font>
Run Code Online (Sandbox Code Playgroud)
带有n的元素{1, 2, 3, 4, 5, 6, 7}。
另一种可能性是:
<span style="font-size: s;">text</span>
Run Code Online (Sandbox Code Playgroud)
带有s的元素{xx-small, x-small, small, medium, large, x-large, xx-large}。
两个范围之间是否有实际关系?我认为它们具有相同的大小,因为它们具有七个元素,但事实并非如此。
假设我们有一个模块m:
var = None
def get_var():
return var
def set_var(v):
var = v
Run Code Online (Sandbox Code Playgroud)
这将无法按预期工作,因为set_var()不会存储v在模块范围内var.它将创建一个局部变量var.
所以我需要一种m从内部引用模块的方法set_var(),它本身就是模块的成员m.我该怎么做?
考虑以下Bacon.js代码示例(松散地基于此处的代码,使用bacon.model和bacon.jquery):
<input id="total" type="text" placeholder="total">
/
<input id="quantity" type="text" placeholder="quantity" value="1">
=
<span id="price"></span>
<script>
var $total = Bacon.$.textFieldValue($("#total")).changes();
var quantity = Bacon.$.textFieldValue($("#quantity"));
var price = Bacon.when(
[$total, quantity], function(x,y) { return x/y; }
).toProperty(0);
price.onValue(function (p) {
$('#price').text(p);
});
</script>
Run Code Online (Sandbox Code Playgroud)
这里发生的是流$total和属性quantity被连接到一个属性price.双方$total并quantity得到一个文本输入字段输入自己的,但只$total提示price进行更新.(即已quantity采样但不是同步模式的一部分.)
我试图用RxJS而不是Bacon.js来实现同样的行为,但我能想到的只是超级丑陋的解决方案.我估计我必须忽视一些东西......?
我到目前为止最好的拍摄(行为不一样,但你明白了):
var totalChange = Rx.Observable.fromEvent($('#total'), 'input');
var totalValue = totalChange.map(function () {
return parseInt($('#total').val(), 10); …Run Code Online (Sandbox Code Playgroud) 提议的 JavaScript Temporal 日期/时间 API 不经意地提到 \xe2\x80\x9c 解释年、月或周需要参考点 \xe2\x80\x9d (来源),但我无法理解这是什么意思。
\n更具体地说,以下情况是不可能的:
\nlet oneWeek = Temporal.Duration.from({ weeks: 1 });\nconsole.log(`one week is ${oneWeek.total(\'day\')} days`);\nRun Code Online (Sandbox Code Playgroud)\n它将导致以下错误:
\nRangeError: a starting point is required for balancing calendar units\nRun Code Online (Sandbox Code Playgroud)\n这可以通过使用relativeTo调用参数来膨胀我的代码来解决total(),如下所示:
RangeError: a starting point is required for balancing calendar units\nRun Code Online (Sandbox Code Playgroud)\n但有人能详细说明为什么这是必要的吗?据我所知,一周一直是并且永远是 7 天\xe2\x80\xa6?
\n